🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

コンボボックス

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

Q&A

解決済

4回答

6087閲覧

Excel VBA ユーザーフォームのコンボボックス1、2を連動させる

Yokubari_PT

総合スコア5

VBA

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

コンボボックス

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

0グッド

0クリップ

投稿2019/11/04 13:55

編集2019/11/05 13:33

初めまして。
現在、Excelのユーザーフォームにてcombobox1とcombobox2を連動させようと試行錯誤しているのですが、求めている内容がcombobox2に表示されません。combobox1にadditemメソッドで表示させて、combobox1に追加された理学療法士、作業療法士、言語聴覚士が選択された時に、combobox2に利用者名が表示されるようにしたいのですが、下記に記載してコード(①)を使用すると−1と表示されます。さらに繰り返し選択をすると−1が増えてきます(②)。利用者を取ってくるsheetsは(③)に添付しました。利用者は利用者が増えるごとに選択範囲を広げたり、縮めたりしたいと考えております。さらに考えている事としましては、利用者名が選択されたら、他のsheetsに利用者が担当している担当者を一覧で表示できるように考えております。
色々なサイトから引っ張ってきた内容ばかりで、自分でもなんとなくでしか理解していない内容も含まれています。
質問内容も分かりにくくなってしまい、大変申し訳ございませんが、必要コード、修正、アドバイスなどお願い致します。

Private Sub UserForm_Initialize() With ComboBox1 .AddItem "" .AddItem "理学療法士" .AddItem "作業療法士" .AddItem "言語聴覚士" End With End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub ComboBox1_change() Dim a As String Dim LASTROW1 As Long Dim LASTROW2 As Long Dim LASTROW3 As Long a = ComboBox1 LASTROW1 = Cells(Rows.Count, 3).End(xlUp).Row LASTROW2 = Cells(Rows.Count, 7).End(xlUp).Row LASTROW3 = Cells(Rows.Count, 11).End(xlUp).Row With UserForm1 .ComboBox2.Text = "" Select Case a Case "理学療法士" ComboBox2.AddItem Worksheets("療法士管理").Range(Cells(5, 3), Cells(LASTROW1, 3)).Select Case "作業療法士" Me.ComboBox2.AddItem Worksheets("療法士管理").Range(Cells(5, 7), Cells(LASTROW2, 7)).Select Case "言語聴覚士" Me.ComboBox2.AddItem Worksheets("療法士管理").Range(Cells(5, 11), Cells(LASTROW2, 11)).Select End Select End With End Sub


イメージ説明

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

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

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

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

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

guest

回答4

0

ベストアンサー

コンボボックスでリストにアイテムを追加するときはAddItemでは一つずつしか追加でいませんので、他の方の回答のようにループ処理で一つずつ追加していくことになります。

セル範囲をデータを表示させる場合は、Listプロパティ、またはRowSourceプロパティを利用すると一度に追加できます。

Listプロパティを使った場合のコード例

vba

1Private Sub UserForm_Initialize() 2 With Worksheets("療法士管理") 3 ComboBox1.List = Array(.Range("B5").Value, .Range("F5").Value, .Range("J5").Value) 4 End With 5End Sub 6 7Private Sub ComboBox1_AfterUpdate() 8 Dim col As Long 9 col = ComboBox1.ListIndex * 4 + 3 10 If col < 0 Then 11 ComboBox2.Clear 12 Exit Sub 13 End If 14 With Worksheets("療法士管理") 15 Dim lastRow As Long 16 lastRow = .Cells(.Rows.Count, col).End(xlUp).Row 17 ComboBox2.List = .Range(.Cells(5, col), .Cells(lastRow, col)).Value 18 ComboBox2.Text = "" 19 End With 20End Sub 21

Changeイベントだと一文字入力したり削除しただけで発生するのでAfterUpdateイベントを使いました。
Listプロパティには配列を代入できます。セル範囲.Valueで配列になります。
ListIndexプロパティで何番目が選択されたか取得できます(0起点)。それを利用して列位置を計算してます。

投稿2019/11/05 02:24

編集2019/11/05 19:52
hatena19

総合スコア34073

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

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

Yokubari_PT

2019/11/05 15:13

丁寧なご説明までありがとうございます。 行えました。ありがとうございます。
Yokubari_PT

2019/11/05 15:28

