オートフィルタをVBAで表現する方法

このQ&Aのポイント
  • Excelのデータを絞り込むためのオートフィルタをVBAを使ってフォーム上で実現する方法について説明します。絞り込む条件を複数のコンボボックスから選択し、絞り込み後の可視セルの重複しないデータを取得する手順も解説します。
  • Excelでデータベースを作成しており、人の登録・削除や指定した人のデータグラフなどを行っています。データを絞り込むためのフォームには10個程度のコンボボックスを配置し、フィルターをかける内容が記載されています。
  • オートフィルタをVBAで実現するためには、各コンボボックスの選択内容に基づいて絞り込みを行う処理を実装する必要があります。絞り込んだ後の可視セルの重複しないデータを取得する方法についても触れます。
回答を見る
  • ベストアンサー

オートフィルターをフォーム(VBA)で表現

いつも大変お世話になっております。 データベースをExcelで作っており、 人の登録・削除、また指定した人のデータグラフなど様々なことをします。 データ例としましては、 番号 名前 出身  その中で、人を絞り込むためのフォームに UserForm1 combobox1 combobox2 combobox3 ・ ・ ・ と、10個程度のコンボボックスを配置してます。 そのコンボボックスには、フィルターをかける内容が記載されており、 -----------データ例----------- No,氏名,郵便番号,住所,クラス,生年月日,年齢,趣味 0001,小林 博,102-0093,東京,A,1966/3/8,47,パソコン 0002,山崎 恵,212-0000,神奈川,B,1982/5/29,31,サーフィン 0003,桑野 雅寛,106-0032,大阪,C,1954/8/3,59,漫画 0004,樋渡 宏,101-0021,東京,D,1981/3/14,32,パソコン 0005,海田 健司,590-0057,大阪,E,1960/5/22,53,アニメ 0006,山崎 恵,212-0000,神奈川,A,1982/5/29,31,パソコン 0007,市川 耕作,150-0002,東京,B,1965/8/21,38,サーフィン 0008,山田 英範,836-0022,福岡,C,1946/12/24,57,パソコン 0009,小野 慶一,440-0034,愛知,D,1942/8/16,61,小説 0010,奥田 光昭,151-0053,東京,B,1943/6/18,61,パソコン 0011,榎本 香緒里,259-1219,神奈川,E,1961/5/30,43,漫画 0012,永島 豊,140-0002,東京,E,1949/8/31,54,パソコン 0013,北村 祥徳,899-4315,鹿児島,C,1950/11/25,53,アニメ 0014,土橋 一登,107-0052,東京,D,1945/6/25,59,小説 0015,平澤 秀樹,722-0041,広島,A,1956/1/29,48,サーフィン 0016,角居 弘之,107-0061,東京,E,1949/3/9,55,パソコン ---------------------------------- Excelのデータ⇒区切り位置⇒カンマ と選択して使ってください。 例えば、上記のようなデータがあるとします。 フォームは Form1 Label1 Combobox1 Label2 Combobox2 Label3 Combobox3 Label4 Combobox4 Label5 Combobox5 Label6 Combobox6 Label7 Combobox7 Label8 Combobox8 上記のような配置になっており、 LabelのCaptionは下記の通りです。 Label1 No Label2 氏名 Label3 郵便番号 Label4 住所 Label5 クラス Label6 生年月日 Label7 年齢 Label8 趣味 一致したデータをどんどん絞っていくわけなのですが、 絞った(Comboboxを選択確定した)後、Comboboxのデータを 絞った後に表示される項目のみ表示させたいと思っています。 例えば、Combobox5を 「神奈川」と選択したとします。 そしたら、 Combobox1のリストは 2 6 11 しか選択できないようにしたいのです。 オートフィルタそのものを VBAのフォームに置き換えるような感じです。 このようなことは可能でしょうか? 可視セルの重複しないセルを取得するのは とても大変なのですが、何か良い方法は無いでしょうか? 話がごちゃごちゃなってきましたので、 やりたいことをまとめます。 ●可視セルの列(1列ずつ)の、重複しないデータを取得←やり方がわかりません。 ●AfterUpdate(たしかコレだったような・・・)を使い  コンボボックスを選ぶと絞込み←ここまでは出来ます  そして、絞り込んだ後の可視セル重複しないデータを取得 ☆要するに、オートフィルタをフォーム上(VBA)で実現したい! ということです。 以上、よろしくお願い致します。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>コンボボックスを選ぶと絞込み←ここまでは出来ます >そして、絞り込んだ後の可視セル重複しないデータを取得 ExcelVBAには,「一意のリスト(unique value array)」を生成する機能は実装されていません。 コンボボックスのアップデート毎に,条件に該当する一意のリストをイチイチ拾い直し,下位の(他の)コンボボックスのネタとして設定し直すような具合に丁寧に自作する必要があります。 '初回の一意のリストのセットまでの作成例 private sub UserForm_Initialize()  me.combobox1.list = get_unique_and_visible_list(range("A2:A17"))  me.combobox2.list = get_unique_and_visible_list(range("B2:B17"))  me.combobox3.list = get_unique_and_visible_list(range("C2:C17"))  me.combobox4.list = get_unique_and_visible_list(range("D2:D17"))  me.combobox5.list = get_unique_and_visible_list(range("E2:E17"))  me.combobox6.list = get_unique_and_visible_list(range("F2:F17"))  me.combobox7.list = get_unique_and_visible_list(range("G2:G17"))  me.combobox8.list = get_unique_and_visible_list(range("H2:H17")) end sub private function Get_Unique_and_Visible_List(byref Target as range) as variant ’指定のセル範囲から可視セルを抽出し一意のリストを返す  dim h as range  dim myDic as object  set mydic = createobject("Scripting.Dictionary")  for each h in target.specialcells(xlcelltypevisible)   mydic(h.value) = 1  next  get_unique_and_visible_list = mydic.keys end function

