ExcelマクロVBAでのリスト選択とオートフィルターの実装

このQ&Aのポイント
  • ExcelのマクロやVBAを使用して、シート1の特定のセルを選択すると、シート2のデータからリストを表示する機能を実装したいです。
  • 具体的には、シート1のB1セルを選択した際に、シート2のA列のデータを参照し、リストを表示するようにします。
  • さらに、シート1のB2セルで特定の顧客名を選択した時には、シート2のデータに対して条件付きのオートフィルターをかける機能も実装します。
回答を見る
  • ベストアンサー

入力規則とフィルター

エクセルで質問ですが、マクロ、VBAにて できるかどうか判らない状態での質問になりますが ご理解願います。 シート2の1行目には表題、2行目から 表題に準じたデータが入力されています。   A     B     C 1 顧客名   日付   取引内容     シート1にはA1、A2、C2に表題が入っております。   A     B     C     D 1 顧客名    2 日付         取引内容 シート1のB1を選んだ際に、シート2のA列を参照したデータから リスト選択できる様にしたいと考えています。 その際、シート1のB2にて顧客名を選択した時点で その顧客名を条件としたオートフィルタ―を シート2で掛けたいのですが、ご指導願います。

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

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

>追加で質問なのですが、 いいえ,お断りします。「ついでに聞いちゃえ」でダラダラと終わらないご相談があんまり多くて,困っています。 問題が解決したご相談はキチンと解決で閉じ,新しいご質問は改めて「こんどはこういう状況から,次はこういう結果が欲しい」と改めて状況をしっかり提示して,新しいご相談で投稿するようにしてください。 でもマクロを少し手直しますので,次の通りにします。 手順: シート2を右クリックしてコードの表示を選び,現れたシートのマクロを全部削除して下記をコピー貼り付ける private sub worksheet_change(byval Target as excel.range)  dim i as long  dim myDic as object  if application.intersect(target, range("A:A")) is nothing then exit sub  set mydic = createobject("Scripting.Dictionary")  on error resume next  for i = 2 to cells.specialcells(xlcelltypelastcell).row  if cells(i, 1) <> "" then  mydic.add cells(i, 1).value, cells(i, 1).value  end if  next i  with worksheets("Sheet1").range("B1").validation   .delete   .add type:=xlvalidatelist, formula1:=join(mydic.keys, ",")  end with  set mydic = nothing end sub private sub worksheet_beforedoubleclick(byval Target as excel.range, cancel as boolean)  if target = "" then exit sub  cells(target.row, "B").resize(1, 2).copy destination:=worksheets("Sheet3").range("A1")  cancel = true end sub ファイルメニューから終了してエクセルに戻る コピーしたいセルをWクリックすると,シート2からシート3に転記する。

roadsky353
質問者

お礼

助言と共に、ご指導頂き有難うございました。 実は他にも気になる場所があるのですが どこまでVBAで動作可能なのか判らなかった為 小分けにして質問してしまった事をお詫びいたします。 次回は一括で質問したいと思います。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

>シート1のB1を選んだ際に、シート2のA列を参照したデータから リスト選択できる様にしたいと考えています。 B1は、A1の誤りでは? ーー >リスト選択できる様にしたいと考えています。 リスト選択とは何?Sheet2はリスト状態にあると思うが、その中から検索したいということだろう。表現に気をt付けて、丁寧に。 質問例には見出しだけでなくデータ例も入れることが望ましい。エクセルの解説書を見てご覧、入れてあるよ。 ーー 言葉で言えば、 シート1でA1セルに顧客名を入れたら、シート2のA列でその顧客名の行を探し、該当行の日付、取引内容を参照して、シート1のA2,B2のセットしたい と書けばわかりやすいだろう。 顧客名はシート2のA列で複数表れないのだろうね。こういうことをはっきり書いておくのが、わかった人のやること。 ーー この質問のエクセルのシートでの操作をして、マクロの記録を取って、コードを見て、本番では何処が変わるかコードを対応したものにする、やり方を勉強したら。 ーー この課題はエクセル関数で出来るのではないか。(顧客名はシート2のA列で複数表れない場合は) VBAなんて無理しないで関数でやって、良いのではないか。 関数をほぼそのままで、VBAで使えるが。

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

