プロが教える店舗&オフィスのセキュリティ対策術

Accessのサブファームにある、コンボボックスの値をチェックしたいので、下記のようにしてみました。

Dim ctl As Control

For Each ctl In Me.Controls
If ctl.ControlType = acSubform Then
msgbox Forms!メインフォーム名!サブフォームコントロール名.Form!コントロール名
End If
Next

すると、サブフォームの現在選択しているコンボボックスの値しか表示されません。

現在表示されているサブフォームのコンボボックスの値すべてを表示させるにはどうすればいいのでしょうか。よろしくお願います。

A 回答 (10件)

たとえば、親フォームにボタンを設定して、


そのボタンのクリックイベントで、


Private Sub コマンド0_Click()
Dim ctl As Object
Dim i As Long

For Each ctl In Me!埋め込み0.Form.Controls
  If TypeOf ctl Is ComboBox Then
    If ctl.Name = "コンボ1" Then
      For i = 0 To ctl.ListCount - 1
        MsgBox ctl.ItemData(i)
      Next i
    End If
  End If
Next ctl
End Sub


コンボボックスの値を参照するには、

      For i = 0 To ctl.ListCount - 1
        MsgBox ctl.ItemData(i)
      Next i

のような、書式で参照します。
    • good
    • 0
この回答へのお礼

詳しい説明をありがとうございます。

私の予想では、例に挙げたプログラムの一部分を修正するだけで目的が達成できると思っていました。
なぜなら、「サブフォーム 値 チェック」で調べると、例のようなプログラムしか見つからなかったからです。

しかし、回答は予想とは違うのでかなり戸惑っています。

そしてよくわからないのが、「ctl.ListCount - 1」の部分です。
「ListCount」を調べてみると、「表示している各行の値」となっています。

この例を試すと、1つのコンボの選択肢すべての値が表示されるような気がするのですが違うのでしょうか。

実際に試してみればわかるのですが、まだよくわかっていないので、自分の環境に置き換えて試すことが出来ません。


また、先ほども書きましたが、私の例を修正すれば目的を達成できると思っていたので、質問でやりたいことを詳しく書きませんでした。

改めてやりたいことを書きます。

親フォームにボタンがあります。
そのボタンを押すとサブフォームのコンボボックスをチェックします。
コンボボックスの初期値は1です。そして、コンボボックスの2か3を選ばなければなりません。
もし、サブフォームのコンボボックスの1つでも初期値の1があれば、ダイアログで2か3を選択するように促して、処理をとめたいと思っています。
ちなみに、コンボボックスの2と3は、レポートの番号です。
コンボボックスは、データをどのレポートで印刷するかの指定です。

だから、私が知りたいのは、サブフォームの複数あるコンボボックスの、選ばれた値です。

後から情報を出してすみません。今度からこのような事の無いようにします。

お礼日時:2014/10/27 23:44

No1です。

回答の、

For Each ctl In Me!埋め込み0.Form.Controls

のところで、

Me!埋め込み0

は、質問の中の

Forms!メインフォーム名!サブフォームコントロール名

と同じです。つまり「埋め込み0」とはサブフォームを
表示しているコントロール名で初期値を書いています。
    • good
    • 0

メッセージボックスを何度も表示するよりは、


一度に表示したほうがわかりやすいので、

Private Sub コマンド0_Click()
Dim ctl As Object
Dim i As Long
Dim var As Variant

For Each ctl In Me!埋め込み0.Form.Controls
  If TypeOf ctl Is ComboBox Then
    If ctl.Name = "コンボ1" Then
      For i = 0 To ctl.ListCount - 1
        var = var & ctl.ItemData(i) & Chr(13)
      Next i
    End If
  End If
Next ctl
MsgBox var
End Sub

のようにしてみてください。
    • good
    • 0

何度もすみません。

たとえばコンボボックスの表示が

   001  黒川
   002  徳川
   003  豊臣

のようになっている場合に、番号をすべて確認したい
場合は、

   var = var & ctl.Column(0, i) & Chr(13)

名前の列を確認したい場合は、

   var = var & ctl.Column(1, i) & Chr(13)

