• ベストアンサー

エクセル 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

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

  • ベストアンサー
回答No.3

こんなのはどうでしょうか? 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

pumifumi
質問者

補足

御教示ありがとうございます。 Private Sub ComboBox1_Change() コンパイルエラーが発生してしまいます。 シートにコンボボックス設置しているのではなく ユーザーフォームに設置しているのですが この場合、プログラムが変わってきますでしょうか。 宜しくお願い致します。

その他の回答 (6)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.7

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

回答No.6

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

回答No.5

ANo.4です。 >ユーザーフォームのComboBox1のRowSourceプロパティに >Sheet2!A1:B4 >と入力してください。 UserForm_Initializeで自動的に設定しているので、上の部分いりません。 設定していても問題ないですけれど。

回答No.4

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 これで試してみてください。

pumifumi
質問者

補足

たびたびありがとうございます。 Private Sub ComboBox1_Change() ここがコンパイルエラーになるので 1を2に変更したところコンボボックス1に A列が反映されたのですが、B列には何も反映されてきません。 どのように対処するのが宜しいでしょうか。 お手数をお掛け致しますがお願い致します。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

質問者のコードでは、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 '------------------------------------------- 以上。    

pumifumi
質問者

お礼

拡張性を考えたときにはNo3の方のものが 良いと考えそちらでやってみたいと思います。 御教示ありがとうございました。

noname#140971
noname#140971
回答No.1

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

pumifumi
質問者

お礼

ありがとうございます。 うまくいきませんでした。^^; 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

  • VBAコンボボックスについて

    初歩的な質問ですが もしコンボボックスで1行目を選べば~をする。 2行目を選べば~をする。といったマクロを考えています。 if combobox1.listindex=1 と記入するだけでは機能しません。 with combobox.listindex=1 とすると機能しますがwithを文頭に入れるとifが使えないため条件で項目を分けれませんが、どういった表現に変えたらよいでしょうか?

  • オプションボタン選択でコンボボックス有効

    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 コードの間違いや改善点などありましたら教えて下さい。 よろしくお願いします。

専門家に質問してみよう