質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

2335閲覧

マクロを使い、オートフィルターする方法

m_ao

総合スコア5

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2020/05/30 14:28

編集2021/06/06 11:55

前提・実現したいこと

オートフィルターのVBAで教えてほしい事があります。
Excelで在庫管理をしようとしています。
DATAにA列からE列で記載された条件を用いて一個づつSheet1にフィルターをかけて、Sheet2に記載していきたい。

Private Sub CommandButton1_Click() Dim aaa As Variant aaa = Array(2, 4, 6, 7, 9, 10) Dim MotoRng As Range Set MotoRng = Worksheets("Sheet1").Range("A1") With Worksheets("Data") Dim maxRow As Long maxRow = .Range("A" & Rows.Count).End(xlUp).Row '"Data"の2行目から順にループ処理 Dim rw As Long, cl As Long For rw = 2 To maxRow MotoRng.AutoFilter 'AutoFilter解除 '2, 4, 6, 7, 9, 10列を条件にフィルタをかける For cl = 2 To UBound(aaa) MotoRng.AutoFilter cl, .Cells(rw, cl).Value Next 'フィルタをかけた"Sheet1"のデータを"Sheet2"に追加コピーする With Worksheets("Sheet2") Dim Sheet2MaxRow As Long Sheet2MaxRow = .Range("A" & Rows.Count).End(xlUp).Row + 1 MotoRng.CurrentRegion.Copy .Range("A" & Sheet2MaxRow) End With Next End With

追加

VBA

1Private Sub CommandButton1_Click() 2Dim aaa As Variant 3 aaa = Array(2, 4, 6, 7, 9, 10) 4Dim MotoRng As Range 5 Set MotoRng = Worksheets("Sheet1").Range("A1") 6 7 8 With Worksheets("Data") 9 Dim maxRow As Long 10 maxRow = .Range("A" & Rows.Count).End(xlUp).Row 11 '"Data"の2行目から順にループ処理 12 Dim rw As Long, cl As Long 13 For rw = 2 To maxRow 14 MotoRng.AutoFilter 'AutoFilter解除 15 '2列目から6列目までを条件にフィルターをかける 16 For cl = 0 To UBound(aaa) 17 Debug.Print cl 18 Debug.Print rw 19 20 MotoRng.AutoFilter aaa(cl), .Cells(rw, cl + 1).Value 21 Next 22 'フィルターをかけた"Sheet1"のデータを"Sheet4"に追加コピーする 23 With Worksheets("Sheet4") 24 Dim Sheet4MaxRow As Long 25 Sheet4MaxRow = .Range("A" & Rows.Count).End(xlUp).Row + 1 26 27 28 Intersect(Range("A1").CurrentRegion, Range("B:B,D:D,G:G,M:M")).Copy _ 29 Sheets("Sheet4").Range("A" & Sheet4MaxRow) 30 End With 31 Next 32 End With 33 34 MotoRng.AutoFilter 'AutoFilter解除 35 36End Sub 37

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/05/30 15:10

コードは「コードの挿入」で記入してください。
meg_

2020/05/30 15:12

>規則性のない場合の方法を探しています 配列を使用してはどうでしょうか? ※配列を知らない場合は調べてください。
m_ao

2020/05/31 01:30

すみません。「コードの挿入」しました。 配列も試して、コードを追記してみましたが、うまくできませんでした。(コード追記しました)
hatena19

2020/05/31 04:14 編集

「オートフィル」と「オートフィルター」は別の機能ですので、タイトルと質問文内の「オートフィル」の修正をお願いします。 エクセルのオートフィルで連続データをサクっと入力 https://www.becoolusers.com/excel/autofill.html
m_ao

2020/05/31 06:01

ありがとうございました。誤記修正いたします。
guest

回答2

0

ベストアンサー

下記でどうでしょうか。

vba

