オートフィルタをフォーム上(VBA)で実現するには

このQ&Aのポイント
  • Excel2003を使用している場合、VBAを使用することでオートフィルタをフォーム上で実現することができます。
  • ただし、現在のコードでは、絞り込み後にリストを更新していないため、最初の選択肢が残ったままとなってしまいます。
  • 改善のためには、絞り込み後に各コンボボックスのリストを更新する処理を追加することが必要です。
回答を見る
  • ベストアンサー

オートフィルタをフォーム上(VBA)で実現 2回目

http://okwave.jp/qa/q8423348.html 前回も、オートフィルタをフォーム上で実現させる方法について 質問させていただきました。 Excel2003を仕様しております。 一通り、オートフィルタをフォーム上で再現することは出来たのですが、 使い方が悪いのか、上手く表示できないことがあります。 例) ユーザーフォーム上にCombobox1~Combobox3まであります。 Comboboxどれかが変更されたら、空のコンボボックスのリストを再取得します。 ----------------------------------------------- Sub Combobox_Renew_ChangeJob(ByVal ComboboxName As Object, ByVal ColumnNumber As Long) Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") If ComboboxName = "" Then 'コンボボックスが空だった場合 .Select .Range("A1").AutoFilter Field:=ColumnNumber 'フィルター解除! ElseIf ComboboxName <> "" Then 'コンボボックスが空じゃない場合 .Select .Range("A1").AutoFilter Field:=ColumnNumber, Criteria1:=ComboboxName.Text End If Result = WorksheetFunction.Subtotal(3, Range("B:B")) 'B列の可視セルがいくつあるか If Result = 1 Then MsgBox "一致するデータはありませんでした。" & vbCrLf & " 再度絞り込みなおしてください。" .Select .Range("A1").AutoFilter Field:=ColumnNumber 'フィルター解除! ComboboxName = "" End If End With Call ComboBox_Renewal 'コンボボックス更新 End Sub ------------------------------------------------------------ Sub ComboBox_Renewal() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) Dim LastData As Long With ThisWorkbook.Worksheets("データ") .Select LastData = Cells(Rows.Count, 2).End(xlUp).Row 'B列最終行を取得 If (Me.ComboBox1 = "") Then Me.ComboBox1.Clear Me.ComboBox1.List = Module1.Get_Unique_and_Visible_List(.Range("E2:E" & LastData)) '[E] Me.ComboBox1.AddItem "" Else Result = Combo1.ListIndex Me.ComboBox1.Clear Me.ComboBox1.SetFocus End If If (Me.ComboBox2 = "") Then Me.ComboBox2.Clear Me.ComboBox2.List = Module1.Get_Unique_and_Visible_List(.Range("C2:C" & LastData)) '[C] Me.ComboBox2.AddItem "" End If If (Me.ComboBox3 = "") Then Me.ComboBox3.Clear Me.ComboBox3.List = Module1.Get_Unique_and_Visible_List(.Range("D2:D" & LastData)) '[D] Me.ComboBox3.AddItem "" End If End With End sub ------------------------------------ Private Sub ComboBox1_AfterUpdate() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") Call Combobox_Renew_ChangeJob(ComboBox1, .Range("E1").Column) End With End Sub Private Sub ComboBox2_AfterUpdate() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") Call Combobox_Renew_ChangeJob(ComboBox2, .Range("C1").Column) End With End Sub Private Sub ComboBox3_AfterUpdate() Application.ScreenUpdating = False '画面更新しない(ちらつき防ぐ) With ThisWorkbook.Worksheets("データ") Call Combobox_Renew_ChangeJob(ComboBox3, .Range("D1").Column) End With End Sub ----------------------------------------- 上記の方法を使っていますが、 Comboboxに値を全て入れたあと、 絞り込みされていると考え、リストを更新しておりません。 そのため、最初のほうにコンボボックスにデータを入力したものは 選択できてしまいます。 一番最初に選んだComboboxは、 リストが全て残っている状態です。 そのため、他のComboboxで絞り込んだ後、 一番最初に選んだComboboxでは他の値が選択できてしまいます。 説明が下手で分かりにくいかもしれませんが… 何か良い改善方法があれば、教えて頂きたいです! よろしくお願い致します!!

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

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

