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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

907閲覧

VBA:オートフィル

aaaskw123123

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/09/24 03:12

前提・実現したいこと

①シート名に「2021」と入っているシート名のみ処理をしたい
②↑のシートの表に「東京」の値が含まれているセルの行を別シートにオートフィルしたい

該当のソースコード

Sub test() Dim i For i = 1 To Worksheets.Count If InStr(Worksheets(i).Name, "2021") > 0 Then Worksheets(i).Select '9列目の東京でフィルタ Worksheets(i).Range("A1").AutoFilter 9, "東京" 'シートを追加 Worksheets.Add after:=ActiveSheet 'フィルタしたデータを、別シートに転記 Worksheets(i).Range("A1").CurrentRegion.Copy ActiveSheet.Range("A1") 'フィルタを解除 Worksheets(i).Range("A1").AutoFilter End If Next End Sub

試したこと

2021と含まれているシートは合計3シートあって、
東京でオートフィルしたシートを3シート追加したいのですが、
2シートのみ作成はされるのですが、2シート作成した時点で
End Sub に行ってしまいます。

繰り返し処理がうまくされていないのでしょうか?
エラーは特にでていないのでどこが間違っているのか教えていただきたいです。

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

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

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

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

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

hex309

2021/09/24 05:39 編集

「オートフィル」ではなく、「オートフィルタ」ですね。
guest

回答2

0

ベストアンサー

Forループの中でWorksheetの数が増えるからだと思います。
Addの追加先をWorksheet.CountのAfterにするとかすればどうでしょう。

VBA

1 Dim ws As Worksheet 2 For Each ws In Worksheets 3 If ws.Name Like "*2021*" Then 4 With ws.Range("A1") 5 .AutoFilter 9, "東京" 6 .CurrentRegion.Copy Worksheets.Add(After:=Worksheets(Worksheets.Count)).Range("A1") 7 .AutoFilter 8 End With 9 End If 10 Next 11

投稿2021/09/24 03:37

編集2021/09/24 03:48
jinoji

総合スコア4592

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

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

aaaskw123123

2021/09/24 06:58

回答ありがとうございます。無事動かすことができました。 あと、この追加シートに名前を付けたい場合はどうすればいいでしょうか... 繰り返し質問をしてしまい、申し訳ないです。
jinoji

2021/09/24 07:14

sheetをAddした直後はそのシートがアクティブなはずなので、その時点で ActiveSheet.Name = "xxx" とするのはどうでしょう。
guest

0

対象のワークシート名の「2021」が全角だったりしませんか?
もしそうであれば、以下のように半角にしてからチェックすればよろしいかと

VBA

1If InStr(StrConv(Worksheets(i).Name, vbNarrow), "2021") > 0 Then

投稿2021/09/24 03:24

hex309

総合スコア761

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

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

aaaskw123123

2021/09/24 03:32

回答ありがとうございます。試して見たのですが、やはり2枚目のシートでEnd subに行ってしまうので違う問題なようです…。
hex309

2021/09/24 03:36

考えにくいですね。 以下のコードで、チェック対象と実際に処理対象になったシート名をイミディエイトウィンドウに出力してみて、結果を貼り付けていただけないでしょうか? Sub Test2() Dim i For i = 1 To Worksheets.Count Debug.Print "チェック:" & Worksheets(i).Name If InStr(Worksheets(i).Name, "2021") > 0 Then Debug.Print "対象" & Worksheets(i).Name End If Next End Sub
hex309

2021/09/24 03:41

おそらくjinojiさんの回答の通りですね。失礼いたしました。
hex309

2021/09/24 03:45

もしくは、For Eachを使ってこんな感じでしょうか。 Dim temp As Worksheet For Each temp In Worksheets If InStr(temp.Name, "2021") > 0 Then temp.Select
aaaskw123123

2021/09/24 06:59

ご丁寧にありがとうございます。 また、違う書き方も参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問