フォーム上でオートフィルターのような機能を作りたい

このQ&Aのポイント
  • Excel2003を使用して、フォーム上でオートフィルターのような機能を作りたいと思っています。具体的には、フィルターをかけたら可視セルを抽出し、コンボボックスに登録する処理をしたいです。現状では、コンボボックスの値が変更されるたびにフィルターがかかってしまい、うまく処理ができません。解決方法を教えてください。
  • Excel2003を使用しており、フォーム上でオートフィルターのような機能を作りたいです。具体的には、コンボボックスの値が変更された時にフィルターをかけ、可視セルを抽出してコンボボックスに登録する処理をしたいです。しかし、現状ではコンボボックスの値を更新するたびにフィルターが全開になってしまう問題があります。解決方法を教えてください。
  • Excel2003を使用しています。フォーム上でオートフィルターのような機能を作りたいと思っています。具体的には、コンボボックスの値が変更された時にフィルターをかけ、可視セルを抽出してコンボボックスに表示する処理を実装したいです。しかし、現状ではコンボボックスの値を更新するたびにフィルターがかかり、うまく処理できません。どうすればよいでしょうか?
回答を見る
  • ベストアンサー

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

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

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

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

基本的にやることとしては ComboBoxN_Changeにおいて  if ComboBoxNが空白の場合,「該当列の」オートフィルタを全表示する  else 該当列をComboboxNで指定したアイテムで絞り込む  更にその状態で,「ComboBoxN以外の全てのコンボボックス」の選択肢をシートから拾い直す という動作になります。   「ある列」で例えば「AA」というアイテムでフィルタを掛けた場合,「他の列」の選択肢は「ある列がAAである行の選択肢」だけが抽出されていなければなりません。 同様に「ある列」のフィルタを解除した場合は,他の列は「ある列については全表示し,かつ別の列で絞られていた場合はその状態での行の選択肢」が抽出されていなければなりません。

satoron666
質問者

お礼

回答ありがとうございます。 分かりにくい説明でしたが、内容を理解して頂き ありがとうございます。 ComboBoxN_Changeを使うか、 ComboBoxN_AfterUpdateを使うか迷っています。 Changeを使うと、色々迷ったけど結局選択するのをやめた場合に空白になってしまい、シートのフィルターが解けてしまいます。 また、「ComboBoxN以外の全てのコンボボックス」の選択肢をシートから拾い直す…ということですが、 ComboboxNは他の選択肢も選べるような状態のままにしておく …そうですね、そのほうがいいかもしれません! あぁ…そういった考え方もあるのですね。 空白なら、その列のみ全表示とすれば良いのですね! 試しに作ってみて、わからなかった場合に再度補足に書かせていただきます。 ありがとうございました!