こんにちは。 申し訳ないのですが、個人的感想としては、ここまで作ってしまったら、作った当人以外、直す人はいないと思ったほうがよいかもしれません。 通常、これは、小さなブックを作り、メニューなどを非表示にしたワークシートだけで済ませるほうが普通だと思います。こういう点では、Excel2003の方が自由度が高いはずです。 それから、コードのいくつかの点で、可動するようには思えない部分があるのと、生きていない部分があるように思いました。 私自身は、このようなことが起きた場合は、頑張ることをしないで、全面的に最初からやり直すことをしています。要するに、設計段階での考え方の問題が多いわけです。 ただ、よくみると、分かりにくい部分はあるものの、コードとしては単純です。 >Sub Combobox_Renew_ChangeJob(ByVal ComboboxName As Object, ByVal ColumnNumber As Long) 「ByVal ComboboxName As Object 」 というのは、ありえるのでしょうか。 ByVal では、Object はパラメータとしてひき受けられないはずです。それに、ComboboxName は、暗黙のValue値になっています。 それで、わたし流に、全面的に書き換えてみました。重複するプロシージャ名はありません。 ComboBox にデータを入力して、Enterで起動します。ただ、個人的に、VBAはかなり忘れつつあります。しかし、本来、これはクラスから作ったほうが良いような気がしています。Indexが取れないのをコントロール名から取得しているからです。 なお、本質問とは関係ありませんが、先日、レスが付かずに、削除された質問についても、回答は作りましたが、そのままになってしまいました。完全ではないのですが、作りましたので、もし興味があれば、ここに出しておきます。 '//---- 'UserFormモジュールのみ Dim shData As Worksheet Private Sub UserForm_Initialize()  Set shData = ThisWorkbook.Worksheets("データ") End Sub Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)  Dim Ar() As Variant  If KeyCode <> 13 Then Exit Sub  With shData  If .AutoFilterMode = False Then Exit Sub   ComboBoxReflesh  End With End Sub Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)  Dim Ar() As Variant  If KeyCode <> 13 Then Exit Sub  With shData  If .AutoFilterMode = False Then Exit Sub   ComboBoxReflesh  End With End Sub Private Sub ComboBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)  Dim Ar() As Variant  If KeyCode <> 13 Then Exit Sub  With shData  If .AutoFilterMode = False Then Exit Sub   ComboBoxReflesh  End With End Sub ' Sub ComboBoxReflesh() Dim AcCombo As Object Dim i As Long, k As Long Dim cb As Control   If TypeName(ActiveControl) <> "ComboBox" Then Exit Sub   Set AcCombo = ActiveControl   'ComboBox のインデックスを取得(二桁有効)   i = Application.Max(Val(Right(AcCombo.Name, 2)), Val(Right(AcCombo.Name, 1)))   '列への変換   Select Case i    Case 1: k = 5    Case 2: k = 3    Case 3: k = 4    Case Else: k = 99   End Select   With shData   If AcCombo.Text = "" _    Or Application.CountIf(.AutoFilter.Range.Columns(k), AcCombo.Text) = 0 _    Or k = 99 Then    MsgBox "一致するデータはありませんでした。" & vbCrLf & _    " 再度絞り込みなおしてください。", vbExclamation    .AutoFilter.ShowAllData    AcCombo.Value = ""    KeyCode = 0   Else    .AutoFilter.ShowAllData    ComboboxClear i    ComboBoxInput i, k, ActiveControl.Value   End If   End With End Sub Sub ComboBoxInput(ComboNo As Long, FldNo As Long, CBVal As Variant) Dim Ar() As Variant '出てきた配列を、ComboBox に戻す  With shData  .Range("A1").AutoFilter Field:=FldNo, Criteria1:=CBVal  MakingList .AutoFilter.Range.Columns(5), Ar()  If ComboNo <> 1 Then ComboBox1.List = Ar()  MakingList .AutoFilter.Range.Columns(3), Ar()  If ComboNo <> 2 Then ComboBox2.List = Ar()  MakingList .AutoFilter.Range.Columns(4), Ar()  If ComboNo <> 3 Then ComboBox3.List = Ar()  End With End Sub Sub MakingList(Rng As Range, Ar() As Variant) 'AutoFilter の内容から一意のデータを出す  Dim c As Range  Set Rng = Rng.Offset(1).Resize(Rng.Rows.Count - 1)  ReDim Ar(0)  For Each c In Rng.SpecialCells(xlCellTypeVisible)   If c.RowHeight > 0 Then    If UBound(Filter(Ar, c.Value)) = -1 Then     Ar(i) = c.Value     i = i + 1     ReDim Preserve Ar(i)    End If   End If  Next c  ReDim Preserve Ar(i - 1) End Sub Sub ComboboxClear(ComboNo As Long) '前のValueを消す--データの消去は不要 Dim cb As Control    For Each cb In Me.Controls     If TypeName(cb) Like "ComboBox*" Then      If Application.Max(Val(Right(cb.Name, 2)), Val(Right(cb.Name, 1))) <> ComboNo Then       cb.Value = ""      End If     End If    Next cb End Sub '//----x

