エクセルVBAの初心者がユーザーフォームのコンボボックス連携について教えてください

このQ&Aのポイント
  • エクセルVBA初心者が、ユーザーフォームでのコンボボックスの連携方法について教えてください。
  • 具体的には、コンボボックス1で選択した種類に応じてコンボボックス2のリストが変わるようにしたいです。
  • また、コンボボックス1で選択した種類とコンボボックス2で選択した商品をそれぞれ指定のセルに挿入したいです。
回答を見る
  • ベストアンサー

エクセルVBA

初心者です エクセル2003 ユーザーフォームのコンボボックスの連携について教えてください   Seet1       A     B     C     D      E     F           1   種類1   商品1  商品A  商品あ        コンボ1  2   種類2   商品2  商品B  商品い 3   種類3   商品3  商品C  商品う                4   種類4   商品4  商品D  商品え        コンボ2 5   種類5   商品5  商品E  商品お (1)コンボボックス1と2を別々のユーザーフォームで配置(ダブルクリックにて表示 F1とF4) (2)コンボボックス1でA列の種類を選択によりコンボボックス2のリストが変わる (3)コンボボックス1で選んだ種類をF1のセルに挿入 (4)コンボボックス2は種類1の場合はB列             種類2の場合はC列             種類3の場合はD列のリストとします (5)コンボボックス2で選択した商品をF4に挿入といった具合です 何度か挑戦しましたが、同一ユーザーフォームにコンボボックス2つは成功するのですが うまくいきません コード及びコード記入場所を教えていただけませんか よろしくお願いいたします

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! すでに適切な回答が出ていますので・・・ 参考程度です。 ユーザーフォーム・コンボボックス等のオブジェクト名は指定したいないとします。 'Sheetモジュールです Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target If .Address = "$F$1" Then UserForm1.Show ElseIf .Address = "$F$4" Then Dim k As Long, myFlg As Boolean, myArray myArray = Array("種類1", "種類2", "種類3") myFlg = False For k = 0 To UBound(myArray) If Range("F1") = myArray(k) Then myFlg = True End If Next k If myFlg = False Or Range("F1") = "" Then MsgBox "再度種類を選択してください。", vbOKOnly Range("F1").Select Exit Sub End If UserForm2.Show End If End With End Sub 'ユーザーフォーム1のコード Private Sub ComboBox1_Change() Range("F1") = UserForm1.ComboBox1.Text Range("F4") = "" Unload Me End Sub 'ユーザーフォーム2のコンボボックスのコード Private Sub ComboBox1_Change() Range("F4") = UserForm2.ComboBox1.Text Unload Me End Sub 'ユーザーフォーム2のコード Private Sub UserForm_Initialize() With UserForm2.ComboBox1 Select Case Range("F1") Case "種類1" .RowSource = "B1:B5" Case "種類2" .RowSource = "C1:C5" Case "種類3" .RowSource = "D2:D5" End Select End With End Sub こんな感じではどうでしょうか?m(_ _)m

KICHIMAROBON
質問者

お礼

ありがとうございます とてもわかりやすい説明ですね そのままだとユーザーフォーム1がうまくいかなかったので ユーザーフォーム1のコードをユーザーフォーム1のコンボボックスのコードにして ユーザーフォーム1のコードを  Private Sub UserForm_Initialize() ComboBox1.RowSource = "A1:A3"  End Sub  でうまく機能しました。 とても助かりました ありがとうございました  

その他の回答 (4)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