のようにしてください。両方まとめて確認したい場合は、

   var = var & ctl.Column(0, i) & "---" & ctl.Column(1, i) & Chr(13)



ついでに、No3の回答も

   var = var & ctl.Column(0, i) & Chr(13)

としてもいいです。列が一つしかない場合でも、対応できるようなので。
    • good
    • 0

複数あるコンボボックスのそれぞれで表示している値を


取得する、ということですね。


For Each ctl In Me!埋め込み0.Form.Controls
  If TypeOf ctl Is ComboBox Then
    MsgBox ctl.Value
  End If
Next ctl

あるいは、

For Each ctl In Me!埋め込み0.Form.Controls
  If TypeOf ctl Is ComboBox Then
    MsgBox ctl.Name & "の値は" & ctl.Value
  End If
Next ctl

で、どうでしょう。また、

>そのボタンを押すとサブフォームのコンボボックスをチェックします。
>コンボボックスの初期値は1です。そして、コンボボックスの2か3を
>選ばなければなりません。もし、サブフォームのコンボボックスの1つ
>でも初期値の1があれば、ダイアログで2か3を選択するように促して、
>処理をとめたいと思っています。

ということであれば、

For Each ctl In Me!埋め込み0.Form.Controls
  If TypeOf ctl Is ComboBox Then
    If ctl.Value = 1 Then
      MsgBox ctl.Name & "の値は1です値を変更してください。"
    End If
  End If
Next ctl

のような設定ではどうですか。





>そしてよくわからないのが、「ctl.ListCount - 1」の部分です。
>「ListCount」を調べてみると、「表示している各行の値」となっています。
>この例を試すと、1つのコンボの選択肢すべての値が表示されるような
>気がするのですが違うのでしょうか。

はい、その通りです。一つのコンボボックスの値をすべて表示
するものと思っていました。
    • good
    • 0
この回答へのお礼

ありがとうございます。

結果から言うと、私が例で上げた結果と同じでした。
つまり、サブフォームに2列あっても、選択されている列の結果しか表示されませんでした。
メッセージボックスは1回しか表示されません。
2列あれば、2回メッセージボックスを表示させたいと考えています。

もしかして、私が用語名を間違えているのでしょうか?

今回したいのは、請求書や受注書のような様式の、明細部分のチェックをしたいと思っています。
サブフォームとは、明細部分のことを言っています。

その明細部分の項目として、横1列にコンボボックスが1つあります。
そして、そのようなコンボボックス1つの列が複数あります。
その、それぞれの列のコンボボックスの値をチェックしたいと考えています。

お礼日時:2014/10/28 23:30

問題になるサブフォームが1個だけで


コンボボックスも3個だけなら
無理してループする必要がないのでは?

With Me.サブフォームコントロール名.Form
  MsgBox .コンボボックス1
  MsgBox .コンボボックス2
  MsgBox .コンボボックス3
End With
    • good
    • 0
この回答へのお礼

ありがとうございます。

今回作っているのは、受注処理に使おうと思っています。
サブフォームは、受注明細となります。

そのため、コンボボックスは3つとは限りません。
場合によったら、10個や20個になるかも?

つまり、可変のためループする必要があります。

お礼日時:2014/10/28 23:03

具体的にしてみます。



(1)
サブフォームが図のようになっているとします。現在選択されている
のは一番上のレコードです。親フォームのボタンクリックをすると、
メッセージボックスで、
  「設定1の値は1です。値を変更してください。」
  「設定3の値は1です。値を変更してください。」
とでます。これがNo1での補足を基に出したNo5の回答です。


(2)
補足の、

>その明細部分の項目として、横1列にコンボボックスが1つあります。
>そして、そのようなコンボボックス1つの列が複数あります。

これが、また「?」なのです。
下図のコンボボックスの配置を言いますと、

「明細にテキストボックス二つと、コンボボックスが三つ配置されています。」

という、説明になるのですが、勘違いしていますか?
「アクセスのサブフォームの値のチェック」の回答画像7
    • good
    • 0
この回答へのお礼

本当にありがとうございます。