シート2のシート名タブを右クリックしてコードの表示を選び,下記をコピー貼り付ける private sub worksheet_change(byval Target as excel.range)  dim i as long  dim myDic as object  if application.intersect(target, range("A:A")) is nothing then exit sub  set mydic = createobject("Scripting.Dictionary")  on error resume next  for i = 2 to range("A65536").end(xlup).row  mydic.add cells(i, 1).value, cells(i, 1).value  next i  with worksheets("Sheet1").range("B1").validation   .delete   .add type:=xlvalidatelist, formula1:=join(mydic.keys, ",")  end with  set mydic = nothing end sub シート1のシート名タブを右クリックしてコードの表示を選び,下記をコピー貼り付ける private sub worksheet_change(byval Target as excel.range)  if target.address <>"$B$1" then exit sub  if target = "" then worksheets("Sheet2").autofiltermode = false : exit sub  worksheets("Sheet2").range("A:C").autofilter field:=1, criteria1:=target.value end sub シート2のリストを更新すると,シート1のB1の「入力規則」を更新する シート1のB1を選択すると,シート2に「オートフィルタ」を掛ける。

roadsky353
質問者

補足

お礼が遅くなりました。 深夜にもかかわらず、即回答頂き有難うございます。 ほぼ思い通りの動作確認ができました。 keithin様に追加で質問なのですが、 オートフィルターを掛けたのち 任意のセルを指定して(例えば抽出結果のB5:C5) 別のシート(例えばシート3)のA1:B1に貼り付ける マクロはないでしょうか? 任意のセルは抽出結果に応じて変動しますので 手動選択が有りがたいです。 貼り付け先は固定です。

