質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

2回答

1907閲覧

ユーザフォームで3つのコンボを連動させたい

yogina

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

0クリップ

投稿2021/12/11 14:49

前提・実現したいこと

VBA初心者です。

現在受注リストをユーザフォームで作成できるエクセルを作成しています。
そのユーザフォームの項目で、一部、コンボボックスで
1.商品ID(コンボボックス名:ProdID)
2.商品名(コンボボックス名:ProdName)
3.単価 (コンボボックス名:Price)
それぞれ連動したコンボボックスを追加したいと思っていますが
UserForm_Initialize()、change()に ADDITEM()に
どうコードを記載したらいいのか頭を抱えてます。

それぞれのマスタは"リスト"というシートに

商品ID商品名単価
0オフィス用コーヒー 2000
0家庭用コーヒー1000
0オフィス用カフェラテ3000
1コーヒー豆 10000
2オフィス用カフェラテ3000
2コーヒー豆10000

といった感じで作成しています。
同じ番号の重複をせずに表示させて、なおかつ、商品名・単価は左の項目に連動させるような
コードをお教えいただけると幸いです。

該当のソースコード

ソースコード

試したこと

ネットでSQLを使って作成する方法をみつけて試みましたが、
実際に使うPCがSQL使用禁止のものだったので、純粋にEXCELの標準機能だけで動かせる方法があれば助かります。

補足情報(FW/ツールのバージョンなど)

EXCEL OFFICE365

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんな感じでどうでしょうか。

VBA

1Option Explicit 2 3Dim dic 'As Scripting.Dictionary 4 5Private Sub UserForm_Initialize() 6 Set dic = CreateObject("Scripting.Dictionary") 7 Dim ws As Worksheet 8 Set ws = ThisWorkbook.Worksheets(1) 9 10 Dim sID As String 11 Dim ro As Range 12 For Each ro In ws.UsedRange.Rows 13 sID = ro.Cells(1, 1) 14 If dic.Exists(sID) Then 15 Set dic(sID) = Union(ro, dic(sID)) 16 Else 17 Set dic(sID) = ro 18 End If 19 Next 20 21 With ComboBox1 22 .List = dic.Keys 23 .ListIndex = 0 24 End With 25End Sub 26 27Private Sub ComboBox1_Change() 28 ComboBox2.Clear 29 ComboBox3.Clear 30 Dim rng As Range 31 Set rng = dic(ComboBox1.Value) 32 Dim ro As Range 33 For Each ro In rng.Rows 34 ComboBox2.AddItem ro.Columns(2) 35 Next 36 ComboBox2.ListIndex = 0 37End Sub 38 39Private Sub ComboBox2_Change() 40 ComboBox3.Clear 41 Dim rng As Range 42 Set rng = dic(ComboBox1.Value) 43 Dim ro As Range 44 For Each ro In rng.Rows 45 If ComboBox2.Value = ro.Columns(2) Then 46 ComboBox3.Value = ro.Columns(3) 47 End If 48 Next 49End Sub 50

投稿2021/12/12 03:05

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yogina

2021/12/12 05:00

早速ありがとうございます!
guest

0

ベストアンサー

いろいろな方法があると思いますが、

OFFICE365 ということなので、Unique関数, Filter関数を使った例です。

まず、リストをテーブル化しておきます。テーブル化しておくと、データを、項目名で取得できるので読みやすいコードになります。

イメージ説明

詳細は下記などで学習してください。

【VBA】テーブルから値を取得する方法まとめ【“構造化参照”と“ListObjects”の比較】

ユーザ―フォームのモジュール

vba

1Option Explicit 2 3Private Sub UserForm_Initialize() 4 Me.ProdID.List = WorksheetFunction.Unique(Range("商品リスト[商品ID]")) 5End Sub 6 7Private Sub ProdName_Enter() 8 With WorksheetFunction 9 If Me.ProdID.Value <> "" Then 10 Me.ProdName.List = _ 11 .Unique(.Filter(Range("商品リスト[商品名]"), _ 12 Evaluate("商品リスト[商品ID]=" & Me.ProdID.Value))) 13 End If 14 End With 15End Sub 16 17Private Sub Price_Enter() 18 With WorksheetFunction 19 If Me.ProdID.Value <> "" And Me.ProdName.Value <> "" Then 20 Me.Price.List = _ 21 .Unique(.Filter(Range("商品リスト[単価]"), _ 22 Evaluate("(商品リスト[商品ID]=" & Me.ProdID.Value & ")" & _ 23 "*(商品リスト[商品名]=""" & Me.ProdName & """)"))) 24 End If 25 End With 26End Sub

一応、商品ID → 商品名 → 価格 という順で選択するのが前提のコードです。
※追記 テーブルの名前は「商品リスト」としてください。

投稿2021/12/12 02:48

編集2021/12/12 06:40
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yogina

2021/12/12 06:19

リストを使ったやり方があるのは知りませんでした。解説もご丁寧に解説もつけてくださりありがとうございます。助かります! ただ、商品IDはスムーズに出たのですが、実行エラー1004でWorksheetFunctionクラスのFilterプロパティが取得できないと出てしまいます;;何が原因なのかいろいろ調べているのですが、もしご存じでしたら教えて戴けると助かります。(あつかましくスミマセン。。)
hatena19

2021/12/12 06:39

テーブルの名前を「商品リスト」にしてますか。 (回答にこの点の説明がなかったので追記しておきました。)
hatena19

2021/12/12 06:41

あっ、でも、商品ID はうまくいったのなら、それではないか。 うーん、ちょっと原因は分からないですね。
yogina

2021/12/12 06:46

お返事ありがとうございます。はい、商品リストにしております。
yogina

2021/12/12 06:46

ありがとうございます。自分でもう少し調べてみます。
yogina

2021/12/12 11:57

質問させていただいた表は無事連動することができました????また考え方についても勉強になりました、 本当にありがとうございました????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問