satoron666
質問者

お礼

回答ありがとうございます。 Enterで起動するんですね… んー。Enterじゃないと起動できない…という事でしょうか? 中々…Enterで決定していく人は居ないので 難しそうな気もします。 1文1文、意味を理解しながら 自分のコードと何が違うのか見比べて 勉強していこうと思います。 回答ありがとうございました!

その他の回答 (2)

回答No.3

こんにちは。 >コンボボックスは、自分で入力が出来ない形式になってます。 それでしたら、ComboBox のKeyDownイベントではあまりうまくないですね。 本当は、CombBox の部分を全面的に書き換えたほうがよいかもしれません。 もともと、同じ仕様のマクロだけは避けたいと思ったのが発端ですから。 ユーザーがCombBox のリストを選択するものでしょうか。 ただ、CombBox で、Change イベントは辞めたほうがよいということだけは言っておきます。 理由は、何らかの加減で、ComboBoxのリストが開いたまま止まってしまいます。 AfterUpdateでも、悪くはないのですが、これは、厳密には、次のコントロールに移る時に発生しているような記憶があります。実用性からすると、何か「確定」という意志を払わすイベント(例:Click, DoubleClick等、Enter, Tab)を設けないと、そのまま先に動いてしまいます。 ただ、そもそも、自コントロールの中身のリストを、自分のイベントで、内容を書き換えるということは考えたことはありません。他にも、ListBoxのように、それにふさわしいものがありそうな気がしますが、それは、レイアウトや現場のユーザーに依存しますから、私からは、なんとも言えません。

satoron666
質問者

お礼

回答ありがとうございます。 なんとなく、どうすればいいのか見えてきました。 もう少しじっくり考えてみたいと思います。 ありがとうございました!

回答No.2

こんにちは。 >Enterで起動するんですね… 別に何でもいいのですが、「入力」して「決定」という判断は必要ですね。 実際に、AterUpdate は、あまり使われません。 別に何でもよいとは思うのですが、文字を入れたら、すぐに起動するという方法を私は選ばないのは、 入力の間違いもあるからです。 例えば、見つからなかった場合にも、次のコントロールに 行ってしまうよりも、そこにカーソルがとどまったほうがよいのでは? そういう時の独特のテクニックを使いました。

satoron666
質問者

お礼

回答ありがとうございます。 言い忘れておりましたが、 コンボボックスは、自分で入力が出来ない形式になってます。 頂いた意見を参考に、考え直してみたいと思います。 ありがとうございました!