何度もごめんなさい。 今日はミスの連発です。 すでにお判りかと思いますが・・・ >ユーザーフォーム1のRowSourceは >ユーザーフォームのプロパティで RowSource の設定ができますので、 はユーザーフォームではなく、コンボボックス の間違いです。 どうも失礼しました。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.2・3です! No.2の欄に >そのままだとユーザーフォーム1がうまくいかなかったので とありましたので・・・・ あっ!そうでしたね! ユーザーフォーム1のRowSourceは ユーザーフォームのプロパティで RowSource の設定ができますので、 そこで行えばコードに組み込まなくても大丈夫です。 そのコトを書き忘れていました。 どうも失礼しました。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です。 たびたびごめんなさい。 >コード及びコード記入場所を教えていただけませんか の後半を忘れていました。 最初のシートモジュール部分は問題ないと思います。 操作したいSheet見出し上で右クリック → コードの表示 → VBE画面にコピー&ペーストしてください。 各ユーザーフォーム・コンボボックスですが Alt+F11キー でVBE画面になります。 前回の >ユーザーフォーム1のコード は実はユーザーフォーム1のコンボボックスのコードです。 画面左側の「UserForm1」をダブルクリック → ユーザーフォーム1が表示されますので、 そこのコンボボックスをダブルクリック 表示されたVBE画面に前回の 「ユーザーフォーム1」のコードをコピー&ペースト (Private Sub UserForm_Click() といったものが表示されますが、無視します) 次に「UserForm2」をダブルクリック → コンボボックス以外のユーザーフォームの部分をダブルクリック ここに「ユーザーフォーム2のコード」をコピー&ペースト もう一度「UserForm2」をダブルクリック → コンボボックスをダブルクリック VBE画面に ユーザーフォーム2のコンボボックスのコード を貼り付けます。 この程度で判りますかね?m(_ _)m

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

なかなか回答が付かないようなので。 現状で「どんなコードを書いて、どのようにうまくいかないのか」を明記すると 色んなアドバイスをもらえると思いますよ。 「初心者」で逃げられると、回答側もあなたが「どの程度できるのか」わからないので、 アドバイスのレベルに困りますからね。 とりあえず、一例として簡単なコードを。 ユーザーフォームの名前を「UserForm」 コンボボックスの名前をそれぞれ「ComboBox1」「ComboBox2」 (一応、選択した「コンボボックスの値」をF1・F4セルに反映する「CommandButton1」も用意) とした場合です。 まず、ユーザーフォームを呼び出したときに、A1:A5をコンボ1の値に設定するため、 Private Sub UserForm_Initialize()     ComboBox1.RowSource = "A1:A5" End Sub を用意しておきます。 続いて、コンボ1の値が変わったときに、コンボ2の値を動的に変えるためのコード Private Sub ComboBox1_Change()     ComboBox2.Value = ""    '念のため、コンボ2を空白に     Select Case ComboBox1.Value         Case "種類1"             ComboBox2.RowSource = "B1:B5"         Case "種類2"             ComboBox2.RowSource = "C1:C5"         Case "種類3"             ComboBox2.RowSource = "D1:D5"     End Select End Sub これで、変わってくれます。 「種類」が増えるなら、Caseを増やしてやればOKです。 最後に、選択された内容をセルに反映するボタン Private Sub CommandButton1_Click()     If ComboBox1.Value = "" And ComboBox2.Value = "" Then         MsgBox "選択されませんでした"     Else         Range("F1").Value = ComboBox1.Value         Range("F4").Value = ComboBox2.Value     End If     Unload Me End Sub コンボボックス二つとも選択されたらセルに反映、 どちらか一方でも選択されなかったら何もしないで終了、としてやります。 これらをユーザーフォームモジュールに書けば、ご希望に近い処理が出来るような気がします。 あとはここから膨らませていけばよろしいかと思いますよ。

KICHIMAROBON
質問者

お礼

ありがとうございます 今後もう少しコードを書くように気をつけます