関連するQ&A

  • エクセル/データの入力規則/フィルターが効かない

    お世話になります。 社員の人事データに係る20列×200行のエクセルシートがあります。 ある列に「データの入力規則」にて「入力値の種類」をリストにし、「元の値」の箱の中に3個の選択肢(例えばA,B,C)をカンマで区切って入力し、その列の入力の際にその3個の選択肢をプルダウンで選択できるようにしてから、200行(200個のセル)にAまたはBまたはCの入力をしました。 その後、1列目の項目の行にフィルターをかけ、A(またはBまたはC)が入力されたデータのみ表示させたいのですが、上から150行目まではちゃんとフィルターが掛かるのですが(即ち、A(またはBまたはC)が入力されたデータのみが表示される)、151行目以降はフィルターがかからず、A、B、C全てのデータが表示されてしまいます。 また、この時、エクセル左端の行番号の数字の色が、150行目までは青色ですが、151行目以降は黒色となっており、151行目前後で何かが違っているようです。 但し、自分自身では何かを変えたつもりは全くなく、何故151行目以降でフィルターが効かないのかが全く分かりません。 また、上記と全く同じこと(「データの入力規則」設定後に入力+フィルター)を別のエクセルファイルで行いましたが、そこでは200行全てがちゃんとフィルターが掛かっています。 何故151行目以降でフィルターが効かないのでしょうか? また、解決策は何かあるでしょうか?

  • 入力規則とオートフィルタ

    宜しくお願いします。 例 シート2           A     B      C      1  品名   品種  業者名       2      3      .      .     400 2~400行まで品名・品種・業者名が入っています。 これをオートフィルタ→業者名で絞り、その絞ったデータだけをシート1の任意のセルに入力規則で選べるようにすることは可能でしょうか? エクセル2003 使用 VBA使えません^^;    

  • エクセル 入力規則

    何か良い方法がないか教えてください。シートが2つあり、一方のBシートのある列に担当者の名前を入力すると(行は顧客データが入っています)、もう一方のAシートのその顧客の行の担当者欄のセルにその担当者名が参照され、参照されると自動的に進行状況欄のセルに商談中と表示させたいのです。進行状況欄に入力規則のリストが設定されていない場合でしたら、簡単に出来ると思いますが、進行状況欄のセルにはリストで(未、商談中、成約、破談、その他)で選べるようにしておきたいのです。で商談の進み具合により、商談中を成約に変えたりできるように。 現在は、Bシートに営業の者が担当者名を随時入力すると、毎週決まった曜日に私が担当者名が新たに入力されたかどうか確認して、それをコピーしてAシートに貼り付け、進行状況欄を商談中に代えています。かなり手間がかかるので営業の者が担当者名を入力するだけで一度に入力規則を残したまま商談中と表示できないものでしょうか? Aシートの担当者名をBシートからの参照にしておき、Aシートをフィルターかけて担当者名が入力されているのに、まだ未になっているもの(商談中が未に逆戻りすることはないため)を商談中に変える方法なら今より楽にはなりますが、上記のように一気に出来ないものかと。 質問がわかりづらかったらすいません。補足しますのでご質問ください。

  • エクセルの関数についてです、よろしくお願いします

    エクセルの関数についてです、よろしくお願いします。 sheet1に以下の様なデータが何百行とあります。 A B C D E 日付  顧客名  品名  数量  金額 上記のsheet1のデータを基にsheet2へ抽出して転記する ものを作りたいと考えています。 具体的に言いますと sheet2のA1に2014/11/21、 B1に2014/12/20、 C1に ○○商店と入力するとその下に A      B     C     D 日付   品名   数量 金額 2014/11/23  りんご 5 750 2014/11/28  みかん 2 300 2014/12/2   いちご 3 600 2014/12/10  りんご 5 750 sheet1のリストから該当するものを引っ張ってきて sheet2へ表示させるものです オートフィルタ等でなく、関数で出来ないでしょうか お詳しい先生方よろしくお願いします。

  • エクセルのフィルターオプションで

    エクセル2000です。 A10:D10000位の大きな表があります。1行目(10行)はタイトル行です。 そのうちB列の商品名からA、B,Cの3つの商品、D列の日付から2006/12/01~2006/12/31のものをフィルターオプションで抽出したいのです。 抽出条件を 1行目はタイトル行 B2にA B3にB B4にC とした場合、D2~D4にはどう記述すればいいのでしょうか?

  • エクセル フィルタをかけたセルに貼り付け

    お世話になります。 エクセルのシートでフィルタをかけたセルの、選択した範囲のみをコピーして、 同じ範囲に値貼り付けしたいのですが、よい方法が浮かびません。 フィルタで表示するセルには、数式(VLOOKUP)が入っていて、別シートの値を参照しています。 元データが変更されると、数式で表示されている値も変わってしまうので、 VLOOKUPで引っ張ってきた後に、値貼り付けをして、値を確定させたいのです。 フィルタをかけたセルへのコピーは、マクロを使わないとできないことは分かったのですが、 実際にマクロを組むことができず困っています。 助けていただけませんでしょうか。 ----------------------------------------------------- 参考として、現在次のようなフォームを使い、生産・販売・在庫の管理をしています。   A     B    C   D   E   F   G    H    I 1顧客名 製品名     10/1 10/2 10/3 10/4 10/5 10/6・・・・ 2 A社   AAA  生産   3           販売 4           在庫  5 B社   BBB  生産 6           販売 7           在庫 8 C社   CCC  生産 9           販売 10          在庫 列は、日付になります。 行は、製品ごとの生産、販売、在庫が入ります。 在庫行は、「生産数-販売数」の数式が入っています。 生産行は、依頼先から送られてくる生産実績ファイルをもとに、VLOOKUPで参照しています。 フィルタで「生産」だけを表示し、任意の範囲をコピー⇒値貼り付けできるようにしたいです。 宜しくお願い致します。

  • EXCEL2007のフィルタ連続コピーについて(形式選択-値)

    類似質問がありましたが、内容をなんとなくしか把握できなかったため仕事上必要なので質問させていただきます 新職場ではじめてEXCEL2007を使用して、フィルタを使用し困っております。 A | B | C | D No | 処理者 | 日付 | 処理状況 1 2 : 1200 と、No.1~1200の行、列はNo、処理者、日付、処理状況(OKかNGか)と4列の表です。 毎日処理した書類の日付と処理者とOKかNGをいれていくことになります。 そのさい、処理Noが1,5,100,999などバラバラです。 まずは、[データ]-[フィルタ]で処理したNoのみにチェックをいれます。 そして、1行のみ日付と処理者と処理状況(OKかNG)を入力しました。 ↓ 1行のA~D列の4列をコピー選択し、ほかの5,100,999をフィルタかけた状態で3行ドラッグして[形式を選択して貼り付け]-[値]で貼り付けました(表が1行ごとに白・水色と交互になっているための値貼り付けです) ↓ すると、うまく4行のみ貼り付けられるときと5-999行のすべてにデータが張り付くことがあります。 自分では同じ処理をしているとおもうのですが、何が違うのですか? お手数かけますがよろしくお願いします 2003までは表示しない部分は貼り付かないかんじだったとおもうのですが、きのせいでしょうか?よろしくお願いします EXCEL2007のフィルタ連続コピーについて(形式選択-値)

  • オートフィルタ抽出データのみ

    エクセルで オートフィルタで 抽出するさいに その列に打ち込まれている内容が選択できますが その打ち込まれているものだけ 別シートにほしいのですが 方法はありますか? 下記のエクセルシートで フィルタした場合 Aの抽出データの「青 赤 黄」を別シートに  A  B  C  D 1 青 10 済 A社 2 赤 50 未 B社 3 黄 10 済 A社 4 赤 10 未 B社 5 青 11 済 F社 6 ↓  A  B  C  D 1 青 2 赤 3 黄 4 5 上記のようにしたい場合どうしたらいいかお願いします。

  • 【マクロ】オートフィルター内の全データが削除される

    こんにちは、質問させていただきます。宜しくお願いします。 [エクセル] 2007 [内容] オートフィルタをかけ任意のデータのみ消したいのですが 全てのデータが消えてしまいます。 [詳細] A1~C5までデータが入っているのもだと仮定します。 (実際には項目があってフィルタがきちんとかかるものとします。)    A   B   C ----------------------- 1  ○   2個  \10 2  △   1個  \5 3  ×   3個  \15 4  ○   1個  \20 5  ○   4個  \5 オートフィルタをかけA列を基準として「○」を選択します。 そして選択した「○」を含む行(1行・4行・5行)を削除し 2行・3行目が残るようにしたいです。 その一連をマクロにして処理したいのですが… 1行から5行のすべての行データが削除されてしまいます。 <マクロ作成> マクロを記憶する。 ↓ 手動でオートフィルタをかけ、「○」を選択して行を削除 ↓ マクロの記憶を終了。 ↓ マクロ文の削除する行範囲をA1からC5に書き換え ↓ マクロ実行 <マクロ作成文>  Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="○" ActiveSheet.Range("A1:C5").Select Selection.Delete Shift:=xlUp ※エクセル2007のバージョンによっては選択した「○」のみ 削除されるPCもありましたので、何か設定があるのかな?と 思いましたが…解決しませんでした。 何か良い案があれば教えていただきたいです。 宜しくお願い致します。

  • Excel2010 入力規則のリスト自動対応

    こんにちは。 EXCEL2010 入力規則のリストについて質問です。 名前の定義の設定とINDIRECTを使ってリストを連動させる方法は、 理解できています。 選択リスト選択する内容が毎月追加・削除され一つずつ参照範囲を 直すのが大変です。 リスト選択する内容を自動で更新できる方法はないでしょうか? リストデータシート ・部署名→1行目(現在A1~G1にあり以下式で名前「部署名」と付けました。 =OFFSET('リストデータ'!$A$1,0,0,1,COUNTA('リストデータ'!$1:$1)) 氏名→それぞれ50名程あります。A2~B56 入力シート A6~A56まで部署を選択します。(部署の選択設定は出来ています。) B6~B56にそれぞれのA列で選択した部署の名前リストが出るようにしたい。 希望通りの設定が可能でしょうか? どうぞ宜しくお願い致します。

専門家に質問してみよう