ちなみにシートがactiveじゃないと ComboBox2.List = .Range(Cells(5, col), Cells(lastRow, col)).Value でデバックになります。何故ですか?
hatena19

2019/11/05 19:53

あっ、すみません。. がぬてけました。 ComboBox2.List = .Range(.Cells(5, col), .Cells(lastRow, col)).Value に変更してください。 回答の方も修正しておきました。
Yokubari_PT

2019/11/06 01:18

withステートメントに必要な . が抜けてたわけですね。分かりました。 何度も申し訳ないのですが、 Dim col As Long col = ComboBox1.ListIndex * 4 + 3 If col < 0 Then はDimでcol変数を定義して、colnの変数はセルの値を求めているんだと思うのですが、 *4+3の意味が分からないのですが…。また If col < 0 Thenはcolが0未満であればと言うのは、空白であればを示しているのですか? お手数かけますがお願い致します。
hatena19

2019/11/06 01:26

ComboBox1.ListIndex は何番目が選択されているかが取得できます。ただし、一番目が0、二番目か1となります。また、選択されていない場合は -1 になります。 一番目が選択されている場合は、0 * 4 + 3 の演算で結果は 3 になります。 二番目が選択されている場合は、1 * 4 + 3 の演算で結果は 7 になります。 つまり、リストデータのある列を計算でだしています。 非選択の場合は、-1*4+3 で演算結果は -1 になるので、If col < 0 Then は非選択の場合という意味になります。
Yokubari_PT

2019/11/06 13:47

ご回答ありがとうございます。詳しくわかりました。 汎用的に使用させて頂きます。
guest

0

コンボボックスに要素を入れるときは、
1つずつしか追加することはできません。
取得したせる範囲の内容を1つずつ追加するとうまく動きます。
また、コンボボックス2に要素を追加する前に
要素を初期化する仕様が入ってなかったです。

▼ 「ComboBox1_Change」関数の内容を使わない変数を削除してスッキリ修正しました。動作確認済みです

vb

1Private Sub ComboBox1_Change() 2 Dim i_row As Integer 3 Dim i_col As Integer 4 5 With UserForm1 6 .ComboBox2.Text = "" 7 .ComboBox2.Clear 8 9 Select Case ComboBox1 10 Case "理学療法士" 11 i_col = 3 12 Case "作業療法士" 13 i_col = 7 14 Case "言語聴覚士" 15 i_col = 11 16 Case "" 17 Exit Sub 18 End Select 19 20 For i_row = 5 To Cells(Rows.Count, i_col).End(xlUp).Row 21 ComboBox2.AddItem Worksheets("療法士管理").Cells(i_row, i_col).Value 22 Next 23 End With 24End Sub 25

ご参考にしてみてください!

投稿2019/11/05 01:12

Youbun

総合スコア125

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

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

Yokubari_PT

2019/11/05 13:42

Dim i_col As Integer はどこで変数を定義しているのですか?
guest

0

Private Sub ComboBox1_change()を変えました。
以下のようにします。
AddItemは一度に全利用者を追加することはできません。地道に1名ずつ追加します。
職種によりどの列の利用者を追加するかが変わるので、サブプロシージャを作って、そこで追加するように
しました。追加の前に一旦、コンボボックスを全てクリアしておくことも必要です。

vba

1Private Sub ComboBox1_change() 2 Dim a As String 3 a = ComboBox1.Text 4 Select Case a 5 Case "理学療法士" 6 Call 利用者氏名設定(3) 7 Case "作業療法士" 8 Call 利用者氏名設定(7) 9 Case "言語聴覚士" 10 Call 利用者氏名設定(11) 11 End Select 12End Sub 13 14 15Private Sub 利用者氏名設定(ByVal col As Long) 16 Dim lastrow As Long 17 Dim wrow As Long 18 Dim ws As Worksheet 19 Set ws = Worksheets("療法士管理") 20 lastrow = ws.Cells(Rows.Count, col).End(xlUp).Row 21 ComboBox2.Clear 22 For wrow = 5 To lastrow 23 ComboBox2.AddItem ws.Cells(wrow, col).Value 24 Next 25End Sub 26

投稿2019/11/05 00:54

tatsu99

総合スコア5493

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

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

0

Select Case a

ここで実行を止めて、aになにがはいってるのかチェックしてみよう

投稿2019/11/04 20:02

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問