アクセス非連結フォームのテキストボックスの制御

このQ&Aのポイント
  • Access2007、win7で前任者が作ったものを元に類似のシステムを作ることとなりました。
  • その中にあるフォームで条件を設定するテキストボックスのコントロールソースプロパティが空白であるにも関わらず、数字以外の値を入力すると正しくない値のメッセージが表示され、誤った入力を受け付けないという現象が発生しています。
  • 前任者に直接聞くことができないため、この謎を解明する方法を知りたいです。
回答を見る
  • ベストアンサー

アクセス非連結フォームのテキストボックスの制御

いつも楽しく勉強させていただいております。 Access2007、win7で前任者が作ったものを元に類似のシステムを作ることとなりました。 その中にあるフォームで私にとってよくわからないものがあります。 そのシステムとは検索条件を入力し、条件に一致したレコードを表示するというものです。 条件を設定するフォームはレコードソースプロパティは空白、つまり非連結のフォームです。 したがって検索条件を入力するテキストボックスのコントロールソースプロパティも空白です。 こういった場合「入力する値は数字だけに限定」といった制御をするなら、入力規則プロパティを設定するか、更新前のイベントでコードを書くかするものだと思っていました。 ところがこのフォームにはそれらしき設定がまるでないのです。 それなのに数字以外の値、たとえば"a"などを入力すると 「このフィールドに入力した値が正しくありません。たとえば、数値型のフィールドに文字列を入力しました。」というメッセージをちゃんと表示し、誤った入力を受け付けません。 どなたかこの謎を解明してくださるとうれしいのですが。 前任者に直接聞けるといいのですが、その人は派遣社員でして契約終了後は連絡が取れないのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.1

「書式」プロパティに 数値を表す書式 (例えば 「#,##0」 など) が 設定されているのでは?

meglin888
質問者

お礼

m3_makiさん、さっそく回答いただいたのに金曜の夕方から調子を崩し、週末は風邪で寝込んでいました。 申し訳ありません。 書式プロパティの設定を見たところ、[標準]になっていました。 別のフォームを作ってテキストボックスを二つ貼り付けました。 ひとつは書式プロパティがなしのまま、もう一つは[標準]にしてみましたが、 後者は数値しか受け付けないことがわかりました。 おっしゃる通り書式プロパティが効いていたようです。

その他の回答 (2)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

No.2です。 m3_makiさんのご回答で解決されたとのことなので、今後のご参考に、ということで。 > チェックのロジックを共通化できるのがメリットということですか。 はい、前任者の方にそういう意図があった可能性を推測しての回答でした。 例えば、テーブルの各フィールドに入力するデータを非連結フォームで 一旦受けた上で、コマンドボタンのクリックなどでテーブルに反映、という 形を採る場合、フォームモジュールで対応すると、テーブル/フォームが 異なる場合は、また同様のコードを記述することになると思います。 ここで、例えば  a)記録先の各フィールドに一対一で対応するクラス   →DataAccessObject(DAO)のFieldオブジェクトを経由して     『データ型』や『入力規則』『値要求』などを取得するとともに、    当該フィールドに対応するコントロールの更新時(→WithEvents    使用)に、それに相当するチェックを実行  b)記録先となるテーブル/クエリに対応するクラス   →上記「a」のクラスを格納するコレクションを定義しておき、記録先    のフィールドに対応する上記「a」のクラス群を保持    (フィールド名とコントロール名を引数とするメソッドを用意しておき、    同メソッドで「a」クラスのインスタンスを生成し、コレクションに追加) という2つのクラスを定義しておけば、当該フォームのOpenイベント等で  ・上記「b」クラスのインスタンスを格納する変数の定義  ・上記「b」クラスのインスタンスの生成  ・上記「a」クラスのインスタンスを生成し、コレクションに追加するメソッド   の呼出(Split関数と「For Next」ステートメントを使用) というコードを記述するだけで、「テーブルのフィールドに定義された各種 プロパティへのチェック」を、フォーム毎に個別にコーディングする手間が 省ける、ということです。 (更にクラスの定義に凝れば、テーブルの『入力規則』では対応できない  「ユーザー定義関数による入力規則の定義」なども行えるかと  思います:  但し、この部分は各フォームのOpenイベント等での個別コーディングが  発生することになります) ・・・と、長々と書きましたが、私自身ではまだこれに相当するクラスを 作成したことはありませんので(汗)、細部に間違いがありましたら ご容赦願います。 あくまで、イメージということで・・・(汗)