関連するQ&A

  • エクセルVBAについて教えてください

    エクセル2003です。 Sheet1     A    B    C     D 1 種類1 商品1 商品A  商品あ 2 種類2 商品2 商品B  商品い 3 種類3 商品3 商品C  商品う  4      商品4 商品D  商品え 5  商品5 商品E  商品お Sheet2   AB CDF     G    H     I 1         種類表示     商品表示  2         種類表示     商品表示  3         種類表示     商品表示  4         種類表示     商品表示  5         種類表示     商品表示  *Sheet2のG1をダブルクリックでSheet1のA列をユーザーフォームのコンボボックス1にてセルに表示  の上挿入 *コンボ1の選択によりコンボ2(Sheet2のI1をダブルクリック)の表示を変更する *コンボ1 種類1 → コンボ2 Sheet1のB列を表示の上セルに挿入 *コンボ1 種類2 → コンボ2 Sheet1のC列を表示の上セルに挿入 *コンボ1 種類3 → コンボ2 Sheet1のD列を表示の上セルに挿入 までは、出来きたのですが、Sheet2の2行目以降も同作業をしたいのですが、、、 Offset等を使用するのでしょうか? あまりわかっていないので詳しく教えて頂ければ幸いです コード Sheet2のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target If .Address = "$F$1" Then UserForm1.Show ElseIf .Address = "$H$1" Then Dim k As Long, myFlg As Boolean, myArray myArray = Array("種類1", "種類2", "種類3") myFlg = False For k = 0 To UBound(myArray) If Range("F1") = myArray(k) Then myFlg = True End If Next k If myFlg = False Or Range("F1") = "" Then MsgBox "種類を選択して", vbOKOnly Range("F1").Select Exit Sub End If UserForm2.Show End If End With End Sub ユーザーフォーム1のコード Private Sub UserForm_Initialize() ComboBox1.RowSource = "sHEET1!A1:A3" End Sub コンボ1のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("F1") = UserForm1.ComboBox1.Text Worksheets("Sheet2").Range("H1") = "" Unload Me End Sub ユーザーフォーム2のコード Private Sub UserForm_Initialize() With UserForm2.ComboBox1 Select Case Worksheets("Sheet2").Range("F1") Case "種類1" .RowSource = "Sheet1!B1:B5" Case "種類2" .RowSource = "Sheet1!C1:C5" Case "種類3" .RowSource = "Sheet1!D2:D5" End Select End With End Sub コンボ2のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("H1") = UserForm2.ComboBox1.Text Unload Me End Sub このコードをいじくってSheet2以降も同作業できるようにお願いします

  • エクセルVBA及び関数

    初心者です。お教えお願いします エクセル2003です 空白行及び0をなくしたいのですが(C列を入力された時点で自動でE列のようにしたい) 関数の場合及びVBAのシートコードを両方教えていただけないでしょうか VBAのコードは勉強の為です Sheet1    A    B     C     D     E     F 16          文字A        文字A 17          文字B        文字B 18            0         文字C 19          文字C        文字D 20            0         文字E 21          文字D        文字F      22      23          文字E 24 25          文字F 文字はC16~C80まで入っております B16~E80までのセルのみで行いたいのですが 他の場所は関数やグラフ等がすでに入ってますのでいじりたくありません E16~をフォームのコンボボックスのリストにしようと思ってます よろしくお願いましす

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 シート1のユーザーフォームにコンボボックスとテキストボックスが各1つずつ、 シート2のA列には1行目から順に「あ」「い」「う」と文字が入っていて、B列には「1」「2」「3」と値が入っています。 コンボボックスのリストにはシート2のA列の文字が選択できる状態にあります。 この状態で、例えばコンボボックスで「い」を選んだら、テキストボックスに自動的に「2」と入る、というように、コンボボックスのリストの中から任意の文字を選択したときに、テキストボックスにB列の値が入るようにするにはどのようにすればいいのでしょうか?よろしくお願いします。

  • excel 2003 vba コンボボックス 日付

    始めまして初心者です。よろしくお願いします。 ワークシートのA列に日付、B列に作業内容、C列に作業人員が入力されているとします。 それをユーザーフォームから操作したいです。 ユーザーフォーム上にコンボボックスとテキストボックス1,2を設置しています。 コンボボックスのRowSourceにA列日付をセットしています。 コンボボックスを操作すると、その日付のB列、C列の内容をそれぞれテキストボックス1,2に表示させたいです。

  • VBA コンボボックス リスト表示について

    初心者ですいません エクセル VBAのフォームでコンボボックス3つと、テキストボックス3つがあります シートのListにA~F列までのデータがあり、コンボボックス1にA列のリストを表示し コンボボックス2にA列で選んだリストを参照したB列のリストを表示し、コンボボックス3 にコンボボックス1,2で選んだリストを参照し、C列のリストを表示した後、 コンボボックス1,2,3で選ばれたもののD列、E列分をテキストボックス1,2に 反映しようと思っておりますがうまくいきません どのようにしたらよいか、おしえてください 宜しくお願いします ちなみに、リストの内容は A列   B列   C列     D列   E列 テレビ 42インチ  HDD内蔵  台    100,000 テレビ 32インチ  BD内蔵   台     80,000 テレビ 19インチ          台     50,000 ビデオ HDD   1TB     台    100,000   ビデオ HDD   500GB    台     80,000 ビデオ BD            台     70,000 が、入ってます 希望は、質問の際のカテゴリ選択のようになればよいのですが... さらに、希望を言えば、自動で、行ごとに1,2,3...と番号を振るようにしており スピンボタンで番号を選べば、登録された上記のデータをフォームに反映させるようにしております これもうまくいきません お願いばかりで申し訳ありませんが 宜しくお願いします

  • excel vba ユーザーフォーム

    現在、セルa101からa110までに「商品名」、セルb101からb110までに「金額」が 入力済みです。 このデータを、ユーザーフォーム上にコンボボックスを2つ作成し、セルa1へ 商品名を選択後、入力。また、b2へ金額を選択後、入力させたいのです。 また、ユーザーフォーム上にテキストボックスを作成し、ここに入力した 「備考」の全角10文字をc1へ移動したいです。 今のところ、ユーザーフォーム、コンボボックス、テキストボックスを作成した だけで 立ち往生しています。 どなたか、ご教授お願いいたします。

  • Access vba 教えてください。 初心者です

    以下のような テーブルT_ソフトリスト、テーブルT_ソフト フォームF_入力 があったときに、フォームの使用者のコンボボックスに入力をしたときに、 T_ソフトから使用者を探して、ソフトリストIDを取得し、そのソフトリストIDを元にT_ソフトソフトのソフト名をフォームのコンボボックスに表示させるようにしたいのですが、 どの様なソースコードを書けばよいでしょうか? 「T_ソフトリスト」←テーブル ================================== ID  | ソフト名 | ────────────── 1   | A |  2  | B |  3  | C |  4  | D |  5  | E |  ================================== 「T_ソフト」←テーブル ================================== ID |ソフトリストID | 使用者 | ─────────────────── 1 |  4     | 佐藤  | 2 |  2     | 鈴木  | 3 |  5     | 斉藤  | 4 |  1     | 佐藤  | 5 |  3     | 田中  | ================================== 「F_入力」←フォーム ================================== 使用者  [コンボボックス]←Combo_UserType ソフト名 [コンボボックス]←Combo_User ==================================

  • エクセルVBAでコマンドボタンをクリックし、連続入力する方法。

    初めまして。仕事の書類を作っている最中に壁に当たったのでご質問させていただきました。 早速ですが本題に入りたいと思います。 ユーザーフォームを使用してテキストボックスを使い3つのテキストボックスに入力を終えた後にコマンドボタンを押してセルB2,C3,D4に表示するとします。(下図のように) A B C D E 1 2 あ い う 3 4 5 6 このとき、また違う文字をテキストボックスに入力し、登録した場合、 B列,C列,D列の最終行+1にどんどん入力していくというコードは調べてわかったのですが、下図のように上下とも既に文字列が入っていて、この間セル(B3:B6,C3:C6,D3,D6)に上から順にコマンドボタンを押す度どんどん入れていくためのVBAはどうなるのでしょうか? A B C D E F 1 2 s d f d 3 4 5 6 7 f f f f 8 9 10 ちなみにこの場合だと8列目もしくは変なところに飛ぶと思うのですが…。 どうぞよろしくお願い致します。

  • エクセルVBA ユーザーフォーム 検索

    現在VBAにてユーザーフォームにて入力したデータをシート1に転記するものを作成しました。 この転記したデータを生かして作業したいと考えております。 データは商品データで A    B C E F 商品コード 商品名  区分  単価  備考 となっており ユーザーフォームも TEXTBOX1=A TEXTBOX2=B と言う様になってます。 現在考えているのがこのデータの一部を変更したい場合、コマンドボタンを押すと商品コード入力用boxがでてきて、商品コードを入力するとA列から検索し該当する商品データをユーザーフォーム上に表示するようにしたいのです。 そのデータがA75行にあったとします。 そのユーザーフォーム上で単価を変更した場合検索した行(A75行)にそのまま上書きする様にしたいです。 説明がうまくできてないかも知れませんが、どなたかご教授願います。

  • Access→Excelへの出力とVBA

    エクセルのシート1のB列に2種類の数値どちららかを選択させ、 A列の行数にそって入力させたいと考えています。 数値の判断は、 AccessのフォームABCにあるコンボボックスAで ○×を選んだときは「1」、 AccessのフォームABCにあるコンボボックスAで ☆★を選んだときは「2」 をA列に入力されている値の行数だけB列に値を入力させるには、 どの様にしたら良いのでしょうか? Access単品の操作では出来ないと聞きました。 よろしくお願いします。

専門家に質問してみよう