コンボボックスの連動

このQ&Aのポイント
  • VBAを使用して、Excelのコンボボックス上に表示されたデータを選択した際にフィルター絞込みをする方法を調べています。
  • コンボボックスで絞り込んだ後、他の列の重複しないデータをコンボボックスに再表示したいと考えています。
  • また、可視セルの範囲指定やフィルター絞込み結果が空白の場合のメッセージボックス表示にも困っています。
回答を見る
  • ベストアンサー

コンボボックスの連動

こんにちは! 今回もVBAで分からないことがあったため、質問させて頂きます。 Excelは2003を使用しています。 画像のようなデータが、A1:D?まであったとします。 A列、B列、C列などの重複しないデータをプログラムを用いて 同じシート内(例として、「管理」シートとします。)に記載しています。 そのデータをコンボボックス上に表示することはできました。 そして、次にコンボボックス上に表示されたデータを選択した際に、 フィルターで絞込みをするように設定しています。 (図の例でいくと、りんごで絞込み) 「りんご」で絞込みをかけた際に、実際のリスト上にある 重複しないデータをコンボボックスに入れなおしたい?です。 重複しないデータの抽出方法が悪いとは思うのですが、 可視セル(指定列)の重複しないものを書くことはできるのでしょうか? たぶん、重複しないデータを抽出する際の 範囲指定が悪いと思います。 色々書いてわからなくなったため、 やりたいことをまとめさせて頂きます。 ●コンボボックスを押した際にフィルター絞込み(これは出来てます) ●絞り込んだ後、その他の列の重複しないデータをコンボボックスに入れなおす あと別途、 ●可視セル(タイトル行を除く)の範囲選択&データ取得方法(重複しないデータ取得も) ●フィルターをかけた際に、絞込み結果が0(空白)の場合、メッセージボックスを表示 情報不足かもしれませんが、回答よろしくお願い致します。 EndLineは、A1から下に下がった行番号を格納しています。(例)9 ---------------------------------------------- On Error Resume Next 'データを登録する間、エラーを無視する For i = 2 To EndLine '最終行までチェック Mydata.Add Range("B" & i).Value, Range("B" & i).Value '名前の列の重複確認 Next i On Error GoTo 0 '重複していないデータがMydataに格納されていく For Each A In Mydata 'Mydataの内容をセルに書き出す。 Worksheets("管理").Cells(i, ROW_NUMBER).Value = A i = i + 1 Next A End Function ------------------------------------------------- Function Combo_KOUSIN() 'コンボボックスのデータ更新 Dim EndLine As Long Dim i As Long ComboBox1.Clear EndLine = EndCheck("F") ' ”F” 列の行数抽出 For i = 1 To EndLine ComboBox1.AddItem Range("F" & i).Value Next 上と同様に、combobox2,3,4も行う。 F列、G列、H列、I列などに重複しないデータがあります。 それを取得して、ComboBoxに格納します。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