meglin888
質問者

お礼

DexMachinaさん 詳しい説明をありがとうございます。 オブジェクト指向の技法を本格的には使用したことがないのですが、 イメージ的にはなんとなくわかります。 コントロールの多い複雑なフォームを作るときにきっと役に立ちそうです。 教えていただいたリンク先も参考にもっと勉強してみたいと思います。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

m3_makiさんが提示されている設定以外での可能性として、 a)フォームの『開くとき』(Open)イベントで、フォームの『レコードソース』プロパティや  コントロールの『コントロールソース』プロパティを設定している  (レコードソースにはテーブル/クエリの他、SQL文も指定できるため、例えば   抽出条件に併せて適切なSQL文を動的に生成したり、データ保護のために   テーブルを別のMDBファイルに保存した上で(リンクテーブルではなく)SQL文で   接続をしたり、といった場合、上記のようなことをします) b)データ型のチェックを行うクラスを『クラスモジュール』に定義し、各コントロールの  データ編集時にはそちらでチェックを行わせている  (クラスモジュール上で「Private WithEvents objTB As TextBox」という記述と   「Private Sub objTB_AfterUpdate ~ End Sub」という記述をしておいた上で、   「Set objTB = Forms("フォーム1").テキスト0」とすることで、「フォーム1」の   「テキスト0」が更新された場合、クラスモジュール側で記述した処理を行う   ことができます)  イメージとしての参考:  http://www.excellenceweb.net/vba/class/userform_hook.html も、参考として挙げておきます。 (ただ、メッセージの内容がAccessの組み込みのままっぽいので、「b」の可能性は  低いかとは思いますが(汗))

meglin888
質問者

お礼

DexMachinaさん、回答ありがとうございます。 結果から言うと今回はm3_makiさんのおっしゃるとおり書式プロパティの設定でした。 まさか[標準]が数値しか受け付けないということだとは思わなかったので、何かよほど高度なテクニックかと勘違いしてしまいました。 いろいろ詳しく説明してくださってありがとうございます。 ひとつ教えていただきたいのですが、「データ型のチェックを行うクラスを『クラスモジュール』に定義し、各コントロールのデータ編集時にはそちらでチェックを行わせている」といった方法は、各コントロールの[更新前]でチェックするのとどう違うのでしょう。 チェックのロジックを共通化できるのがメリットということですか。

