アイデア、またはVBAプログラムの例を教えていただきたく、質問させていただきます
excelで、添付画像のようなリスト管理表を作っています。
リストは600行近くになります。
やりたいことは、D3またはE3に商品名または保管庫を入力すると、リスト内から、合致する行だけが抽出される、というもの。
D3とE3は、どちらか片方にのみ条件が入る。D3とE3の内容を変更するとリアルタイムで抽出結果も変更されるようにしたい。
触る人が初心者なので、難しい作業を一切せずに、D3またはE3を打ちかえるだけで必要な項目だけのリストとなり、印刷するだけでいいようにしたいわけです。
本来ならオートフィルタですればいい話ですが、どうしてもD3という離れたセルの入力内容で抽出したいのです。
VBAでなく、D3のセル内容を使ってD8~のオートフィルタが行えるなら、それが一番理想です。
が、自分でやってみた限りはできませんでした。
フィルタオプションならどうかとやってみたところ、一回目は抽出できました。しかし、D3またはE3の条件を変更しても、リアルタイムで抽出結果が切り変わらない。
フィルタオプションの抽出結果を別のセルに出せばいいのですが、そうすると無駄な情報が残り、ただ印刷しただけでOK・・というわけにいきません。(印刷範囲を区切るとかでなく、シートの見栄えが必要な情報だけにならないと…扱う初心者が混乱します)
自分なりには、VBAにより、 D3・E3のセル内容が書き換わったらフィルタオプションの抽出結果をいったん同シートの別セルに出し、抽出結果部分だけを別のシートにカット&ペースト成形。そのシートを印刷させればよい。
という考えになりましたが、やってみたら、なぜか別のブックに同じものが形成され、抽出した結果だけ単独のデータにできません。
そもそももっと良いアイデアがあればそれをおしえていただきたい。
あるいは、VBAで目的達成できるように問題点をご指摘ください。
一応、プログラムを書いておきます
■添付画像のデータが入っているシート(『一覧』という名前のシート)内コード
Private Sub Worksheet_Change(ByVal Target As Range)
'
If Target.Column = 4 Then
If Target.Row >= 3 And Target.Row <= 3 Then
Call Filter
Call copy
End If
End If
End Sub
■サブルーチンFilter() 標準モジュールに記載
Sub Filter()
' Filter Macro
'フィルタオプションを使って同シート内「D1100」以降に抽出結果を出します
ActiveWorkbook.Worksheets("一覧").Select
'一覧表はD7~F1000。検索条件はD2~F3までの範囲に名前を付けたもの
Range("一覧表").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"検索条件"), CopyToRange:=Range("D1100"), Unique:=False
Range("A1").Select
End Sub
■サブルーチンcopy() 標準モジュールに記載
Sub copy()
'
' copy Macro
'
'抽出された内容(45行目~100行目まで)を別のシートにコピーします
ActiveWorkbook.Worksheets("一覧").Select
Rows("45:100").Select
Selection.Cut
ActiveWorkbook.Worksheets("抽出結果").Select
Rows("4:4").Select
Selection.Insert Shift:=xlDown
Range("A1").Select
End Sub
No.2ベストアンサー
- 回答日時:
追記:
では、当方で検証したサンプルコードを載せますので、ご参考に。結果提示用に「抽出結果」と名付けたまっさらなシートを予め用意しておいてください。
と、その前に注意点。
ご質問内容では、シートモジュールや標準モジュール等、複数のモジュールにコードが分散していますが、今回の処理内容では、モジュールを分ける意味がありません。シートモジュールのワークシートチェンジイベント1本で十分です。従って、ご案内するコードは、一覧表のあるシートのシート見出しを右クリック→コードの表示から呼び出した画面に書き込み、入力が終わったら、ファイルタブ→終了してexcelに戻る、としてください。
それと、クライテリアを使うと、倉庫1の検索で倉庫10以降もピックアップされてしまうので、1は全角で10以降は半角にするなど、元ネタに区別をしてください。
また、利用者のなかにビギナーがいるのであれば、セルのロックと保護を使い、一覧シートのD3:E3しか操作出来ないようにする、入力規則を使って、商品1,商品2といったリストから選ばせる、等の工夫も考えられます。それらをどう併用するかによって適切なコードも変わってきますので、細部はご自身で調整してください。
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, [D3:E3]) Is Nothing Then Exit Sub
Worksheets(”抽出結果”).[A1:C1000].ClearContents
Range(”一覧表”).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
(”検索条件”), Copytorange:=Worksheets(”抽出結果”).Range(”A1”)
End Sub
サンプルコードを書いてくださったのも勿論ありがたかったのですが、注意点や特徴をよく説明してくださって、大変分かりやすかったです。
処理自体は、まだまだ多くの工程を経て完成に向かいますが、質問項目に関しては目標を達成でき、理解が深まったと感じます。
総じてyaritsusozaiさんおひとかたのみの回答でしたが、よいかたと巡りあえて幸運でした。
このプログラムと解説、大事に活用させていただきます。
ありがとうございました(*^^*)
No.1
- 回答日時:
抽出結果を1100行以降に書き出したのに、その後45~100行を選んでコピーしているのが意味不明ですが…
AdvancedFilterのCopytorangeを、
:=Worksheets(”抽出結果”).Range(”A1”)
にすれば、どこかに抽出したデータをさらに別シートにコピーするといったような”二度手間”は省けます。
もう一点、新たな抽出の際、前回抽出したものが残っているとごっちゃになる恐れがあるので、
AdvancedFilterを使う前に、
Worksheets(”抽出結果”).[A1:C1000].ClearContents
などで、宛先をクリアにしておくと良いと思います。
この回答への補足
>抽出結果を1100行以降に書き出したのに、
>その後45~100行にコピーしているのが意味不明
すみません、データを少なくして実行チェックを行っていたので、それが残ってました…
この部分は正しく100行以降にコピーするように直して実行しています。
>AdvancedFilterのCopytorangeを、
>:=Worksheets(”抽出結果”).Range(”A1”)にすれば、
それが…マクロを記録する際にも別シートは選べませんでしたし、
VBAコード側でこれを書き込んでみましたが、抽出結果が現れませんでした…
>Worksheets(”抽出結果”).[A1:C1000].ClearContents
>などで、宛先をクリアに
これは確かにしておくべき、と思いました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
【VBA】指定した検索条件に一致したら別シートに転記したい
Visual Basic(VBA)
-
-
4
ある条件を満たすセルに対応する行のセル内容をコピーして・・
Visual Basic(VBA)
-
5
【VBA】元のシート内の文字列を別シートと比較し、一致したら元のシートの別のセルへ転記する方法。
Excel(エクセル)
-
6
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
7
VBAで条件が一致する行のデータを別シートに抽出
Excel(エクセル)
-
8
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
9
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
-
10
cellsで特定の離れた範囲を選択する方法は?
Visual Basic(VBA)
-
11
エクセルファイルのシート毎の容量
Excel(エクセル)
-
12
Excel VBA、 別ブックの最終行セルへのコピー&値ペースト
Visual Basic(VBA)
-
13
VBA 値と一致した行の一部の列のデータを転記について教えてください
Visual Basic(VBA)
-
14
エクセル2016でfilter関数がないので、、抜き出す関数をおしえてください。
Excel(エクセル)
-
15
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
16
【Excel VBA】条件を満たすデータを順に抽出
Excel(エクセル)
-
17
ExcelのVBAでフォームが表示されない
Excel(エクセル)
-
18
マクロで条件に合った行の選択について
Excel(エクセル)
-
19
エクセルで複数のシートのクリアをしたいです
Excel(エクセル)
-
20
エクセルVBA 複数の条件を含む対象を抜き出す。
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
お肉の下のシートを煮込んでし...
-
エクセルのシートをコピーして...
-
毎日の日計を別シートに自動で...
-
エクセルでフラグがたっている...
-
エクセルで1行だけ数式が反映さ...
-
エクセルを利用して、日計と累...
-
条件にマッチする行を抽出するV...
-
Excel VBA 12ヶ月分のシート作成
-
2つのシート間での重複データ...
-
エクセルで2つのシートに同じ名...
-
EXCELで受験票を作成したい(名...
-
Excelで複数のシートに列のグル...
-
安いフローリング用掃除シート...
-
指定した条件でTRANSPOSE関数を...
-
上場企業のURL一覧
-
excelマクロで複数シート間のデ...
-
エクセルでシート間の相対参照
-
EXCELで○ヶ月を○年○ヶ月に変換...
-
A1セルに入力したら、入力時間...
-
エクセルで勝手に表示された打...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
お肉の下のシートを煮込んでし...
-
チュロス袋の代用
-
エクセルを利用して、日計と累...
-
エクセルのシートをコピーして...
-
指定した条件でTRANSPOSE関数を...
-
毎日の日計を別シートに自動で...
-
エクセルで1行だけ数式が反映さ...
-
2つのシート間での重複データ...
-
エクセルで○のついた項目を抽出
-
エクセルでフラグがたっている...
-
EXCELで受験票を作成したい(名...
-
エクセルで2つのシートに同じ名...
-
エクセル ○印がついている行を...
-
条件にマッチする行を抽出するV...
-
excel シート1の奇数(偶数)...
-
複数シートのセルの 記号の数...
-
EOMONTH関数の代わり
-
Excelで複数のシートに列のグル...
-
VBA 縦のデータを横にするコード
-
エクセルでシート間の相対参照
おすすめ情報