オートフィルタでできる事をわざわざUserFormでやろうという目的は何でしょうか? お示しのコードは全く気にせず書いてみました。重複しないリストはシート上のF~I列?の値は用いず、都度取得しています。 また、オートフィルタの範囲取得は手を抜いているので、E列は空でないと誤動作します。UserFormモジュールです。 Dim sh As Worksheet Dim targetRange As Range 'オートフィルタの見出し行以外の範囲を収納 Dim listRange As Range 'DropButtonClickでリストを設定しているため、イベント重複発生防止用 Dim comboSetFlag(1 To 4) As Boolean Private Sub UserForm_Initialize() Set sh = Sheets(1) Set targetRange = sh.Range("A1").CurrentRegion Set listRange = Intersect(targetRange, targetRange.Offset(1, 0)) End Sub 'コンボボックスは改名しない、お仕着せのComboBox?のままとしています Private Sub UserForm_Terminate() 'sh.AutoFilterMode = False End Sub Private Sub ComboBox1_Change() setAutofilter Me.ActiveControl End Sub '都度全てのComboBoxのリストを設定するのは重いかと思い、ドロップダウンをクリックした時動的にリストを生成させてみた Private Sub ComboBox1_DropButtonClick() setComboBox Me.ActiveControl End Sub '以下ComboBox2~ComboBox4も同様 Private Sub ComboBox2_Change() setAutofilter Me.ActiveControl End Sub Private Sub ComboBox2_DropButtonClick() setComboBox Me.ActiveControl End Sub ’(中略) Sub setAutofilter(myComboBox As Object) Dim myColumnNo As Long ' Dim filteredNo As Long myColumnNo = Val(Replace(myComboBox.Name, "ComboBox", "")) targetRange.AutoFilter field:=myColumnNo, Criteria1:=CStr(myComboBox.Value) ' 重複しないリストを取得してフィルターをかけている以上、該当無しになる事はないのでは? ' filteredNo = Application.WorksheetFunction.Subtotal(3, listRange.Columns(myColumnNo)) ' If filteredNo = 0 Then ' MsgBox "該当無し" ' Exit Sub ' End If comboSetFlag(myColumnNo) = False End Sub Sub setComboBox(myComboBox As Object) Dim myColumnNo As Long ' Dim filteredNo As Long myColumnNo = Val(Replace(myComboBox.Name, "ComboBox", "")) ' 重複しないリストを取得してフィルターをかけている以上、該当無しになる事はないのでは? ' filteredNo = Application.WorksheetFunction.Subtotal(3, listRange.Columns(myColumnNo)) ' If filteredNo = 0 Then Exit Sub If Not comboSetFlag(myColumnNo) Then myComboBox.List = getUniqueList(listRange.Columns(myColumnNo).SpecialCells(xlCellTypeVisible)) comboSetFlag(myColumnNo) = True End If End Sub '重複しないリストの取得は連想配列を用いています。VBA Dictionaryでお調べ下さい。 Function getUniqueList(srcRange As Range) As Variant Dim myCell As Range, myArea As Range Dim myDic As Object Set myDic = CreateObject("Scripting.Dictionary") For Each myArea In srcRange.Areas For Each myCell In myArea.Cells If Not myDic.exists(myCell.Value) Then myDic.Add myCell.Value, "" End If Next myCell Next myArea getUniqueList = myDic.keys Set myDic = Nothing End Function

satoron666
質問者

お礼

回答ありがとうございます。 >オートフィルタでできる事をわざわざUserFormでやろうという目的は何でしょうか? →上司に、オートフィルタのチェックを外したり色々面倒だ  フォームを作って、別シートに抽出した項目を  きれいに並べて書きだして といわれたため、作成しています。 >重複しないリストを取得してフィルターをかけている以上、該当無しになる事はないのでは? 選択した都度重複しないリストを更新しなければならず、その手段がわかっていなかったのです。 目的のものを作ることが出来ました! 回答ありがとうございました。