関連するQ&A

  • アクセスのフォーム上のテキストボックスについて

    アクセスのフォーム上のテキストボックスについて フォーム上のテキストボックスに直接数字を入力しようとしています。ただ、このテキストボックスのコントロールソースはフォームのレコードソースと違うものです。 この状況でテキストボックスに数値を直接入力しようとすると、『コントロールソースに連結しているので、編集できません。』と表示され、入力出来ません。 どうすれば、解決できるのかご存知の方、教えて下さい。宜しくお願いします。

  • アクセスフォームで2つを結合テキストボックス

    アクセス2000を使っています。 フォームで2つのテキストボックスの内容を並べて表示するテキストボックスを作成するには、どのようにコントロールソースに入力したら良いでしょうか? =[フィールド名]&[フィールド名] ではErrorやName?、「-1」などが表示されてしまいました。 (&の前後に半角空白を入れたりしました。) よろしくお願いいたします。

  • Access の非連結テキストボックスについて

    Access 2000 を使用しています。 フィールド名 データ型 Code     テキスト型(フィールドサイズ=8) Name     テキスト型(フィールドサイズ=50) というテーブルがあり、このテーブルを元に帳票フォームを作成しました。このフォームは参照用として使用したいので、 AllowEdits/更新の許可 AllowDeletions/削除の許可 AllowAdditions/追加の許可 のプロパティは全て「いいえ」にしてあります。 このフォームのフッタ部分に txtFilter というテキストボックスと cmdFilter というコマンドボタンを置き、フィルターの動作をさせるため、 Private Sub cmdFilter_Click()   If IsNull(txtFilter.Value) Then     FilterOn = False   Else     Filter = "Code LIKE """ & txtFilter.Value & "*"""     FilterOn = True   End If End Sub としました。(見やすくするため全角空白を使用しています。) さらに、txtFilter に 8文字 ( Code フィールドのフィールドサイズ ) 以上は入力できないようにしようと思い、 Private Sub txtFilter_KeyPress(KeyAscii As Integer)   If KeyAscii <> 8 Then     'Delete 以外の場合     If Len(txtFilter.Text) = 8 Then       KeyAscii = 0     End If   End If End Sub としましたが、ここで問題が起きました。 ・FilterOn = False あるいは、 ・FilterOn = True でも何レコードが表示されている状態(該当レコードが存在する文字が txtFilter に入力されている) という場合は良いのですが、該当レコードが存在しない場合、 txtFilter に入力されている文字を変更しようとすると、 txtFilter_KeyPress() 中の If Len(txtFilter.Text) = 8 Then のところで「実行時エラー'2185' コントロールがフォーカスを取得していないときに、コントロールのプロパティまたはメソッドを参照することはできません。」となってしまいます。 入力中のコントロールですから、「そんな馬鹿な!?」という感じなんですが、 If Len(txtFilter.Text) = 8 Then の前に txtFilter.SetFocus を入れても状況は同じでした。 フォームの「AllowAdditions/追加の許可」プロパティを「はい」にすれば、上記のようなエラーは発生しないのですが(なぜ、「AllowAdditions/追加の許可」プロパティの違いでそのようなことになるのかは理解できませんが)、ユーザーにデータの変更や追加、削除はさせたくないテーブルなので、追加を許すわけにもいきません。 何かいい回避方法はありませんでしょうか。 よろしくお願いします。

  • Access 連結フィールド値を自動で表示

    Accessでフォーム上にサブフォーム(データシート)を作成すると、 新規レコード欄にも自動的に連結フィールドの値が表示されます。 このサブフォームをメインフォーム上に作らずに、 コマンドボタンクリック時にあるフィールドが一致する(上記で言う連結フィールド)データを表示したサブフォーム(データシート)を開くかたちにしたいのですが、そうすると当然ながら新規レコード欄には連結フィールドの値は表示されません。 これをメインフォーム上にサブフォームを作った時と同じように、新規レコード欄に連結フィールド値を表示させるにはどうしたら良いでしょうか? サブフォームを開く段階で新規レコードに結合フィールドの値を(VBAで)入力する事も考えましたが、そうするともしそこにデータを入れるつもりじゃなくても1つのレコードとしてデータが残ってしまいます。 メインフォーム上に作ったサブフォームなら、新規レコードに結合フィールドの値は表示されているものの、その他のフィールドにデータを入力しなければ1つのレコードとしてデータが残ることはありません。 こういう事が可能かどうかわかりませんが、ご存知でしたら教えてくださいませ。 よろしくお願いします!

  • フォームのプロパティを設定したい(Access2000)

    Access2000 XPです。 都道府県名が1レコードに1つずつ入っているテーブルと 各都道府県名のテーブルが47コあります。 新規でフォームを作成し(フォームのレコードソースはまだ未設定) コンボボックスを1つ置いて、値集合ソースに都道府県テーブルを設定し コンボボックスで選ばれた都道府県にフォームのレコードソースを変更しようと思っています。 Me.RecordSource=コンボボックス.text 単純にこれで良いと思うのですがエラー(入力された値は、フィールド又はコントロールで定義されている入力規則に従っていません)が出て全然更新されません。 どなたか分かる方、解決法をお願いします。。。

  • access2007 フォームについて

    フォームで「グループ化の設定」はできるのでしょうか? 初心者ですが、よろしくお願いします。 例)テーブル(レコードソース) フィールド1 ,フィールド2 日本     ,ハンバーグ 日本     ,お好み焼き 日本     ,(Null ) アメリカ   ,スパゲッティ アメリカ   ,ハンバーグ アメリカ   ,ビール フランス   ,(Null ) フランス   ,(Null ) フランス   ,(Null ) ※フィールド1は必ず3レコードあると想定しまして、、 ↓ フォーム(1レコード目) 日本   ハンバーグ      お好み焼き      (Null ) フォーム(2レコード目) アメリカ スパゲッティ      ハンバーグ      ビール フォーム(3レコード目) フランス (Null )      (Null )      (Null ) ※Null 値に対し、レコードの更新を行いたく、また、実際にはフィールド1が30レコードずつあるため、グループ化設定を行い効率的なフォームを作りたいのですが、、、 分かりにくいかもしれませんが、ご教示下さい。

  • フォームのテキストにテーブルの合計額を表示したい

    「T合計」テーブルの「数字」フィールドにいくつかのレコードに数字が入力されています。 このT合計の合計額をフォームのテキストボックスに表示させたいのですがうまくできません。 クエリ1を作成し、式1: Sum(T合計!数字)としたらうまく表示できました。 フォームのテキスト0のプロパティの「コントロールソース」に「=クエリ1!式1」としたら「#Name?」になってしまいます。 また、「コントロールソース」に「=Sum([T合計]![数字])」といれたら「#エラー」になってしまいます。 そもそも「コントロールソース」に入力することが間違えなのでしょうか? どうすればテキストボックスにT合計の合計額を表示することができるのでしょう? よろしくお願い致します。

  • ACCESS2000のコンボボックスについて

    OS:WindowsXP AP:ACCESS2000 テーブルと連結で帳票フォームを作成しています。 フォームヘッダー : 検索用のテキストボックス、コンボボックス、ラジオボタン等配置           (非連結オブジェクト) 詳細 : 上記検索条件の値に合致したものを抽出し一覧表示 フォームプロパティ : 更新の許可「はい」、削除の許可「はい」、追加の許可「はい」             レコードセット「スナップショット」 フォームヘッダーにて検索条件を入力し、検索を行います。 該当レコードがなしの結果となった場合にそのままの状態で フォームヘッダーの検索条件に入っている値をクリアし フォームヘッダーのコンボボックスにて値を選択すると値の表示が消えてしまいます。 消えているのは表示のみのようで検索ボタン押下で抽出を行うと該当レコードが抽出されます。 この表示を正常にさせるようにするにはどうしたらよいでしょうか? RequeryやRepaintをコードに追加したのですがうまくいきません。 他のサイトでも検索をかけたのですが今のところ該当するような記事に辿り着けていません。 正常動作が確認できているのは下記のパターンの時となります。 ・フォームプロパティにてレコードセットがダイナセット、追加の許可がはいの場合  (更新の許可、削除の許可は「はい」でも「いいえ」でもどちらでもOK)  ※運用上、一覧参照画面としたいので追加の許可は「いいえ」としたいですが「いいえ」の場合はNGでした ・レコードカウントが1件以上の場合 解決方法を知っていらっしゃる方いらっしゃいますでしょうか? 宜しくお願い致します。

  • Access フォーム上でのテキストボックスとテーブルの連結

    フォームヴィザードからフォームを作成すると、 テキストボックスと指定したテーブルを連結させることができるのですが、デザインビューでそれをするときに、テキストボックスのプロパティのコントロールソースにテーブル名を入れれば連結できるのかと思いきや、うまく表示されません。どこを設定すればテキストボックスとテーブルを連結できるのでしょうか?

  • ACCESSのフォームで、あるテーブルのフィールドが特定の数字で始まる場合に”1”を入力したい。

    一覧フォームのフィールドで、表示されていないテーブルのフィールドが、特定の数字から始まるレコードが入力されている場合に、その一覧のフィールドに”1”を入力させたいのですが、やりかたがわかりません。 その一覧フォームが開くときのマクロで、値の代入などやってみましたが全然できません。 考え方が全く思い浮かばずにいます。 ちょっと説明が分かりにくいかと思いますが、その際は補足説明しますのでお願いいたします。