satoron666
質問者

お礼

回答ありがとうございました! 無事、思い通りのものを作れそうです^^ 一行だけ、分からないのですが、 mydic(h.value) = 1 ここはどういう意味でしょうか? h.valueには、配列の値が入るのかと思いますが、 =1にすることでどのようになるのか分かりません。 暇なときで良いので、回答いただけると嬉しいです。

satoron666
質問者

補足

回答ありがとうございます! すごく短いプログラムで尊敬しますorz プログラムの中身を理解し、分かるようになってから 使ってみたいと思います。 まずは解読からはじめます!

関連するQ&A

  • オートフィルターのような機能をフォーム上で VBA

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

  • オートフィルタをフォーム上(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では他の値が選択できてしまいます。 説明が下手で分かりにくいかもしれませんが… 何か良い改善方法があれば、教えて頂きたいです! よろしくお願い致します!!

  • エクセルのオートフィルタで

    データが ---- 都道府県名 ←オートフィルタの先頭 東京都 神奈川県 神奈川県 東京都 神奈川県 埼玉県 ---- エクセルのオートフィルタで都道府県名を並べ替えで昇順とやると、 ---- 都道府県名 神奈川県 東京都 埼玉県 神奈川県 神奈川県 東京都 ---- となり、きちんと並べ替えがされません…なぜでしょうか? オートフィルタをかけたまま保存し、たまに開いてデータを追加していっています。追加されたデータがきちんと並び変わっていないようなきがするのですが、オートフィルタをかけなおしてもやっぱり並び替えしてくれません… 例えば神奈川県だけをオプションで選択したらきちんと3県選択してくれ、そのうちのひとつの神奈川県をセルで選んで、他の2つにセルごとコピーします。その後、上記の並べ替えをするときれいに並び変わります。 値は同じなのにきれいに並べ替えできないのはなぜでしょうか? 説明がうまくできてないかもしれませんが、宜しくお願いします。

  • オートフィルタと同じ事をフォームで・・・・

    以下の質問について、至急、回答をください。お願いします。 質問1) 出荷.xlsというBookが存在します。その中に、"出荷リスト"というシートがあり、A列に商品コード、B列に商品名が重複して多数存在します。各列に、オートフィルタをかけ、▼をクリックした時に表示されるリストをフォームのコンボボックスに表示させる方法。 質問2) フォームのコンボボックスに表示された任意の商品コードを選択時に、テキストボックスに選択された、商品コードの商品名を表示させる方法。 ※できれば、コードを記述していただくとありがたいのですが・・・

  • 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' アプリケーション定義またはオブジェクト定義のエラーです。 と出ます。 回答よろしくおねがい致します。

  • EXCEL VBA のユーザーフォームで絞り込み

    ここで質問が出来るほどの実力はないのですが・・・。 EXCELのユーザーフォームにコンボボックスを2つ配置しておいて、ComboBox1では都道府県名を選択できるようにしておき、県名を選択したらComboBox2にその県の市町村名が絞り込まれて選択できるようにしたいと考えています。 エクセルにどのような並びでデータをセットしてどのようなコードを書けば実現できるのかをご教授して頂けないでしょうか? まるまる「おんぶにだっこ」的な質問内容ですがよろしくお願いします。

  • エクセルのオートフィルタなのですが。

    オートフィルターで表示した(可視セル)のみをコピーして、別の列にそのデータを貼り付けたいのですが、貼り付けると、オートフィルターで非表示になっているデータまでも張り付けされて困っております。 どのようにしたら解決できますか? ご存知の方いましたら教えてください。

  • オートフィルタかピボットテーブルで可視セルのみコピー

    オートフィルタかピボットテーブルで可視セルのみコピー Excel2007を使っています。以前、オートフィルタかピボットテーブルで集計したデータを別シートにコピーしようとしたら、可視セルのみでなく元データがコピペされてしまった気がします。 でも、久しぶりに思い出して、ジャンプ→可視セルのみ選択→コピぺでできると思ったのですが、そんなことをしなくてもふつうのコピペだけで可視セルのみコピーになりました。 Excel2003から2007に変わったときに、そのように仕様が変わったということでしょうか。 でも、以前、コピペして元データになってしまったのも、Excel2007の時だった気がするのですが。

  • VBA コンボボックスの条件分岐

    コンボボックスの条件分岐のコードが間違っているみたいで 調べても分からなかったので質問します。 やりたいこと 『マスタ』という名前のシート内のセルを参照し マスタシートには C2セル『A』C3セル『B』C4セル『C』と それぞれアルファベットがあります。 そこでコンボボックスを使用し コンボボックス22にC2~C4セルを選択できるようにし 例えばC2セルを選択したら コンボボックス21の参照範囲をマスタシート内の D2~D13セルを選択できるようにし C3セルを選択したら コンボボックス21の参照範囲をマスタシート内の E2~E13セルを選択できるようにしたいのです。 すいませんがコードを記載して頂けますと 助かります。 Private Sub UserForm_Activate() '----------------------- With ComboBox22 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!C2:C4" End With '↑こうすればコンボボックス22のマスタシートのC2からC4まで値を選択できるようになります。 '------------------------わかりやすく区切っています。 '--------------------------------------- If UserForm1.ComboBox22 = "A" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" End With End If '↑コンボボックス22の値が(C2セルの値がAなら)コンボボックス21をマスタシートのD2からD13までを選択できるようにしたい If UserForm1.ComboBox22 = "B" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End With End If '↑コンボボックス22の値が(C3セルの値がBなら)コンボボックス21をマスタシートのE2からE13までを選択できるようにしたい '----------------------------------------区切っています。 End Sub

  • 【VBA】オートフィルタで抽出した内容を隣のセルにコピーする方法

    A列   B列 1       都道府県 2       神奈川 3       神奈川 4       埼玉 5       東京 6       千葉 7       東京 8       神奈川 9       東京 1行目にオートフィルタを使用してB列から東京だけを抽出。 A列   B列 1       都道府県 5       東京 7       東京 9       東京 B列の内容を隣のセルにコピー。 A列   B列 1       都道府県 5東京       東京 7東京       東京 9東京       東京 このような処理をVBAで行うにはどうしたらいいでしょうか? 可視セルを他シートに貼り付ける処理は分かりましたが、同シート内での処理が分かりません。 宜しくお願いします。

専門家に質問してみよう