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

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

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

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

Q&A

解決済

2回答

1098閲覧

インデックス範囲が有効ではありませんについて

somechan1

総合スコア17

VBA

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

0グッド

1クリップ

投稿2020/11/02 03:40

現在会社の個別の勤怠管理票を作り、それを集計するvbaを作りたく勉強しています。
そこでまず一人だけ(例では田中さん)についての勤怠管理票を開いて、それを集計用の別のブックのシートの転記を試みました。しかしインデックスが有効ではありませんと出ました。以下は私が書いたコードです。

Sub 田中勤務時間()

Application.ScreenUpdating = False Dim path As String Dim j As Long path = "C:\Users\tanak\OneDrive\デスクトップ\勤怠時間\" For j = 1 To 5 Workbooks.Open path & "田中.xlsx" ※ここが田中さんの勤怠用のエクセルブックを表しています。 Worksheets("Sheet2").Cells(4, 1 + j).Value = Cells(4, 1 + j).Value ←ここでインデックスが有効ではありませんと出ます。 ActiveWorkbook.Close savechanges:=False Next j

End Sub

おそらく今開いているエクセル(集計用のエクセル)と田中さんのエクセルファイルを区別できていないため、正常に作動しないと予想していますが、正しいコードが調べても分からなく、アドバイス頂けないでしょうか。宜しくお願い致します。

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

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

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

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

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

meg_

2020/11/02 04:06

> Worksheets("Sheet2").Cells(4, 1 + j).Value = Cells(4, 1 + j).Value 上記コードのどこでエラーが発生しているのかを確かめましょう。まず、「Worksheets("Sheet2")」は存在していますか?
somechan1

2020/11/02 06:32

シート名は開いているブックに存在していますが、転記先のブック名だと正常に実施されなかったのですが、thisworkbookだと正常に作動しませんでした。 ・作動したコード ThisWorkbook.Worksheets("Sheet2").Cells(4, 1 + j).Value = Cells(4, 1 + j).Value ・作動しなかったコード Workbooks("集計").Worksheets("Sheet2").Cells(4, 1 + j).Value = Cells(4, 1 + j).Value 後学のため、理由など教えて頂けると幸いです。
guest

回答2

0

おそらく今開いているエクセル(集計用のエクセル)と田中さんのエクセルファイルを区別できていないため

区別できてないではなく、
書いてないので勝手に解釈されているのです。
複数ブック、複数シートを扱う場合は、
ブックやシートを明示したコードを書くようにしなければ、
エラーや意図しない結果が出ても、仕方がないです。

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

このエラーは、指定したインデックス番号や名前が存在しないときに出ます。

Worksheets("Sheet2").Cells(4, 1 + j).Value

↑は、Activewindow.Worksheets("Sheet2").Cells(4, 1 + j).Value
と解釈されますし、

Cells(4, 1 + j).Value

↑は、Activewindow.activesheet.Cells(4, 1 + j).Value
と解釈されますので、気を付けましょう。

また、
Workbooks.Openメソッドは、「返り値」がありますので、
それを変数に受けておけば、
なんども、workbooks(勤怠用エクセルのファイル名)と指定しなくても、
変数を利用して指定できます。

ExcelVBA

1Sub 田中勤務時間() 2 3 'Application.ScreenUpdating = False 4 5 Dim path As String 6 Dim wbkFrom As Workbook 7 Dim wbkTo As Workbook 8 9 path = "C:\Users\tanak\OneDrive\デスクトップ\勤怠時間\" 10 Set wbkFrom = Workbooks.Open(path & "田中.xlsx") '※ここが田中さんの勤怠用のエクセルブックを表しています。 11 Set wbkTo = ThisWorkbook 12 'set wbkto = workbooks(1) '開いた順番で番号が振られるので番号で指定しても良い 13 'set wbkto = workbooks("ファイル名") 'ブック名でもよいし、フルパスでもよい 14 15 wbkTo.Sheets("Sheet2").Range("D1:D5").Value = wbkFrom.Worksheets(1).Range("D1:D5").Value 16 17 wbkFrom.Close False 18End Sub

投稿2020/11/02 07:31

mattuwan

総合スコア2163

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

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

somechan1

2020/11/02 08:13

workbook.openを変数にできるとは、初耳でした。とても勉強になりました。ありがとうございます。
guest

0

ベストアンサー

今開いているエクセルは集計用のエクセルではなく、田中さんの勤怠用のエクセルになるため区別できていないですね
今開いているエクセルは直近にWorkbooks.Openで開いたエクセルになります
おそらく集計用のエクセルのsheet2のセルに値を入れたいのでしょうが、今開いているエクセル(田中さんの勤怠用のエクセル)にsheet2という名前のシートがないためエラーになります
Worksheets("Sheet2").Cells(4, 1 + j).Value = Cells(4, 1 + j).Valueを
workbooks(勤怠用エクセルのファイル名).Worksheets("Sheet2").Cells(4, 1 + j).Value = Cells(4, 1 + j).Valueに変えると良いでしょう
もしくはThisWorkBookを使うと良いです

投稿2020/11/02 04:14

編集2020/11/02 04:28
takk_014

総合スコア53

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

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

somechan1

2020/11/02 06:34

takkさん、コメントありがとうございました。 頂いたアドバイスで実施できたのですが、下記のパターンに分かれました。 thisworkbook → 出来ました workbooks(勤怠用エクセルのファイル名) → 出来ませんでした 後学のため、理由を教えて頂けると幸いです。宜しくお願い致します。
takk_014

2020/11/02 07:48

thisworkbookでマクロを動かしているエクセルファイルを指定できます すみません、誤字ですがworkbooksの最初のwは大文字のWでした そして最後のsは必要ないため Workbook(勤怠用エクセルのファイル名) が正しいです 久しぶりにVBAに触れるので忘れていました
somechan1

2020/11/02 08:11

私もsを付けていたかもしれません。初歩的な質問で申し訳御座いませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問