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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

2回答

1391閲覧

VBAのループ処理がうまく動かない

YYJP

総合スコア23

VBA

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

1クリップ

投稿2021/06/24 04:09

前提・実現したいこと

シートの内容をまるごとコピーし、別のブックを新規作成して、コピーした内容を張り付けて保存するエクセルVBAを作っています。

配列の第一要素目である、block3.xlsxは作成できるのですが、
次のblock4は、
Worksheets(Data(i)).Copy
の部分で、下記のエラーが発生してしまい、block4.xlsxの作成はできません。

どうしたら、問題なくループが回り、
block3~block7.xlsx、全てのブックを作成できるようになるでしょうか?

発生している問題・エラーメッセージ

インデックスが有効範囲ではありません。

該当のソースコード

VBA

1Sub correctに向けたコピーtest() 2 Dim fso As FileSystemObject 3 Set fso = New FileSystemObject 4 5 Dim Data(4) 6 7 Data(1) = "block3" 8 Data(2) = "block4" 9 Data(3) = "block6" 10 Data(4) = "block7" 11 12 Dim i As Integer 13 For i = 1 To 4 14 MsgBox i 15 MsgBox Data(i) 16 Worksheets(Data(i)).Copy 17 Name = "\" & Data(i) & ".xlsx" 18 'ppath = ThisWorkbook.Path 19 ppath = "C:\Users\×××\OneDrive\ドキュメント\大学院\修士論文\facial expression\実験データ0605\0618\3" 20 MsgBox ppath 21 a = fso.BuildPath(ppath, Name) 22 ActiveWorkbook.SaveAs Filename:=a 23 Next 24 25End Sub

試したこと

ループ2回目の、Data(i)には、きちんとblock4が入っています。
Worksheets(Data(i)).Copyの、書き方が何かしら間違っているのだと思いますが、
どこが違うのかが分かりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

VBA

1ThisWorkbook.Worksheets(Data(i)).Copy

ブック名をつけずにWorksheets(Data(i)).Copyとだけ書くと、
その時のActiveWorkbookのワークシートだと判断されます。
ループの1回目で新しいWorkbookができ、それがActiveWorkbookになるので、
2回目のときに、その新しいブックの中のワークシートを探しに行きますが、
当然そこには無いのでエラーになる、という理屈だと思われます。

投稿2021/06/24 05:13

編集2021/06/24 05:17
jinoji

総合スコア4592

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

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

YYJP

2021/06/24 08:29

ご指摘受けて修正したら動きました。ありがとうございました!
guest

0

インデックスが有効範囲ではありません。

これは配列の添え字インデックス番号が範囲外であることを示しています。

Dim Data(4)

これは要素数が4つの配列を定義しています。

配列のインデックス番号は0から始まるので要素数4であれば指定できるのは0~3となります。
Data(4) は指定できる範囲外なのでエラーがでています。

~~ ※エラーについての対応が目に付いたので回答しましたが、block3.xlsxだけできる説明にはならない、問題根本解決には至らないと思います。根本原因がわかれば追記します。~~


(編集)
回答内容に誤りがありました。本来削除依頼を出すべきですが、ご指摘のコメントを頂いておりますので、取り消し線で取り消しを行いました。
大変申し訳ございません。

投稿2021/06/24 04:53

編集2021/06/24 06:34
Crimson_Tide

総合スコア509

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

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

hatena19

2021/06/24 05:44

Dim Data(4) とした場合、 Dim Data(0 to 4) という意味になりますので、0 ~ 4 まで指定できますね(要素数5)。 ただし、モジュールの先頭で Option Base 1 を宣言しておくと Dim Data(1 to 4) という意味になります。 今回のコードなら、Dim Data(1 to 4) と宣言しておくと紛れないと思います。 エラー原因は jinojiさんの回答通りだと思います。
Crimson_Tide

2021/06/24 06:39

ご指摘誠にありがとうございます。 私の認識の誤りがございました。また確認のために参考にしたサイトの内容にも誤りがあったようです。 コメントを頂きましたので、回答は削除ではなく取り消し線を付与することで対応いたしました。 YYJP様、誤った回答をしてしまいました。大変申し訳ございません。
YYJP

2021/06/24 08:28

VBAも配列の要素は0から始まるんですね。とても勉強になりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問