関連するQ&A

  • VBA 実行時エラー'1004' オートフィルタ

    お世話になります。Excel2003を使っております。 初歩的なことかもしれませんが、 原因がよくわかっていないため、教えて下さい。 フォームにあるコンボボックスのデータ 特定のシートの絞り込みを行います。 '========================= If ComboBox1 <> "" Then '空じゃないときに実行 With ThisWorkbook.Worksheets("データ") .Select .Range("A1").Select .Range("A1").AutoFilter Field:=ThisWorkbook.Worksheets("データ").Range("E1").Column, _ Criterial:=Me.ComboBox1.Text End With End if '========================= 上記のようなプログラムを書いてみましたが、 何故かエラーが出ます。 このような書き方ではまずいのでしょうか? 前までは、 '========================= Worksheets("データ").Select '基データを選択 If ComboBox1.Text <> "" Then '製品名が空じゃない場合 Selection.AutoFilter Field:=Range("E1").Column, _ Criteria1:=ComboBox1.Text End If '================== 上記の方法で行っていました。(上手くいっていました。) SELECT(Selection)を使うのはあまり良くないと聞いたため このようにWithを使って書いているのですが 実行時エラー '1004' アプリケーション定義またはオブジェクト定義のエラーです。 と出ます。 回答よろしくおねがい致します。

  • エクセル VBAについて。

    Private Sub ComboBox2_Change() On Error Resume Next With Me.ComboBox2 If .ListCount < 0 Then Exit Sub If .Value = "" Then Exit Sub Me.Range("K45").Value = _ Worksheets("マスタ").Range(.List(.ListIndex, 1)).Offset(0, 2).Value Me.Range("K48").Value = _ Worksheets("マスタ").Range(.List(.ListIndex, 1)).Offset(0, 4).Value End With End Sub これをマスタのU列とW列を表示したい場合、どこを変えれば良いのでしょうか? 今はD列とF列が表示されております。

  • 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

  • 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

    いつも大変お世話になっております。 Excel2003を使用しております。 フォーム上で、オートフィルターのような機能を作りたいと思っています。 http://okwave.jp/qa/q8423348.html 過去の質問のプログラムを何度も使わせて頂いております。 フィルターをかけたら、可視セルを抽出し、コンボボックスに登録…ということを しています。 フォーム上のコンボボックスが変更されたら フィルターをかけ、コンボボックスのリストを更新するようにしていますが、 更新したときに、またフィルターをかけてコンボボックスを更新してしまい どうしたら上手く処理がいくのか分からなくなってしまいました。 現状、 Combobox1_Changeのとき、  If Combobox1<>"" Then   フィルターをかける   コンボボックスのリストを抽出する   コンボボックスを更新する  Else   フィルターを全開にする   コンボボックスのリストを抽出する   コンボボックスを更新する  End if こういった手段をとっています。 しかし、このままですとコンボボックスを更新するときに 毎回フィルターが全開?になってしまいます。 何か良い方法があれば、教えて下さい。 よろしくお願い致します。

  • ユーザーフォームをWorkSheet(1)に固定

    ●質問の主旨 WorkSheet(1)(「柴田8月分」)にユーザーフォームを固定的に 表示させつつ、WorkSheet(1)以降のWorkSheet(2)、 WorkSheet(3)、WorkSheet(4)の表を参照しながら ComboBox1、ComboBox2、ComboBox3にリストを 選択して、データベースに入力したいと考えています。 以下のコードをどのように書き換えれば良いでしょうか? ご教示のほどよろしくお願い申し上げます。 ●質問の補足 現在のコードでは、ComboBox1、ComboBox2、ComboBox3を それぞれ選択しているとユーザーフォームがそれぞれ WorkSheet(2)、WorkSheet(1)(顧客リスト)、WorkSheet(3)(社員名)、 WorkSheet(4)(大分類)にとんでしまいます。 転記入力が終了すると、また手作業でWorkSheet(1)に戻らなければなりません。 その手作業を回避したいと考えています。 なお添付画像はComboBox1の選択前なのでWorkSheet(1) に留まってくれています。 ●コード Option Explicit 'ユーザーフォームの初期化 Private Sub UserForm_Initialize() Dim r As Range Dim n As Range Dim d As Range With Worksheets(2) Set r = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox1 .ColumnCount = 2 .ColumnWidths = ";0" .List = r.Value End With With Worksheets(3) Set n = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox2 .ColumnCount = 2 .ColumnWidths = ";0" .List = n.Value End With With Worksheets(4) Set d = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox3 .ColumnCount = 2 .ColumnWidths = ";0" .List = d.Value End With Set r = Nothing Set n = Nothing Set d = Nothing TextBox3.Value = Worksheets(1).Range("A2").Value + 1 txtdate = Date OptionButton1.Value = True End Sub 'ComboBox1をクリックしたときの処理 Private Sub ComboBox1_Click() Worksheets(2).Select With Me.ComboBox1 Me.Label19.Caption = .List(.ListIndex, 1) Worksheets(2).Select Replace:=False End With End Sub 'ComboBox2をクリックしたときの処理 Private Sub ComboBox2_Click() Worksheets(3).Select With Me.ComboBox2 Me.Label20.Caption = .List(.ListIndex, 1) Worksheets(3).Select Replace:=False End With End Sub 'フォームからデータベースへの転記 Private Sub CommandButton3_Click() Dim Rowpos As Long Dim ColPos As Long Rowpos = Worksheets("柴田8月分").Range("a10000").End(xlUp).Row ColPos = 1 Rowpos = Rowpos + 1 With Worksheets("柴田8月分") .Cells(Rowpos, ColPos) = TextBox3.Value .Cells(Rowpos, ColPos + 1) = txtdate.Value .Cells(Rowpos, ColPos + 2) = Label19.Caption .Cells(Rowpos, ColPos + 3) = ComboBox1.Text .Cells(Rowpos, ColPos + 4) = ComboBox2.Text .Cells(Rowpos, ColPos + 5) = Label20.Caption .Cells(Rowpos, ColPos + 6) = ComboBox3.Text End With 'Noの加算 Dim i As Long For i = 1 To 1 Step 1 TextBox3.Value = TextBox3.Value + 1 Next Call Clearcmb End Sub 'データベース入力後にコンボボックスを空欄にする Private Sub Clearcmb() ComboBox1.Text = "" ComboBox2.Text = "" ComboBox3.Text = "" End Sub 'ユーザーフォームの終了 Private Sub CommandButton5_Click() Unload UserForm1 End End Sub 以上よろしくお願い申し上げます。使用機種はWindowsVistaで、 Excel2007です。私はVBA初心者です。

  • エクセルVBAについて教えてください

    エクセル2003です。 Sheet1     A    B    C     D 1 種類1 商品1 商品A  商品あ 2 種類2 商品2 商品B  商品い 3 種類3 商品3 商品C  商品う  4      商品4 商品D  商品え 5  商品5 商品E  商品お Sheet2   AB CDF     G    H     I 1         種類表示     商品表示  2         種類表示     商品表示  3         種類表示     商品表示  4         種類表示     商品表示  5         種類表示     商品表示  *Sheet2のG1をダブルクリックでSheet1のA列をユーザーフォームのコンボボックス1にてセルに表示  の上挿入 *コンボ1の選択によりコンボ2(Sheet2のI1をダブルクリック)の表示を変更する *コンボ1 種類1 → コンボ2 Sheet1のB列を表示の上セルに挿入 *コンボ1 種類2 → コンボ2 Sheet1のC列を表示の上セルに挿入 *コンボ1 種類3 → コンボ2 Sheet1のD列を表示の上セルに挿入 までは、出来きたのですが、Sheet2の2行目以降も同作業をしたいのですが、、、 Offset等を使用するのでしょうか? あまりわかっていないので詳しく教えて頂ければ幸いです コード Sheet2のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target If .Address = "$F$1" Then UserForm1.Show ElseIf .Address = "$H$1" Then Dim k As Long, myFlg As Boolean, myArray myArray = Array("種類1", "種類2", "種類3") myFlg = False For k = 0 To UBound(myArray) If Range("F1") = myArray(k) Then myFlg = True End If Next k If myFlg = False Or Range("F1") = "" Then MsgBox "種類を選択して", vbOKOnly Range("F1").Select Exit Sub End If UserForm2.Show End If End With End Sub ユーザーフォーム1のコード Private Sub UserForm_Initialize() ComboBox1.RowSource = "sHEET1!A1:A3" End Sub コンボ1のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("F1") = UserForm1.ComboBox1.Text Worksheets("Sheet2").Range("H1") = "" Unload Me End Sub ユーザーフォーム2のコード Private Sub UserForm_Initialize() With UserForm2.ComboBox1 Select Case Worksheets("Sheet2").Range("F1") Case "種類1" .RowSource = "Sheet1!B1:B5" Case "種類2" .RowSource = "Sheet1!C1:C5" Case "種類3" .RowSource = "Sheet1!D2:D5" End Select End With End Sub コンボ2のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("H1") = UserForm2.ComboBox1.Text Unload Me End Sub このコードをいじくってSheet2以降も同作業できるようにお願いします

  • VBA ユーザーフォームのコードについて

    下記の2つのコードの意味について教えて下さい。 Private Sub CommandButton1_Click() If ComboBox1 = "" Then ComboBox1.SetFocus・・・・・1 Exit Sub End If Application.Run (ComboBox1.List(ComboBox1.ListIndex))・・・2 End Sub 1と2がわかりません。 Private Sub UserForm_Initialize() TB = Array("マクロ1", "マクロ2", "マクロ3") Me.ComboBox1.List = TB End Sub 「Private Sub UserForm_Initialize()」と「Array」がわかりません。 よろしくお願いします。

  • 同じコンボボックス、リストボックスを使うには?

    よろしくお願いします。 今、ユーザーフォームを使って製造計画表を作っています。 コンボボックスで会社名、リストボックスで会社ごとの製品名を選択させるとこまで出来ました。 1日に3つの製品を作ることが出来るので、同じ中身のコンボボックス、リストボックスを使って3つ作りたいと思っています。 ユーザーフォームの形的にはこのような感じですが。 1. コンボボックス  リストボックス 2. コンボボックス  リストボックス 3. コンボボックス  リストボックス 今は、1.のとこだけは出来たのですが、2.3.は1.と同じコードをコピーして必要と思われるとこだけをコンボボックス2と変えたりしてみたのですが、上手くいきませんでした。こんなコードですが。 Private Sub UserForm_initialize() 'ComboBox1セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("Sheet1") Do While .Cells(1, ico) <> "" Me.ComboBox1.AddItem .Cells(1, ico).Value ico = ico + 1 Loop End With Me.ComboBox1.SetFocus End Sub Private Sub ComboBox1_Change() 'ListBox1セット Dim ico As Long 'Me.ListBox1.Clear ico = Me.ComboBox1.ListIndex + 1 With ThisWorkbook.Worksheets("Sheet1") Me.ListBox1.List = .Range(.Cells(2, ico), _ .Cells(.Cells(Rows.Count, ico).End(xlUp).Row, ico)).Value End With End Sub VBAも初めたばかりで質問の内容もわかりづらいとも思いますが、よろしくお願いします。

  • 連携する複数のコンボボックスに同じリストを設定

    初心者なので質問がトンチンカンでしたらすみません ユーザーフォームにコンボボックスを計12個配置しています ComboBox1で選択した値に応じてComboBox2のリストが選ばれる ComboBox3で選択した値に応じてComboBox4のリストが選ばれる ・・・・・・・ ComboBox11で選択した値に応じてComboBox12のリストが選ばれる という風に設定したいのですが、コンボボックスの数だけリストの設定を するのが大変なので見よう見まねで下記の様にしてみたのですが全く 動きません。 UserForm_Initializeでイベント発生させてるので動かないのでしょうか? どこがおかしいのかご教授お願いします。 Private Sub UserForm_Initialize() Dim i As Variant Dim Ari As Variant Ari = Array("1", "3", "5", "7", "9", "11") For Each i In Ari If UserForm4.Controls("ComboBox" & i).Value = "車いす" Then With UserForm4.Controls("ComboBox" & i + 1) .ColumnCount = 5 .List = Worksheets("商品マスタ").Range("車いすテーブル").Value End With ElseIf UserForm4.Controls("ComboBox" & i).Value = "車いす付属品" Then With UserForm4.Controls("ComboBox" & i + 1) .ColumnCount = 5 .List = Worksheets("商品マスタ").Range("車いす付属品テーブル").Value End With ElseIf UserForm4.Controls("ComboBox" & i).Value = "特殊寝台" Then With UserForm4.Controls("ComboBox" & i + 1) .ColumnCount = 5 .List = Worksheets("商品マスタ").Range("特殊寝台テーブル").Value End With End If Next End Sub

専門家に質問してみよう