- ベストアンサー
エクセル VBA if構文
毎度お世話になります。 下記プログラミングですが、 シャーペンまたはボールペンがコンボボックス1で 選択された場合はコンボボックス2で10束または50束の選択肢となり 消しゴムまたはシャー芯がコンボボックス2で 選択された場合はコンボボックス2で100コまたは1000コの選択肢としたいのですが 他の方法がありますでしょうか。 宜しくお願い致します。 If Me.ComboBox1.Value = "シャーペン" Or Me.ComboBox1.Value = "ボールペン" Then ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "" ComboBox2.Clear ComboBox2.AddItem "10束" ComboBox2.AddItem "50束" ComboBox2.ListIndex = -1 End If If Me.ComboBox1.Value = "消しゴム" Or Me.ComboBox1.Value = "シャー芯" Then ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "" ComboBox2.Clear ComboBox2.AddItem "100コ" ComboBox2.AddItem "1000コ" ComboBox2.ListIndex = -1 End If
- pumifumi
- お礼率52% (71/136)
- Visual Basic
- 回答数7
- ありがとう数4
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんなのはどうでしょうか? Sheet2を用意してください。 まず、A1:B4セルに次の値を入力してください。 A1=シャーペン A2=ボールペン A3=消しゴム A4=シャー芯 B1=C B2=C B3=D B4=D 次に C列を選んで[書式][セル]の[表示形式]タブを選んで[ユーザー定義]で [#"束"]を入力してください。 C1=10 C2=50 D列を選んで[書式][セル]の[表示形式]タブを選んで[ユーザー定義]で [#"コ"]を入力してください。 D1=100 D2=1000 以上で、下記のような表ができます。 シャーペン C 10束 100コ ボールペン C 50束 1000コ 消しゴム D シャー芯 D ComboBox1のListFillRangeプロパティに Sheet2!A1:B4 と入力してください。 で、コンボボックスがあるシートに以下のVBAをコピーしてください。 Private Sub ComboBox1_Change() Const dataSheet = "Sheet2" Dim col As String col = ComboBox1.List(ComboBox1.ListIndex, 1) ComboBox2.ListFillRange = dataSheet & "!" & col & "1:" & col & Sheets(dataSheet).Cells(Sheets(dataSheet).Rows.Count, col).End(xlUp).Row ComboBox2.ListIndex = -1 End Sub にしてください。 以上です。 後はSheet2のC列やD列に100行でも1000行でも好きなだけデータを入れれば、コンボボックス2の選択肢ができます。 必要に応じてA:B列にデータを追加すれば、コンボボックス1もデータを追加できます。 ちなみに、自動的にコンボボックス1のListFillRangeプロパティを設定するプログラムです。 Sub SetComboBox1List() Const dataSheet = "Sheet2" ComboBox1.ListFillRange = dataSheet & "!A1:B" & Sheets(dataSheet).Cells(Sheets(dataSheet).Rows.Count, 1).End(xlUp).Row ComboBox2.ListIndex = -1 End Sub
その他の回答 (6)
- imogasi
- ベストアンサー率27% (4737/17068)
VBAであれば関数MATCHが使えます。 A列 B列 C列 D列 シャーペン 10束 50束 ボールペン 10束 50束 シャー芯 100個 1000個 消しゴム 100個 1000個 ・・ を作っておき シートにコンボ1、コンボ2を張り付ける。 標準モジュール Sub test01() For i = 1 To 5 Worksheets("Sheet1").ComboBox1.AddItem Cells(i, "G") Next i End Sub を実行。 Sheet1のコントロールのイベントに Private Sub ComboBox1_Change() MsgBox Worksheets("sheet1").ComboBox1.Value For j = 8 To 8 + 4 x = Application.WorksheetFunction.Match(Worksheets("sheet1").ComboBox1.Value, Worksheets("Sheet1").Range("G1:G10"), 0) If Cells(x, j) = "" Then Exit Sub Else Worksheets("sheet1").ComboBox2.AddItem Cells(x, j) End If Next j End Sub
- fumufumu_2006
- ベストアンサー率66% (163/245)
ANo.4です。 >Private Sub ComboBox1_Change() >ここがコンパイルエラーになるので >1を2に変更したところコンボボックス1に >A列が反映されたのですが、B列には何も反映されてきません 「名前が適切ではありません.ComboBox1_Change」というエラーなら、同じウインドウ内に Private Sub ComboBox1_Change() ・・・ End Sub のモジュールが既にないか確認してください。 または、2つのコンボボックスのオブジェクト名がComboBox1とComboBox2になっているか確認してください。 通常新規のユーザーフォームに2つのコンボボックスを作るとComboBox1とComboBox2になります。 しかし、既にあるコンボボックスを削除して新たに作成したりすると違う名前になります。 サンプルはオブジェクト名がComboBox1とComboBox2であるという前提で作成しています。 プロパティウインドウのオブジェクト名の所で変更できます。 慣れたらオブジェクト名を「cmb商品」「cmb数量」とかにしてプログラムを作ると、下のようになって意味がわかりやすくなります。 '商品数選択の設定 Private Sub cmb商品_Change() Const dataSheet = "Sheet2" '「Sheet2」も「商品コンボデータ」とかに変えるとわかりやすい Dim col As String col = cmb商品.List(cmb商品.ListIndex, 1) cmb数量.RowSource = dataSheet & "!" & col & "1:" & col & Sheets(dataSheet).Cells(Sheets(dataSheet).Rows.Count, col).End(xlUp).Row cmb数量.ListIndex = -1 End Sub '初期設定 Private Sub UserForm_Initialize() '商品選択の初期化 Const dataSheet = "Sheet2" cmb商品.RowSource = dataSheet & "!A1:B" & Sheets(dataSheet).Cells(Sheets(dataSheet).Rows.Count, 1).End(xlUp).Row cmb商品.ListIndex = -1 End Sub
- fumufumu_2006
- ベストアンサー率66% (163/245)
ANo.4です。 >ユーザーフォームのComboBox1のRowSourceプロパティに >Sheet2!A1:B4 >と入力してください。 UserForm_Initializeで自動的に設定しているので、上の部分いりません。 設定していても問題ないですけれど。
- fumufumu_2006
- ベストアンサー率66% (163/245)
ANo.3です。 ユーザーフォームの場合はListFillRangeがRowSourceになります。 Sheet2はそのままです。 ユーザーフォームのComboBox1のRowSourceプロパティに Sheet2!A1:B4 と入力してください。 vba部分は 'ComboBox2設定 Private Sub ComboBox1_Change() Const dataSheet = "Sheet2" Dim col As String col = ComboBox1.List(ComboBox1.ListIndex, 1) ComboBox2.RowSource = dataSheet & "!" & col & "1:" & col & Sheets(dataSheet).Cells(Sheets(dataSheet).Rows.Count, col).End(xlUp).Row ComboBox2.ListIndex = -1 End Sub 'ComboBox1設定 Private Sub UserForm_Initialize() Const dataSheet = "Sheet2" ComboBox1.RowSource = dataSheet & "!A1:B" & Sheets(dataSheet).Cells(Sheets(dataSheet).Rows.Count, 1).End(xlUp).Row ComboBox2.ListIndex = -1 End Sub これで試してみてください。
補足
たびたびありがとうございます。 Private Sub ComboBox1_Change() ここがコンパイルエラーになるので 1を2に変更したところコンボボックス1に A列が反映されたのですが、B列には何も反映されてきません。 どのように対処するのが宜しいでしょうか。 お手数をお掛け致しますがお願い致します。
- onlyrom
- ベストアンサー率59% (228/384)
質問者のコードでは、Combo1の選択肢が増えるに比例して、 コードも増えていくうえにそのたびにコードの書き換えが 必要になり、汎用的ではありません。 このような場合には以下のようなテーブルを用意し、 それを参照させるようにするのが一般的だと考えます。 Sheet2 に次のようなテープルを作成しておき、 これをCombo1の選択値によりCombo2にセットする。 ____A___B___C___D__ 1__りんご_みかん_バナナ_レモン 2__55箱_33個_24房_35コ 3__66箱_53個_34房_45コ 4__77箱_73個_44房____ 5__88箱_93個________ 6__99箱____________ で、以下のコードを無条件?にコピペ。 '------UserFormのInitializeイベント---------- Private Sub UserForm_Initialize() Dim C As Integer With Sheets("Sheet2") ComboBox1.Clear For C = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column ComboBox1.AddItem .Cells(1, C).Value Next C End With End Sub '---------ComboBox1のChangeイベント ------- Private Sub ComboBox1_Change() Dim Clm As Integer Dim R As Long With Sheets("Sheet2") ComboBox2.Clear Clm = .Rows(1).Find(ComboBox1.Value, , xlValues, xlWhole).Column For R = 2 To .Cells(.Rows.Count, Clm).End(xlUp).Row ComboBox2.AddItem .Cells(R, Clm).Value Next R End With End Sub '------------------------------------------- テーブルを使うと質問のようにシャーペン、ボールペンが Combo2において同じ選択肢を取るとしても、変換テーブル のシャーペン、ボールペンのところに、同じ選択肢を入れ ておけば、わざわざ、IF文を使う必要がなくなるわけです。 また、選択肢をセットするときには、Listプロパティや、 RowSourceプロパティという便利なものがありますので、 序にそれも調べておきましょう。 ●Listプロパティを使う方法 '---------------------------------------------- Private Sub UserForm_Initialize() Dim Rng As Range With Sheets("Sheet2") Set Rng = .Cells(1, .Columns.Count).End(xlToLeft) ComboBox1.List = WorksheetFunction.Transpose(.Range("A1", Rng).Value) End With End Sub '--------------------------------------------- Private Sub ComboBox1_Change() Dim Clm As Integer Dim LastRow As Long With Sheets("Sheet2") Clm = .Rows(1).Find(ComboBox1.Value, , xlValues, xlWhole).Column LastRow = .Cells(.Rows.Count, Clm).End(xlUp).Row ComboBox2.List = .Range(.Cells(2, Clm), .Cells(LastRow, Clm)).Value End With End Sub '------------------------------------------- 以上。
お礼
拡張性を考えたときにはNo3の方のものが 良いと考えそちらでやってみたいと思います。 御教示ありがとうございました。
Private Sub ComboBox1_Change() Dim strSelValue As String Dim intSelGroup As Integer If Len(Me.ComboBox1.Value & "") Then strSelValue = Me.ComboBox1.Value intSelGroup = 2 - Abs(InStr(1, "シャーペン/ボールペン", strSelValue, vbTextCompare) > 0) Me.ComboBox2.Clear Me.ComboBox2.AddItem CutStr("10束/100コ", "/", intSelGroup) Me.ComboBox2.AddItem CutStr("50束/1000コ", "/", intSelGroup) Me.ComboBox2.ListIndex = -1 End If End Sub 改善点1、Me.ComboBox1.Value がヌル値の場合はComboBox2の再設定をしていない。 改善点2、Me.ComboBox1.Value の参照を一度としている。 strSelValue への代入は事実上必要ありません。(ここでは、コードを簡略化する効果のみ!) 改善点3、選択されたグループが1か2かを判定する行を設けでIF THEN の分岐を無用にしている。 改善点4、ムダなスタイル設定と二重クリアのバグを訂正。 改善点5、CutStr関数を利用し、1と2で追加するアイテムを判りやすくしている Me.ComboBox2.ListIndex = 0 普通は、Me.ComboBox2の先頭アイテムが選択された状態で初期化すると思います。 なお、標準モジュールに以下のCutStr関数を追加してテストしています。 Public Function CutStr(ByVal Text As String, _ ByVal Separator As String, _ ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function
お礼
ありがとうございます。 うまくいきませんでした。^^; No3方の方法でやってみたいと思います。
関連するQ&A
- EXCEL VBA コンボボックスでのLISTINDEXの値
初めて質問させていただきます。 EXCEL VBAでコンボボックスを設定したときのLISTINDEXの値についてですが、 コンボボックスがフォーム内に3つ(ComboBox1,2,3)あり、次のようなコードの入力を行い、 ComboBox1 Sub Userform_Intialize() With CcomboBox1 AddItem"AAA" '・・・ここの値は0ですね AddItem"BBB" '・・・ここの値は1ですね End With End Sub sub ComboBox1_Change() Me.combobox2.Clear Select Case Me.ComboBox1.ListIndex Case 0 Me.ComboBox2.AddItem "2AAA" '・・・ここの値は0ですね Me.ComboBox2.AddItem "2BBB" '・・・ここの値は1ですね Case 1 Me.ComboBox2.AddItem "2CCC" '・・・ここの値は何になりますか? Me.ComboBox2.AddItem "2DDD" '・・・ここの値は何になりますか? End Select End Sub このcombobox2の4つの項目から、 更にcombobox3の選択項目に分岐するように設定したいのです。 わかりやすいように、ComboBox3もComboBox2のように作成したいのですが、 このように入力した場合、ComboBox2で"2CCC"を選択した場合、 ListIndexの値が2ではないようなのです。 この"2CCC"と"2DDD"のListIndex値はいくつになるのでしょうか? どなたか教えて下さい。
- ベストアンサー
- オフィス系ソフト
- Excel VBAでコンボボックスで選択
コンボボックスで選択したいと思っていますがうまくいきません。 教えてください。 Private Sub userform_initialize() With ComboBox2 .Font.Size = 12 .AddItem "A" .AddItem "B" .AddItem "C" End With If ComboBox2 = "A" Then With ComboBox3 .Font.Size = 12 .AddItem "a-1" .AddItem "a-2" End With ElseIf ComboBox2 = "B" Then With ComboBox3 .Font.Size = 12 .AddItem "b-1" .AddItem "b-2" End With Else: ComboBox2 = "C" With ComboBox3 .Font.Size = 12 .AddItem "c-1" .AddItem "c-2" End With End If End Sub コンボボックス2で"A"を選んだら、コンボボックス3には"a-1とa-2"の選択したい のですが、"c-1,c-2"しかでません。よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- Excel VBAのコンボボックス
お世話になります。 コンボボックス1と2と3は選択されますが コンボボックス4には何の表示もされません。 選択して条件設定は4つ以上できないのでしょうか? Dim ITE As Variant Dim flg As Variant Private Sub ComboBox3_Change() 'ComboBox4セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text KEY3 = Me.ComboBox3.Text Me.ComboBox4.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 Then ITE = .Cells(ico, 4).Value flg = 0 For I = 0 To Me.ComboBox4.ListCount - 1 If ITE = Me.ComboBox4.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox4.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox4.SetFocus End Sub
- ベストアンサー
- その他(プログラミング・開発)
- エクセルVBA コンボボックスの値の転記
エクセルVBAの質問です。 ユーザーフォームを表示し 年を選択するコンボボックス1 月を選択するコンボボックス2 を入力してもらい ユーザーフォームを閉じるときに sheet1のワークシートのC2セルに 「コンボボックス1の値」+「年」+と「コンボボックス2の値」+「月」をつなげて 入力できるというようなマクロを考えています。 下記の様に考えてみたのですが、 うまく入力できませんでした。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "2021" .AddItem "2022" .AddItem "2023" .AddItem "2024" End With With ComboBox2 .AddItem "1" .AddItem "2" .AddItem "3" .AddItem "4" .AddItem "5" .AddItem "6" .AddItem "7" .AddItem "8" .AddItem "9" .AddItem "10" .AddItem "11" .AddItem "12" End With Private Sub CommandButton1_Click() 'ユーザーフォームを閉じる Unload UserForm1 'ユーザーフォームの値をセルC2に入力 With Worksheets("sheet1") .Cells(2, 3).Value = "ComboBox1.Text" & "月" & "ComboBox2.Text" & "日" End With End Sub どのように修正すればいいでしょうか? よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- Excel コンボボックス2つ以上の時のコード
ユーザーフォームでコンボボックスを2つ作ったのですが、1つだけのときはうまくいったのですが、二つ目をつくったら、エラーが出てしまいました。 コード入力は、Initializeに入力してあります。 Private Sub UserForm_Initialize() ComboBox1.Style = fmStyleDropDownCombo ComboBox1.RowSource = "sheet1!F2:F7" ComboBox1.ListIndex = -1 End Sub Private Sub UserForm_Initialize() ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "sheet2!B2:B3" ComboBox2.ListIndex = -1 End Sub コンボボックス1だけはうまくいったのですが、コンボボックス2をつくったら名前が適切でありませんとエラーがでました。 どのようにしたらいいですか?教えてください。
- ベストアンサー
- オフィス系ソフト
- Excel:VBAでコンボボックスを活用する方法
はじめまして。Excel2000でアンケートシートを作りたいと思っています。 その回答をコンボボックスから選ぶようにしたいのですが、「違う質問だけど同じ選択肢」というのがたくさんあるので簡潔にしたいのです。 このサイト等ネットで調べるとコントロールに変数を持たせる方法として Control(ComboBox & i)とか Me(ComboBox & i) というのを目にしましたが、どちらもこの状態には該当しないのかうまくいきませんでした。 コンボボックスごとにソースを作るしかないのでしょうか? 理想としてはforループでコンボボックスの回数だけ回して、if文でComboBox1と3と4と7には○○○、2と5と6には△△△を表示するようにできたらいいなぁと思っています。 (あくまで理想のソースです。) For i = 1 To 30 If i = 1 Or 3 Or 4 Or 7 Then With ComboBox & i(←ここが知りたいです☆) .Clear .AddItem "非常に重要" .AddItem "重要" .AddItem "少し重要" .AddItem "重要ではない" End With ElseIf i = 2 Or 5 Or 6 Then With ComboBox & i(←ここが知りたいです☆) .Clear .AddItem "はい" .AddItem "いいえ" End With End If Next i いかがでしょうか?☆部分をどうにかすることで解決するのでしょうか?他に方法があったらぜひご教示ください。 そもそもコンボボックスの作り方にも自信がありません。 以前に少しだけVBを経験してますが、ほぼ初心者です。 よろしくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- Excel VBAのコンボボックスにて条件で絞込みをしたいのですが
いつもお世話になっています。 コンボボックスの3個目が表示されません。 コンボボックス1と2はうまく表示されます。 よろしくお願いします。 Private Sub ComboBox2_Change() Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KET2 = Me.ComboBox2.Text KET3 = Me.ComboBox3.Text Me.ComboBox3.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 Then ITE = .Cells(ico, 3).Value flg = 0 For I = 0 To Me.ComboBox3.ListCount - 1 If ITE = Me.ComboBox3.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox3.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox3.SetFocus End Sub
- ベストアンサー
- その他(プログラミング・開発)
- VBA 都道府県から市を選択し詳細を表示させる
またお世話になります。都道府県から市を選択するとその詳細を表示させたいのですが、「‘ここでエラーが出る」のところでエラーがでます。 「詳細」のシートには都道府県を入力したセルに名前を付け、市を入力したセルにも市ごとに名前を付けました。都道府県を選択し、市を選択するとエラーが出ます。 説明が足りないかとは思いますが、どなたか教えてください。 以下、入力したセルです。 A B C D 1 北海道 赤平市 リンゴ ミカン 2 青森 阿寒郡 ブドウ モモ 3 岩手 旭川市 イチゴ 以下、今の現状です。 Private Sub UserForm_Initialize() ’都道府県を選択 Me.ComboBox1.RowSource = "都道府県" Me.ListBox2.RowSource = "" End Sub Private Sub ComboBox1_Change() ‘都道府県が選択されたらリストボックス2に市を表示させる Me.ListBox2.Value = "" Me.ListBox2.RowSource = Me.ComboBox1.Value End Sub Private Sub ListBox2_Click() 'リストボックス2に表示された市を選択すると詳細をテキストボックス7に表示させる Dim r As Long With ListBox2 If .ListIndex > -1 Then r = .List(.ListIndex, 1) = 0 ‘ここでエラーが出る TextBox7.Value = Worksheets("詳細").Cells(r, 3) ' TextBox8.Value = Worksheets("詳細").Cells(r, 4) ' End If End With End Sub
- ベストアンサー
- Visual Basic
- VBAコンボボックスについて
初歩的な質問ですが もしコンボボックスで1行目を選べば~をする。 2行目を選べば~をする。といったマクロを考えています。 if combobox1.listindex=1 と記入するだけでは機能しません。 with combobox.listindex=1 とすると機能しますがwithを文頭に入れるとifが使えないため条件で項目を分けれませんが、どういった表現に変えたらよいでしょうか?
- ベストアンサー
- Excel(エクセル)
- オプションボタン選択でコンボボックス有効
ExcelVBAでユーザーフォームを作成しているのですが、昨日までうまく動作していたことが、突然動かなくなりました。 オプション1を選択 ↓ コンボボックス1有効 ※他のコンボボックスは無効 ↓ オプション2を選択 ↓ コンボボックス2有効 ※コンボボックス1も含め他のコンボボックスは無効 という感じで動作させたいです。 書いたコードはこんな感じです。 Private Sub OptionButton1_Click () Dim i As Long Dim lastRow As Integer lastRow = Cells(Row.Count, 1).End(xlUp).Row If OptionButton1.Value = True Then OptionButton1.Enabled = True With ComboBox1 If ComboBox1 = "" Then For i = 2 To lastRow .AddItem Worksheets("sheet1").Cells(i, 1).Value Next i End If End With ComboBox1.ListIndex = 0 ComboBox2.Enabled = False ComboBox3.Enabled = False End If End Sub コードの間違いや改善点などありましたら教えて下さい。 よろしくお願いします。
- 締切済み
- Visual Basic
補足
御教示ありがとうございます。 Private Sub ComboBox1_Change() コンパイルエラーが発生してしまいます。 シートにコンボボックス設置しているのではなく ユーザーフォームに設置しているのですが この場合、プログラムが変わってきますでしょうか。 宜しくお願い致します。