• ベストアンサー

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

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

  • kazh
  • お礼率89% (60/67)

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

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

やり方はいくつもあるのですが、とりあえず簡単な方法。 都道府県名のリストと、市町村名のリストをワークシートに書いておく方法です。 まず最初に都道府県名のリストを作成します。 Sheet1(シートはどこでも構いません)の A1 に「東京都」A2 に「栃木県」A3 に「茨城県」と入力します。 (本番では A1 から下に向かって都道府県名を入力していってください。) 全部入力が終わったら A1~A3(47都道府県を入力したのなら A47 まで)を選択し、Excel ツールバーの左端の「名前ボックス」に「都道府県」と入力します。 場所わかるかなぁ・・・多分 A1~A47 を選択した状態だと A1 って表示されてると思います。(数式バーの左です) 次に各市町村のリストを作成します。 B1 に「江東区」B2 に「墨田区」B3 に「足立区」と、B列を下に向かって入力。 C1 に「宇都宮市」C2 に「日光市」C3 に「佐野市」と、C列を下に向かって入力。 D1 に「水戸市」D2 に「日立市」D3 に「鹿嶋市」と、D列を下に向かって入力。 B1~B列の最後に入力したセルまでを選択し、先ほどと同様、名前ボックスに「東京都」と入力。C列に入力した範囲は「栃木県」、D列に入力した範囲は「茨城県」と入力します。 ポイントは、A列に入力した都道府県名と全く同じ文字で名前をつける所です。 ここまでやったことを解説します。 都道府県名を入力し、その入力範囲に名前をつけました。 同じく、各都道府県ごとの市町村名にも都道府県の名前をつけました。 次にユーザーフォームでの作業です。 ユーザーフォームに ComboBox を 2つ準備します。名前はデフォルトのまま ComboBox1 と ComboBox2 とします。 ユーザーフォームに下記のコードを書きます。 Private Sub UserForm_Initialize() Me.ComboBox1.RowSource = "都道府県" Me.ComboBox2.RowSource = "" End Sub Private Sub ComboBox1_Change() Me.ComboBox2.Value = "" Me.ComboBox2.RowSource = Me.ComboBox1.Value End Sub これでユーザーが ComboBox1 で都道府県を選択すると、ComboBox2 には選択した都道府県の市町村リストが配置されます。 ここまでを解説します。 フォームの初期化イベントで ComboBox1 のリストに、シートで「都道府県」という名前がつけられた範囲の値をセットします。 Me.ComboBox1.RowSource = "都道府県" 「都道府県」という名前の範囲は A列に入力した各都道府県名がありますので、ComboBox1 には 47都道府県の名前が表示されます。 さらに ComboBox2 のリストを空っぽにします。 Me.ComboBox2.RowSource = "" フォームの初期状態ではどの都道府県も選択されていないわけですから ComboBox2 は空っぽじゃなくてはいけません。 次に ComboBox1 でどこかの都道府県を選択したときの処理です。 まずは ComboBox2 で選択されている(かもしれない)どこかの市町村名をクリアします。 Me.ComboBox2.Value = "" そして ComboBox1 で選択した都道府県名と同じ名前の市町村名リストを ComboBox2 のリストにセットします。 Me.ComboBox2.RowSource = Me.ComboBox1.Value こんな感じです。

kazh
質問者

お礼

早速の回答ありがとうございます。また、懇切丁寧な説明もして頂いてありがとうございます。希望していたことができました。すごいの一言です。なんか涙が出るくらいうれしい!感謝×2です。 一寸背伸びをしてVBAというものを勉強してみようと思い立ち、とりあえず住所録の入力が簡単に行える仕組みを作ろうと思い、いざ本屋さんやWeb検索をしてみましたがわからずに諦め掛けていました。最後にと思いこちらに投稿したところです。まだ、先があるので解らないことがあったら質問させていただきます。 temtecomai2さん今後もよろしくお願いします。ありがとうございました。