1Private Sub CommandButton1_Click() 2 Dim aaa As Variant 3 aaa = Array(2, 4, 6, 7, 9, 10) 4 Dim MotoRng As Range 5 Set MotoRng = Worksheets("Sheet1").Range("A1") 6 7 With Worksheets("Data") 8 Dim maxRow As Long 9 maxRow = .Range("A" & Rows.Count).End(xlUp).row 10 '"Data"の2行目から順にループ処理 11 Dim rw As Long, cl As Long 12 For rw = 2 To maxRow 13 MotoRng.AutoFilter 'AutoFilter解除 14 '2, 4, 6, 7, 9, 10列を条件にフィルターをかける 15 For cl = 0 To UBound(aaa) 16 MotoRng.AutoFilter aaa(cl), .Cells(rw, cl + 1).Value 17 Next 18 'フィルターをかけた"Sheet1"のデータを"Sheet2"に追加コピーする 19 With Worksheets("Sheet2") 20 Dim Sheet2MaxRow As Long 21 Sheet2MaxRow = .Range("A" & Rows.Count).End(xlUp).row + 1 22 MotoRng.CurrentRegion.Copy .Range("A" & Sheet2MaxRow) 23 End With 24 Next 25 End With 26End Sub

修正したのは、下記の2行だけです。

vba

1 For cl = 2 To UBound(aaa) 2 MotoRng.AutoFilter cl, .Cells(rw, cl).Value

vba

1 For cl = 0 To UBound(aaa) 2 MotoRng.AutoFilter aaa(cl), .Cells(rw, cl + 1).Value

Dataシートの1列目から6列目の値が、各々Sheet1の2列目、4列目、6列目、7列目、9列目、10列目の条件になる。
Array関数で生成した配列は、インデックスが0から始まる。

上記を考慮して、抽出対象列は aaa(cl) で、条件値は Worksheets("Data").Cells(rw, cl + 1).Value で取得できる。

コメントに対する回答

具体的には商品(B列)、CODE(D列)、STORE(G列)、STOCK(M列)だけをSheet2に抽出する方法が知りたかったです。

下記でどうでしょうか。(コード修正しました。)

vba

1Intersect(MotoRng.CurrentRegion, Worksheets("Sheet1").Range("B:B,D:D,G:G,M:M")).copy _ 2 .Range("A" & Sheet2MaxRow)

投稿2020/05/31 03:46

編集2020/06/01 09:54
hatena19

総合スコア34053

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_ao

2020/05/31 06:04

解決しました。うまく動いているようです。ありがとうございました。
m_ao

2020/06/01 02:00

解決済みですが、この場を借りて申し訳ありません。自分用には上記で問題ないのですが、外部用に表示列を絞りたく、Array関数で生成した配列(aaa)を、MotoRng.CurrentRegion.Copy .Range("A" & Sheet2MaxRow)をどう修正したらできるか教えてください。 にも
hatena19

2020/06/01 04:25

「外部用に表示列を絞りたく」とは具体的にどのようにしたいのでしょうか。これだけではなんのことか分かりません。
m_ao

2020/06/01 05:21

具体的には商品(B列)、CODE(D列)、STORE(G列)、STOCK(M列)だけをSheet2に抽出する方法が知りたかったです。
hatena19

2020/06/01 06:09

回答に追記しましたので、ご参照ください。
m_ao

2020/06/01 08:17

回答ありがとうございました。回答頂いたコードを元に追記してみましたが、解決済みの時にできていたことがうまくできなくなりました。 私自身Intersectが理解できておらず、再度コード挿入をしましたので、アドバイスを頂きたくお願いします。
hatena19

2020/06/01 09:55

テスト用のコードをそのまま貼り付けてました。回答のコードを修正しましたので参照してください。
m_ao

2020/06/01 11:02

ありがとうございました。出来ました。 解決済みにも関わらず、hatena19さんにはアドバイスを頂いたことで勉強になりました。
guest

0

この状態ですと、オートフィルで検索できるものがなく、見出しのみがSheet2に表示されます。どうすれば解決できますでしょうか。

DataシートのタイトルとSheet1シートのタイトルが一致していないのが原因ではないでしょうか?
それにより、オートフィルタをかけている列と検索対象のセル値の不一致が起きているかと思われます。


【追記】
他の回答者も書かれていますが、配列から値を取り出すのはaaa(cl)ですね。

投稿2020/05/31 03:45

編集2020/05/31 04:08
meg_

総合スコア10716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問