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

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

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

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

Q&A

2回答

4110閲覧

別ブックへのデータ貼り付け処理でインデックスエラーが発生(VBA)

sawako.a

総合スコア12

VBA

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

0グッド

0クリップ

投稿2019/06/23 13:38

前提・実現したいこと

VBAで、定型の複数のデータファイルから特定の複数のセルを抽出し、
出力用のテンプレートファイルに抽出結果を貼り付ける仕組みを構築しています。
(後続でDBにインサートする為の、事前のデータクレンジング機能の構築)

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

抽出結果を出力用テンプレートに貼り付ける部分のソースコードで以下のエラーメッセージが出力されます。

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

該当のソースコード

VBA

1 Workbooks(Target_BookName).Worksheets(Sheet_Name).Range("L2").Select 2 Selection.Copy 3 Workbooks(Template_ExcelName).Sheets("emg").Activate   ← この行でエラーが出ます。 4 Range("A2").Paste 5 Application.CutCopyMode = False

※デバッグしましたが、Template_ExcelNameには値が正しく渡されています。

試したこと

とあるサイトで、「エクスプローラーのオプション」にて、「登録されている拡張子は表示しない」にチェックを入れれば解決するとあったので、
試したのですが解決できませんでした。

どうかご教示ください。

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

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

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

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

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

guest

回答2

0

Select、Activate を使うのをやめる、つまり、対象がアクティブであることの前提のコードをかかない。
操作対象オブジェクトは変数に格納して使用するか、Withステートメントとを使って明示的に指定する。

上記の方針でコーディングすると、読みやすく、バグが発生しにくく、発生しても原因を特定しやすいコードになります。

今回のコードなら、例えば、下記のようになります。

vba

1Dim Target_Book As WorkBook 2Set Target_Book = Workbooks("Target.xlsx") 3Dim Target_Sheet As WorkSheet 4Set Target_Sheet = Target_Book.WorkSheets("TargetSheet") 5 6Dim Template_Book AS WorkBook 7Set Template_Book = Workbooks("Template.xlsx") 8Dim Template_Sheet As WorkSheet 9Set Template_Sheet = Template_Book.WorkSheets("emg") 10 11Target_Sheet.Range("L2").Copy Destination:=Template_Sheet.Range("A2")

ブック名やシート名が存在しないものなら、その行でエラーか出ますので、原因の特定がしやすいです。

投稿2019/06/24 00:25

hatena19

総合スコア34352

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

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

0

以下のようにWorkSheetsに変更するとどうなりますでしょうか。

VBA

1Workbooks(Template_ExcelName).WorkSheets("emg").Activate 2'Workbooks(Template_ExcelName).Sheets("emg").Activate

投稿2019/06/23 13:55

TanakaHiroaki

総合スコア1065

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

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

sawako.a

2019/06/23 13:58

回答ありがとうございます。 ご教示いただいた内容でも、変わらずインデックスエラーが出ます。
TanakaHiroaki

2019/06/23 14:03

Sheets("emg")は、開いているWorkbooks(Template_ExcelName)に実在するシートで間違いないでしょうか?
sawako.a

2019/06/23 14:05

間違いないです。
TanakaHiroaki

2019/06/23 14:08

2行にしてみて、インデックスエラーは2行目で発生しますか? Workbooks(Template_ExcelName).Activate Worksheets("emg").Activate
TanakaHiroaki

2019/06/23 14:10

ついでに以下も試してみてください。emgが変数なら、こちらが正しい記述です。 Workbooks(Template_ExcelName).Activate Worksheets(emg).Activate
sawako.a

2019/06/23 14:14

emgは変数ではなく、実シート名です。 2019/06/23 23:08のソースを試しましたが、1行目で発生します。
TanakaHiroaki

2019/06/23 14:16

ありがとうございます。そうであれば Workbooks(Template_ExcelName)が 別のExcelで開かれている可能性があります。
sawako.a

2019/06/23 14:18

理解できていなくて申し訳ないのですが、 別のExcelで開かれているというのはどういう意味ですか?
TanakaHiroaki

2019/06/23 14:22

例えば、Excel2010であれば、Excelを重複起動できます。 現在の問題は、開いているExcelファイルを認識できていないので、そのファイルはExcelを別に起動し、そこから開かれている可能性があるので、そのようにコメントしました。 もしそうでなければ、ファイル名の指定 Template_ExcelName に誤りがあることになります。
TanakaHiroaki

2019/06/23 14:26

ファイル名 Template_ExcelName は、拡張子を含めて指定されていますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問