今回添付された画像から、「設定2」と「設定3」のコンボボックスを外せば、私の希望している形です。

ところで、質問者は画像を挿入できないのでしょうか?
画像を見てもらったほうが早いので、画像を作ったのですがアップする方法が見当たりません。

お礼日時:2014/10/29 19:31

No.6 です。



> msgbox Forms!メインフォーム名!サブフォームコントロール名.Form!コントロール名

これから見る限り、サブフォーム、コントロール とも 1個で固定であるはず。

なのに、
> For Each ctl In Me.Controls
で、ループしている。

何か変だなと思っていましたが、

No.6 へのコメントで

> そのため、コンボボックスは3つとは限りません。
> 場合によったら、10個や20個になるかも?
>
> つまり、可変のためループする必要があります。

No.5 さんへのコメントで

> その明細部分の項目として、横1列にコンボボックスが1つあります。
> そして、そのようなコンボボックス1つの列が複数あります。
> その、それぞれの列のコンボボックスの値をチェックしたいと考えています。

ようやく分かりました。

プログラミングは出来るけど
Access そのものに関しての知識があまりない。

用語の間違いで、誤解が生じた、ということですね。

「フィールド」も「レコード」も「列」という言葉で片付けているので。

まずは、こちらをご覧ください。

データベースの基礎であるテーブルとは - Access 入門
http://office.microsoft.com/ja-jp/access-help/RZ …


★ご質問の内容は

メインフォームに帳票形式サブフォーム「受注明細」があります。
メインフォームのコマンドボタンをクリックしたときに
サブフォームのフィールド 「帳票種別」 の値が "1" であるレコードがあるかをチェックしたい。

ということでしょう。
(コントロール名等は、適当に読み替えてください。)


やり方はいろいろありますが

・RecordsetClone で 検索する。

  Dim rst As DAO.Recordset
  Set rst = Me.受注明細.Form.RecordsetClone
  rst.FindFirst "帳票種別 = '1'"  ' テキスト型の場合
  If Not rst.NoMatch Then
    MsgBox "2、3を選んでね"
  End If
  rst.Close
  Set rst = Nothing

・サブフォームに 「帳票種別 = '1'」 であるレコード数を表示するテキストボックスを作成し
 その値をメインから参照する。

 サブフォームにフォームフッターを配置(非表示にする)。
 テキストボックスを配置。
 コントロールソースを
  = Sum(IIf([帳票種別] = '1', 1, 0))
    • good
    • 1
この回答へのお礼

ありがとうございます。

ACCESSの機能で簡単にできると思っていたのですが、できないのでしょうか。

よくわからないので、

親に振ってある、id(連番)を取得して、サブフォームからidのあるレコードを抽出します。
そのレコードの該当箇所(コンボボックスの値)をチェックする方法でできないかと考えています。

「RecordsetClone」は、初めて見ます。
わからない部分を調べて、教えていただいた方法を解析したいと思います。

ありがとうございました。

お礼日時:2014/10/29 19:43

すべての補足を総合すると、







For Each ctl In Me!埋め込み0.Form.Controls
  If TypeOf ctl Is ComboBox Then
    If ctl.Value = 1 Then
      MsgBox ctl.Name & "の値は1です値を変更してください。"
    Else
      If Not IsNull(ctl.Value) Then
        MsgBox ctl.Name & "の値は" & ctl.Value
      Else
        Msgbox ctl.Name & "は選択されていません。"
      End If
    End If
  End If
Next ctl


ということですかね。
画像はいいようなので。


最初の補足の中の、

>ブフォームのコンボボックスの1つでも初期値の1があれば、
>ダイアログで2か3を選択するように促して、処理をとめたいと思っています。

の、
>初期値の1
の解釈にひっかかっていたもので、もしかしたら
いろいろ行き違いがあったかもしれません。
    • good
    • 0

>「設定2」と「設定3」のコンボボックスを外せば、私の希望している形です。



ようするに、明細行にコンボボックスは一つ
ということですね。
それから、補足の中の「選択されている」というのも
「複数選択」などどこでどのように何を選択しているのか
よくわからないので、一旦、すべての回答を取り下げます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!