関連するQ&A

  • エクセルVBAでユーザーフォーム

    エクセルVBAでユーザーフォーム上にオプションボタンが2つ、コンボボックスが6つあります。 OptionButton1をクリックした場合のComboboxの動きの制御について以下のように書いてみました。 これでも期待通りCombobox1~3は動き4~6は動かなくなります。 ただ、もっと別の簡単な書き方があるのではないかと思い質問しました。 宜しくお願いします。 Private Sub OptionButton1_Click() ComboBox1.Enabled = True ComboBox1.ListIndex = 0 ComboBox2.Enabled = True ComboBox2.ListIndex = 0 ComboBox3.Enabled = True ComboBox3.ListIndex = 0 ComboBox4.Enabled = False ComboBox4.ListIndex = 0 ComboBox5.Enabled = False ComboBox5.ListIndex = 0 ComboBox6.Enabled = False ComboBox6.ListIndex = 0 End Sub

  • エクセルVBAのユーザーフォームのコンボボックス

    エクセルVBAのユーザーフォームのコンボボックスの入力と ファイルの保存で質問です。 エクセルVBAで ユーザーフォームのコンボボックスを使用して 1月から12月までを選択してもらい、 選択した月を コマンドボタン押した際に、 セルにその値を入力するような マクロを作成しようとしています。 またコンボボックスは標準で6月が表示されるようにしたいと思います。 ユーザーフォームのコードの一部です。 Private Sub UserForm_Initialize() Dim m As Integer For m = 1 To 12 UserForm1.ComboBox1.AddItem m Next ComboBox1.ListIndex = 6 Private Sub CommandButton1_Click() 'ユーザーフォームを閉じる Unload UserForm1 mold  '↑フォームを閉じた後に実行される標準モジュールのマクロ名です End Sub 標準モジュールのコード 名称 「mold」 Sub mold() ActiveWorkbook.SaveAs _ Filename:="C:\_" & UserForm1.ComboBox1.Text & "月", _ FileFormat:=xlOpenXMLWorkbook ActiveWorkbook.Close ThisWorkbook.Activate ' End Sub の様に作成して実行してみたのですが、 コンボボックスで11月を選択しても 6月のままのファイルになってしまいます。 どのようにしたら、 コンボボックスで選択した値を ファイル名として保存できるでしょうか? 全部のコードを記載しますと 長くなってしまうと思い、 関連するコードを記載して質問しました。 分かりづらい所もあるかと思いますが よろしくお願いします。

  • エクセルVBAのコンボボックスについて

    エクセルVBAでActiveXコントロールのコンボボックスを配置して以下の プログラムを記述しているのですが、 コンボボックスでAを選択した後に、もう一度Aを選択したときに イベントが発生しません。 Private Sub ComboBox1_Change()ならイベントが発生しないのは 分かるのですが、Clickの場合は、選択された値が変わらなくても イベントが発生すると思ってたのですが。 VB6では問題なく発生しています。 ちなみにセルの入力規則ではなくてコンボボックスで実現したいです。 Private Sub ComboBox1_Click() 'ここに処理を記述 End Sub

  • VBA ユーザーフォームの値の取得方法

    いつもお世話になっております。 以下のような仕様のVBAコードを作成したいと考えています。 (貼付資料も参照してください) ■仕様  (1)ユーザーフォーム   1.処理の対象となる市名をチェックボックスから選択   2.処理の対象となるシート名をコンボボックスから選択  (2)ユーザーフォームで選択した    選択したシートの対象市名のデータを配列に格納  (3)格納した配列を元に一覧、詳細の表を作成 ■オブジェクト  ●ユーザーフォーム  ・フレーム   Frame1:神奈川県 Frame2:茨城県 Frame3:栃木県 Frame4:対象年度  ・チェックボックス   CheckBox1:フレーム外の全選択   CheckBox2~4:各フレームの全選択   CheckBox5~11:市町村名(横浜市~小山市の順)  ・コンボボックス   ComboBox1:対象年度  ●ワークシート ■不明な事  (1)⇒(2)の処理(ユーザーフォームで選択した項目を他のプロシージャで使用する)  について質問させていただきます。  私の頭の中では、  I.パブリック変数を用意して、CheckBoxやComboBoxで選択した項目を格納  II.プロシージャ引数として・・・  の2つの方法が候補として浮かんでいます。  Iに関して  CheckBox1:対象年度については、オブジェクトが1つしかないので、  適当なパブリック変数(今回はmySh)を用意して、  mySh=Combobox1.Value  とすれば、仕様は満たせると思いますが、  CheckBoxに関しては、数が多いので,どのようにすれば良いのかイマイチ分かりません。  IIに関しては、全く見当が付きません。 ■質問  (1)上記の処理を行う場合は、I又はIIの方法で問題無いでしょうか?  (2)I又はIIの方法の優劣はあるのでしょうか?  (3)I、IIの方法を教えてください。 どうぞよろしくお願いします

  • excel ユーザーフォームでシートごとに転記

    excel vbaでユーザーフォームを作りました。 その中で ComboBox1に「青」を選択すると(TextBox1、TextBox2)がSheet1に ComboBox1に「赤」を選択すると(TextBox1、TextBox2)がSheet2に 転記されるようにしたいと思っています。 (ComboBox1の青や赤は転記する必要なし) どのようにすればいいのか、どなたかご教示願います。 よろしくお願いします。

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

  • EXCEL VBA ユーザーフォームコンボボックスのRowSourceの設定方法について

    EXCEL VBAのユーザーフォーム内のコンボボックスのRowSourceの設定方法について質問があります。 基本的な質問かもしれませんが、うまく検索できませんでした。 「リスト一覧」シートに     A1  B1   C1 1行 りんご ばなな ぶどう 2行 100円  200円 300円 3行 110円  210円 310円 という値を入れる。 ユーザーフォーム内にコンボボックスを2つ設置し、 コンボボックス1の値が「リスト一覧」シートの1行の値と同じときに コンボボックス2のRowSourceを同じ列の2行、3行に設定する。 Private Sub ComboBox1_Change() Dim i As Integer  i = 1   Do Until Sheets("リスト一覧").Cells(1, i) = ComboBox1.Value    i = i + 1   Loop ComboBox2.RowSource = i列の2行目及び3行目.Address End Sub というコードになると思うのですが、うまくいきません。 どうぞよろしくお願いいたします。

  • VBAユーザーフォームの操作について

    いつもお世話になっております。 VBAでユーザーフォームのチェックボックス使用したデータを作成しています。 ●ユーザーフォームの仕様  1.各県名ごとにフレームを作成し、フレーム内に市名と全選択のチェックボックスを配置  2.各フレームの全選択のチェックボックスにチェックを入れると、フレーム内の市名のチェックボックスにチェックが入る  3.フレーム外の全選択のチェックボックスにチェックを入れると、全チェックボックスにチェックが入る。 ●オブジェクト名 ・フレーム  Frame1:神奈川県 Frame2:茨城県 Frame3:栃木県 ・チェックボックス  CheckBox1:フレーム外の全選択  CheckBox2~4:各フレームの全選択  CheckBox5~11:市町村名(横浜市~小山市の順) ●プロシージャ 1つ1つの動作をIFステートメントを使って記述しています。 ※IFの中身については、チェックボックスの数がもっと多ければ For Nextなんかを使ってもっとスッキリできますが、今回は数か少ないので羅列しています。 以上に関して、貼付ファイルのようなコードを記述してみました 一応仕様を満足する動作はしてくれるようですが・・・ ご指摘がありましたら、よろしくお願いします。

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

    Excel VBAでユーザーフォームを作成しています。 ユーザーフォームで出力したファイル 「出力ファイルA」 ユーザーフォームで使用するファイル 「ファイルB」 を、起動していると必ず「インデックスが範囲内にありません」 といった内容のエラーが表示されます。 ユーザーフォームで使用するファイルの表示中に そのようなエラー画面が出てきても仕方がないと思うのですが、 ユーザーフォームはマルチ画面を作成したので ファイルは「出力ファイルC」も出すことができる仕様です。 また、「出力ファイルA」「出力ファイルC」は コンボボックスで選択した西暦がファイルの先頭に付くので (例:2014_出力ファイルA.xls) 必ず同じファイル名が出力されるとは限りません。 なので、そのようなエラーが表示されないようにしたいのですが可能でしょうか? また、特別なコードは記述していないのですが、 なのでボタンとかコンボボックスのコードを書けばよいのか・・・という感じなのですが、 どのように対処すればよいかわかりません。 それと、出力したファイルの内容を確認するためにアクティブには、 ユーザーフォーム画面を終了させるしかならず、 そもそもそうゆう仕様なのかがわかりません。 ユーザーフォームを作成するのは初めてなので初心者丸出しで お恥ずかしい限りなのですが、 どなたかアドバイスいただけますと幸いです。 こんな抽象的ですが、どうお伝えすればよいのかがそもそもわからず困っていて、 それに時間もなく頭を抱えているので お手柔らかに願います。 よろしくお願い致します。

  • エクセル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 どのように修正すればいいでしょうか? よろしくお願いします。