重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VBA初心者です。よろしくお願いいたします。
Excelでユーザーフォームのコンボボックスを連動させたいのですが上手く出来ません。
連動させたいマスタがsheet1〜3に別々にあります。

sheet1部署
A列 B列    C列   D列
ID  部署コード  部署名 部署属性

sheet2担当者
A列 B列    C列    D列    E列
ID 担当者コード 担当者名 部署コード 部署名

sheet3科目
A列 B列    C列    D列
ID 科目コード 科目名  部署属性

コンボボックス1で部署を選択すると、その部署の担当者リストをコンボボックス2に表示。さらにその部署の部署属性の科目をコンボボックス3に表示させたいです。

つたない説明で申し訳ありません。どうぞよろしくお願いいたします。

質問者からの補足コメント

  • シート名はsheet1〜3です。
    sheet1
    A列 B列 C列 D列
    1 100 総務 スタッフ
    2 200 営業1 営業
    3 300 製造 製造
    sheet2
    A列 B列 C列 D列 E列
    1 001 山田 100 総務
    2 002 佐藤 200 営業1
    4 004 山本 300 製造
    sheet3
    A列 B列 C列 D列
    1 111 事務費 スタッフ
    2 112 事務費 営業
    3 113 事務費 製造

    CNB部署「総務」を選択した場合
    CNB担当者:「山田」をリストに表示
    CNB科目:部署属性が「スタッフ」の科目をリストに表示
    というような事がしたいのですが…。
    Accessで作成出来たらよいのですが環境がないのでExcelで作れればと思い質問させていただきました。

      補足日時:2020/03/23 22:02

A 回答 (6件)

こんばんは!



横からお邪魔します。
コンボボックスを使うというコトはすべての列内に重複するデータがある!というコトですかね?
重複がないのであれば、コンボボックス2とコンボボックス3はテキストボックスで良いと思うのですが・・・
(重複がある場合のコンボボックス3の処理がよく判りません)

とりあえずやってみました。

Dim i As Long
Dim c As Range

Private Sub UserForm_Initialize()
 With Worksheets("Sheet1")
  For i = 2 To .Cells(Rows.Count, "C").End(xlUp).Row
   ComboBox1.AddItem (.Cells(i, "C"))
  Next i
 End With
End Sub

Private Sub ComboBox1_Change()
 ComboBox2.Clear
  With Worksheets("Sheet2")
   For i = 2 To .Cells(Rows.Count, "E").End(xlUp).Row
    If .Cells(i, "E") = ComboBox1 Then
     ComboBox2.AddItem (.Cells(i, "C"))
    End If
   Next i
  End With

 ComboBox3.Clear
  Set c = Worksheets("Sheet1").Range("C:C").Find(what:=ComboBox1, LookIn:=xlValues, lookat:=xlWhole)
  With Worksheets("Sheet3")
   For i = 2 To .Cells(Rows.Count, "D").End(xlUp).Row
    If .Cells(i, "D") = c.Offset(, 1) Then
     ComboBox3.AddItem (.Cells(i, "D"))
    End If
   Next i
  End With
End Sub

※ ユーザーフォームを立ち上げ時点からのコードを記載しています。
(立ち上げ時にコンボボックス1にデータを格納している)

※ 一発で解決!とはいかないように思えますが
まずはこの程度で・・・m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます!まさにやりたかった事でした。具体的にコードも書いていただけて大変助かりました。

すみません「すべての列内で重複」というのがよくわからなかったのですが、やりたかった事は現在手書きで記入される伝票で、部署・担当者・科目の紐付けが正しいかチェックが必要なのですが、実際のデータは部署が30以上・担当者が100名以上、科目が同じ科目でも部署の属性によって2つ以上存在してチェックがとても大変でしたので、入力方式で正しい紐づき以外が選択できないようにしたかったのです。

今回の質問で教えていただいたコードや関数が自分でも理解出来るよう、これを機にもう少し勉強したいと思います。

お礼日時:2020/03/26 23:05

的確な質問しないと、完成には相当遠いです。


セル内で完結するよう書いています。
    • good
    • 0
この回答へのお礼

何度か試しましたが私の知識では難しいようです。せっかくご回答いただいたのに申し訳ありません。ありがとうございました。

お礼日時:2020/03/26 13:18

Sheet1!$A8を選択された位置は入力位置ではないです。



一時的に表示させる位置(sheet3から参照される)
上下と横にコピーでした

sheet1!
はシート名なので配置する場所によります
    • good
    • 0
この回答へのお礼

部署コンボで値が入るセルが「選択された位置」ということでしょうか。そこに部署名を入れると数式を入れたセルに担当者名が出ました。でもユーザーフォームのコンボリストには上手く表示されません。0の行や他の部署の担当者も表示されます。

お礼日時:2020/03/26 06:11

Sheet1!$A8を選択された位置


として
=INDIRECT("C"&SMALL(IF(Sheet1!$A8=$E$1:$E$10000,1,10000)*ROW($E$1:$E$10000),1))
ctrl+enter
下にコピー

これを選択対象に設定

これをsheet3もします
    • good
    • 0
この回答へのお礼

ありがとうごさいます!
でも関数の知識も乏しく、そのまま入力しましたら「0」と結果が出ます。これでよいのでしょうか…。その後の処理ももう少し教えていただけると助かります。

お礼日時:2020/03/24 23:55

せめてダミーデータでどんな感じでどんな結果を出せれば良いのか?


模範解答があると良かったのかも。
シート名は『Sheet1~3なのか否か』

何となくAccessが向いてそうな感じですけどね。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうごさいます。シート名と具体的なデータ例を補足で載せてみました。

お礼日時:2020/03/23 22:05

sheet2,sheet3はsheet1の条件で別途、関数で取り出す必要があります。


取り出したものを参照すれば可能です。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています