Access コンボボックスの値が変わらない

あるコンボボックスから、値を変えて、その値によって、コンボボックスの中身が変わる仕組みを作成したが、前の情報がリフレッシュされなくて、コンボボックスの内容が変わらない。

Me.Recalc
Me.Refresh

VBAに最初に変化をさせいたコンボボックスに上記をいれたら解決した。

Access コンボボックスにてリスト外入力

コンボボックスにて、リスト外のデータを手打ちで入力しようとすると、指定した項目はリストにありませんとメッセージがでて入力ができない。

そこを、無理やり入力できるようにするには、

プロパティから、入力チェックを「いいえ」にするだけ。

ちなみに、値リスト編集の許可っていうプロパティは、コンボボックスに直接値リストを設定知る場合は、直接フォームから編集できるモードのようだ。

Access コンボボックスの編集ブロック

リストに表示されているものは選択できるが、それ以外のものを入力することができないようにする方法。
コンボボックスの[入力チェック]プロパティを「はい」にし、[値リストの編集の許可]プロパティを「いいえ」にする。これらのプロパティは、[データ]タグの中。

こうすることで、リストにない値を入力した場合には、エラーメッセージが表示され、入力を拒否され、再度選択リストが表示させる。

Access columnの注意

あるマスターテーブルデータをコンボボックスから選択して、抽出したデータを、別のフィールドに自動で入力したいケースがある。その時に便利なのが、column関数なのだが、ちょっと注意点がある。これで結構はまったので記載しておく。

コンボボックスで選択したものが、思ったように他のテキストボックスに入力されない。

コンボボックスのプロパティの集合体ソースで表示する順番や表示非表示を選択できる。その場合
サービス名 売価 支払種別    という順番にしたと仮定する。

連結列を3種選択したので、3にした。

コンボボックスで、表示させたいのは、サービス名(入力もしたい)と売価なので、列数2に設定して、列幅を3.5cm;2cmにした。
無事に、コンボボックスを選択すると、2列で表示されて選択できる。しかし、サービス名に入力されるデータがおかしい。

Private Sub サービス名_AfterUpdate()
With Me!サービス名
Me!料金 = .Column(1)
Me!支払種別 = .Column(2)
End With
End Sub

コンボボックスで選択されると料金や支払種別も自動で入るはずだが、おかしな状態になっている。

結局連結列の問題だった。それを1にして解決!!!
ついてに、しらべてみたら、下記のような時に使うらしい。な~~~るほど。

コンボボックスで使うテーブルなどで、

1 男性
2 女性

なんていう場合がある。それをコンボボックスで表示させて、選択すると、男性と入れたかったのに、数字の1が入力sだれている時がある。いろいろと列幅とか、列数などを調整して男性を出したにも係わらず、そして人間がみえている表示は、男性とでているのに、テーブルには、数字の1となっている。いままで不思議にも思っていましたが、ないがしろに。

つまり、その時は、連結列2に設定してあげれば、男性というように、人間が分かるデータが入力されるらしい。

使う機会があったら使ってみたい。

Access 帳票フォームに複数段コンボボックス設置

この前回の2段のコンボボックスでの選択抽出方法を記載したが、帳票フォームだと2段目の選択をすると、すべてが同じ表示になってします。テーブル自体は書き換えられてないようだが、見栄え的に気分悪い。一瞬、全部書き換えられたかと錯覚してしまう。

その対策と方法を記載する。

2段目のコンボボックスに対象のフィールドのテキストボックスを重ねるだけ。

2016-02-20_13h07_14

つまり、原理としては、テーブルは書き換えられてない訳だから、表示だけはテーブルを内容をみせるという手法のようだ。帳票フォームだと選択時にすべてのコンボボックスが同じ表示になってしまうという仕様のようだ。

それから、いきなり2段目を変更したいという時がある。順番てきには、1段目を更新すれば、

Private Sub カテゴリ_AfterUpdate()
Me!サービス名.Requery
End Sub

が働いて、抽出されたデータが2段目に表示される。しかし、いきなり2段目をコンボボックスで変更したときに、違うフィールドの条件を引継いていて不具合になる。なので、2段目にフォーカスが当たった時にもリクエリをかけることで回避した。

Private Sub サービス名_GotFocus()
Me!サービス名.Requery
End Sub

Access 1番目コンボボックスから、2段目のコンボボックス抽出

アクセスを使っていると、結構この手法を使う時がある。

最初のコンボボックスで、カテゴリを選択すると、そのカテゴリから、第二のコンボボックス表示を抽出し表示させたい。

例題として、最初のコンボボックスを、カテゴリという名前に、次のコンボボックスの名前を、商品名とします。入力時のマスターデータとして下記のようなテーブルがあるとします。

ID カテゴリ 商品名

(1)フォームに2つのコンボボックスを設置して、コントロールに選択したデータをいれたいテーブルのフィールド名を選択します。
※もしくは、テーブル時点から、ルックアップウイザード等でコンボ形式になっている場合は、最初からフォームでもコンボボックスになっているので、コントロールの設定は必要ありません。今回は、非連結のコンボボックスを設置してから、テーブルのコントロールと紐づけした例を記載した。

(2)値集合ソースを選択して、そのコンボボックスに表示したいカテゴリのテーブルをクエリーにかけて表示できるようにします。
※並び替え等をやる事も、このクエリー段階で設定しておきます。

(3)商品名というコンボボックスを(1)の様にして設定します。
※(2)の手順で表示させたい値のテーブルのクエリーにて設定します。その時に、フォームのカテゴリの値により、商品名が抽出できるようにします。

[Forms]![商品選択画面]![カテゴリ]

(4)カテゴリのコンボボックスを選択後、商品名が抽出選択になるように、更新後処理として、VBAを設定しておきます。

Private Sub カテゴリ_AfterUpdate()

Me!商品名.Requery

End Sub

以上の設定で、最初のコンボボックスで選択したカテゴリ内の、商品名しか、次のコンボボックスには出なくなります。

Access 非連結窓に抽出表示

コード [コンボボックス] [商品詳細] [商品値段]

商品テーブルから、コンボボックスで、商品コードを選択すると、非連結の商品詳細と商品値段に表示をさせたい場合。

Private Sub コード_AfterUpdate()

With Me!コード
‘コンボボックスの2列目を得意先名テキストボックスに代入
Me!商品詳細 = .Column(1)
‘コンボボックスの3列目を得意先名テキストボックスに代入
Me!商品値段 = .Column(2)
End With
End Sub

ただ単に、非連結窓にデータを表示させたいときは便利だ。
ルックアップウイザードなどで、設定すると、番号だけが、表示されて中身が分からない場合などには、使える機能だ。