関連するQ&A

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

  • オートフィルターをフォーム(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)で実現したい! ということです。 以上、よろしくお願い致します。

  • エクセルでフォームのDropDownとオートフィルタのDropDown

    エクセルでフォームのDropDownとオートフィルタのDropDownについて。 エクセル2000です。 ワークシート上にフォームのDropDown(コンボボックス)や、オートフィルター、そして入力規則でリストの設定があります。 今のVBAの書き方だとこれらはすべてShapeです。 そうすると、フォームのDropDownとオートフィルター、そして入力規則のリストの識別がVBAではとても難しいです。これらはすべてTypeは msoFormControlですし、さらにFormControlTypeも xlDropDownとまったく同一です。 なんとか識別する方法がないか昨夜から試行錯誤の結果、オートフィルター、そして入力規則のリストはシート上に貼り付けてあるわけではないためか、TopLeftCellが取得できないことに気づきました。そこで下記のような識別のための実験コードを書いてみたのですが、多分もっといい方法があるのではと思い、質問させていただきます。 もちろん、Shapesコレクションを使用せず、古いDrawingObjectsコレクションを持ち出せばオートフィルターや入力規則は最初から対象外となるのは存じておりますのでそれ以外の方法をご教示くださいませ。 (o。_。)oペコッ. Sub hantei()  Dim i As Integer, x As String  Dim Obj As Object   For Each Obj In ActiveSheet.Shapes     If Obj.Type = msoFormControl Then       If Obj.FormControlType = xlDropDown Then         On Error Resume Next         x = Obj.TopLeftCell.Address         On Error GoTo 0         If x = "" Then           i = i + 1         Else           x = ""         End If       End If     End If   Next   MsgBox i & "個、入力規則のリストまたはオートフィルターがあります。" End Sub

  • エクセルのオートフィルターがかかっていたら消すVBA

    いつもお世話になっております。 作業が終了して全てのシートを初期化する場合に、オートフィルターで抽出した状態でデータを消すと、隠れていた部分が残ってしまいます。 もし、そのシートのA1~D1までにフィルターがかかっていたら、フィルターを消す、かかっていなければ、そのままシート全体のデータを消すというマクロはどう書けばよろしいのでしょうか? -例- Sheets("ABC").Select If Range(Cells(1,1),Cells(1,4))にフィルターがかかっていたらThen  フィルターを消す  Cells.ClearContents Else Cells.ClearContents End If こんなことをしたいのですが、伝わりましたでしょうか? よろしくご指南くださいませ。

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

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

  • テキストボックスのデフォルト設定とコンボボックスの更新について

    テキストボックスのデフォルト設定とコンボボックスの更新について エクセルのVBAで、ユーザーフォームを使用しています。 ユーザーフォームの中にはコンボボックスとテキストボックスとボタンがあります。 コンボボックスには「ABCDEFGHIJKLM」と合計13のリストがあります。 ユーザーフォーム起動時に、コンボボックスには最初のリスト(A)が表示 されていて、「次へ」ボタンと「戻る」ボタンの2つを用意しています。 (1)ユーザーフォーム起動時にテキストボックスに「0」を入れる方法を教えていただけないでしょうか。 コンボボックスで「A」が選択された状態で「次へ」ボタンをおしたら「B」が選ばれる。 「D」が選択された状態で「次へ」ボタンをおしたら「E」が選ばれる。 「M」が選択された状態で「次へ」ボタンをおしたら「A」が選択される。(リストの最初に戻る。) というのは、次のVBAで上手くいきました。 If Combobox1.ListIndex < Combobox1.ListCount - 1 Then Combobox1.Text = Combobox1.List(Combobox1.ListIndex + 1) Else Combobox1.Text = Combobox1.List(0) End If (2)しかし「E」が選択された状態で「戻る」ボタンをおしたら「D」が選ばれる。 「G」が選択された状態で「戻る」ボタンをおしたら「F」が選ばれる。 「A」が選択された状態で「戻る」ボタンをおしたら「M」が選ばれる。(リストの最後に戻る。) といった内容のマクロがうまく組めません。 教えていただけると助かります。

  • VBAを使わずにボックスから選択し抽出する方法

    会社のファイルであったのを見て同じ事をしたいと思い伺います。 簡単に説明すると、オートフィルタを使わずに、コンボボックスなどのリストから希望のカテゴリーを選択すると、その選択したカテゴリーのファイルだけが表示されるという方法をとりたいのです。 他サイトなどではマクロを使っての抽出方法がありましたが、これだとコンボボックスで選んだ後に抽出ボタンをクリックする必要があります。 コンボボックスとリストボックスの違いを良くわかってないくらいなので、根本的に間違えているかもしれませんが、とりあえずオートフィルタだと一番上の行にしか▼印がでないので、なんとかコンボボックスなどで抽出できませんでしょうか?

  • VBA 一つ前の動作を無効にするには??

    エクセル2002使用です。 ユーザーフォームにコンボボックス1、コンボボックス2のを2つ並べました。 コンボボックス2はコンボボックス1の値によって違う値を取得するため、 コンボボックス1に必ず入力がなければなりません。 そこで Private Sub ComboBox2_DropButtonClick() If ComboBox1.ListIndex = -1 Then MsgBox "コンボボックス1を入力してください" End If end sub としましたが、DropButtonClickの動作は有効なので、 メッセージボックスを閉じると、適当な値(今回はコンボボックス2設定のの一番最初の値)を 表示してしまいます。 DropButtonClickの動作を無効にする方法がわかりません。 よろしくお願いします。

  • オートフィルタがかかっていて、なおかつ抽出中なら

    オートフィルタがかかっていて、なおかつ抽出中なら、 という状態をvbaで取得する方法はありますか? Sub Sample() If ActiveSheet.AutoFilterMode = True Then End If End Sub これだと、 オートフィルタがかかっているだけでも、反応してしまいます。 「行番号が青色になってるのなら」 と同じ状態にしたいのですが、 どういうコードになりますか?

  • [EXCEL]オートフィルタ

    教えてください。よろしくお願いします。 EXCELで オートフィルタを使っています。 例えば、 100 と言う数値で抽出したとします。 100の ある部分を 上から下に向かって 111に修正するとします。 オートフィルタで =100 の条件で 抽出した状態で、 修正する部分の一番上のセルに 111を入力して それを 必要な部分まで ドラッグしたら、 抽出されていない(非可視セル)まで 111に なってしまいますか? ===================== 以前 修正した表について お友達から 指摘があり、 非可視セルまで 書き換えてしまったのかと・・。 心配です。 EXCELのバージョンによるのでしょうか?

専門家に質問してみよう