関連するQ&A

  • コンボボックス 連動 VBA

    VBA初心者です。 ご教授ください。 入力フォームにコンボボックスを4っつ リストボックスを一つ作成し 一つ目のコンボでシートを選択後 二つ目以降のコンボボックスでセル範囲を選択し絞り込み、最終のリストボックスに 絞り込み表示を行い、コマンドボタンにて フィルター操作を行いたいのですが 重複表示させずに、絞り込んでいく方法がうまくいきません。下記コードにコンボボックス3以降も記述したのですが、絞り込みができません。よろしくお願いします。 Private Sub UserForm_Initialize() For i = 2 To Worksheets.Count 'シートの数だけ繰り返す ComboBox1.AddItem Worksheets(i).Name '取得したシート名をリストボックスへ Next End Sub Private Sub ComboBox1_Change() Dim Index As Integer Dim strBuf As String Index = ComboBox1.ListIndex 'ワークシートリストの選択された位置 strBuf = ComboBox1.List(Index) 'ワークシート名を取得 Worksheets(strBuf).Activate ' セルA1を左上端にする Application.Goto Reference:=Range("A1"), Scroll:=True ComboBox2.Clear Dim リスト As New Collection Dim 列 As String, 上端セル As String, 最下端セル As String Dim セル範囲 As Range, 各セル As Range 列 = "b" '※3 上端セル = 列 & "4" '※4 最下端セル = 列 & "65536" With Worksheets(strBuf) '※5 Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp)) End With For Each 各セル In セル範囲 'セル範囲の各セルについて繰り返し処理 On Error Resume Next '次行が実行時エラーならその次行から継続 リスト.Add 各セル.Value, CStr(各セル.Value) 'Collectionオブジェクトにメンバを追加 If Err.Number = 0 Then '実行時エラーが発生していなければ Me.ComboBox2.AddItem 各セル.Value 'コンボボックスのリストに項目を追加 End If On Error GoTo 0 Next End Sub

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

  • VBA コンボボックスの重複削除

    こんばんわ。 VBAをはじめたばかりで、コンボボックスで困っています。 sheet1にコンボボックスを配置して、sheet2のA列にあるデータ (例) A列          1          1          2 を コンボボックスに          1          2 というようにデータを入れたいのですが、どの様にしたらよいのでしょうか? sheet1.コンボボックス.value=workSheet("sheet2).Range(A1:A3).value とすると1・1・2というようにA列の値がすべて入ってしまいました。 これを1・2というようにコンボボックスに入れたいです。  よろしくお願いいたします。

  • EXCEL コンボボックスのリスト設定

    リストインデックスが複数ある場合は動くのですが、 インデックスが0 もしくは1個しかない場合は、どのように処理を追加したらいいでしょうか。。 実行時エラー381 Lisプロパティを設定できません。プロパティの配列のインデックスが無効です、と メッセージが出ます。 いろいろ試してるのですがわかりません。 コンボボックスの値は別シートで参照先を指定しています。 ----------- Private Sub ComboBox3_DropButtonClick() Dim lRow As Long Dim i As Long, myCnt As Long Dim myData With Worksheets("部門名") lRow = .Range("O" & Rows.Count).End(xlUp).Row ’O列の最終行を確認 myData = .Range("O2:O" & lRow).Value ’コンボボックスのリストデータ End With With ComboBox3 .ColumnCount = 1 .ColumnWidths = "50" .List = myData End With End Sub

  • コンボボックスの値をVBAで配列に格納したい

    コンボボックスの値をVBAで配列に格納したいのですが どういうコードにすればいいでしょうか? コンボボックスの参照元を格納するのではなく、 現在コンボボックスに表示されてるデータを格納したいです。 今、 Sub test() Dim varComb As Variant varComb = ActiveSheet.ComboBox1.Value End Sub というコードを作ったのですが、 これだと「aaa」しか取得できません。 varCombに"aaa,bbb,ccc"とカンマ区切りで格納するにはどうすればいいでしょうか? ComboBox1に表示されるデータ数を取得し、 ループさせ、 varComb = varComb & "," & ActiveSheet.ComboBox1.Value で格納していくイメージですが、コードが作れません。 よろしくお願いします。

  • エクセルVBA コンボBOXの相互連動

    皆さんこんにちは。 エクセル2013を使用しています。 ネットや本では 地方名>都道府県名>市町村名のような 順にコンボボックスで行う絞り込み検索の方法が たくさん載っています。 コンボボックス1を選択しないとコンボボックス2・3の 選択肢は表示されないようなものです。 ですが、私がやりたいのは どのコンボボックスから選択しても 残りのコンボボックスが連動するものを作りたいのです。 おそらくやりたい事はオートフィルターだ!と思ったので 今、私の知りうる数少ない知識を駆使した結果がこれです。 (1)原本Sheetをコピー→コンボ用Sheetを作成 (2)コンボ用SheetのA~C列を列ごとに重複除去をし  除去した内容をE~F列に記載 (3)E~Fの内容をコンボボックス1~3のコントロールにする (4)コンボボックスのどれかを選択すると  そのコンボボックスのTEXTでオートフィルターがかかる、  原本Sheet対応列を絞り込み (5)コンボ用Sheetを削除 (1)~(5)エンドレス・・・みたいなコードでやりたい事に対応出来ましたが 何しろシートのコピー・削除が何回もあるので 重くて重くてとても使い物にはなりません。 どうにか重くならずに同じような作動をするコードはないでしょうか。 このような感じで原本Sheetは作成されております。 [原本Sheet]     A    B    C 1   駅名  顧客名  店舗名 2   ○    △    □ 3   ○    ▲    ■ 4   ◎    △    □ 5   ◎    ▽    ◇ 6   ●     ▽    ◆

  • Excel ユーザーフォームでコンボボックスを使用してデータ入力

    Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。 コンボボックス:ComboBox1 テキストボックス1-3:TextBox1-3 コンボボックスのRowSource:シート名!A2:C100 コンボボックスの変更時の動作: Me!TextBox1.Value = ComboBox1.Value とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、 どのようにしたらいいのでしょうか?

  • Excel:コンボボックスの値をセルにセットする場合

    Excel2000を使っています。 コンボボックスで選択した内容をアクティブなセルに入力するために、以下のようなコードを作成しました。 (ユーザフォームにコンボボックスを1つ作成しています) ------------------------------------------ Private Sub UserForm_Initialize() ComboBox1.ColumnCount = 2 For I = 0 To 10 ComboBox1.AddItem Worksheets("元ネタ").Cells(I + 2,1).Value ComboBox1.List(I, 1) = Worksheets("元ネタ").Cells(I + 2,2).Value Next End Sub ------------------------------------------ Private Sub ComboBox1_Change() Worksheets("入力用").Activate ActiveCell.Value = ComboBox1.Text End Sub ------------------------------------------ このコンボボックスは、2列を表示させています。最後にセルに値を入力すると、今のコードでは1列目の値が入りますが、実際には2列目の値だけを入れたいんです。でもコンボボックスの選択時は、先頭列に1列目の値を表示させたいんです。 どうすれば、2列目の値をアクティブセルに入力できるでしょうか?

  • EXCEL VBAのコンボボックスに取り込むリストについて

    すいません、EXCEL VBAのコンボボックスにデータを取り込む方法について教えていただきたいことがあります。 (1)「シート1」のA列にデータが入力されている (2)ユーザーフォームにコンボボックスを設置し、このA列のデータを取り込む。 このときにA列に入っているデータの数だけ取り組むにはどうしたらいいのでしょうか。 シート1    A列 1行 11 2行 21 3行 31  ・   ・  ・   ・ Private Sub UserForm_Initialize() ComboBox1.RowSource = Sheets("シート1").Range("?") End Sub ?の部分がわかりません。End(xlup)のようなものを使ってデータが入っている最後の行を調べるのかと思いましたが、どうもうまくいきませんでした。 よろしくお願いします。

  • コンボボックスのSelectedIndex

    お世話になっております VB.NET 2010 Windows7 Windowsフォーム画面の開発をしています コンボボックスについて質問です コンボボックスに値を追加するときに、 ComboBox.Add("あいうえお") だと、Valueが設定されません なので ComboBox.DataSource = dtcpyCombo.Copy 'dtcpyCombo は、コンボボックス用DataTable ComboBox.ValueMember = dtCombo.Columns(0).ColumnName '0番目はKEY ComboBox.DisplayMember = dtCombo.Columns(2).ColumnName '2番目はKEY & ":" & VALUE dtcpyCombo.Dispose() としたのですが、ValueMemberを設定する部分で、SelectedIndexイベントが動いてしまいます 今回のコンボボックスは特殊操作をするので、特殊動作を入れています (http://blog.goo.ne.jp/jjskapibara/e/94a967a61d39f5e03521dfe839418e62) もともとの仕様なのか、上記操作を入れたために起きているのかがわかりません 教えていただけると嬉しいです

専門家に質問してみよう