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

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

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

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

Q&A

解決済

4回答

7260閲覧

エラー 9 「インデックスが有効範囲にありません。」

kkkkkkkkkkkf

総合スコア6

VBA

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

0グッド

0クリップ

投稿2020/02/25 06:11

編集2020/02/25 07:54

下記のコードを実行するとエラー '9': インデックスが有効範囲にありません。
と表示されます。

Sub makeText() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim datFile As String datFile = ActiveWorkbook.Path & "\data.txt" Open datFile For Output As #1 Dim i As Long i = 1 Do While ws.Cells(i, 1).Value <> "" Print #1, ws.Cells(i, 2).Value i = i + 1 Loop Close #1 MsgBox "data.txtに書き出しました" Call list End Sub Sub list() Dim 名前 As Range For Each 名前 In Worksheets("リスト").Range("A1:A2") Worksheets("ヒナガタ").Copy After:=Workbooks("Book2").Worksheets(Worksheets.Count) ActiveSheet.Name = 名前.Value ActiveSheet.Range("AH5") = 名前.Value Next 名前 End Sub

この行でエラーが起こっているのは分かるんですが、原因がわかりません。

Worksheets("ヒナガタ").Copy After:=Workbooks("Book2").Worksheets(Worksheets.Count)

何方かご教授お願い致します。


追記

ttyp03様、ご教授頂いたのコードで実行したら別の箇所でエラーが発生しました。(´;ω;`)
イメージ説明


追記02

開くというのは、画像の通りでよろしいでしょうか?(><)
イメージ説明

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

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

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

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

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

guest

回答4

0

どのブックがアクティブなのかがよくわかりませんが、明示的に書くならこうなるのでは。

VBA

1Worksheets("ヒナガタ").Copy After:=Workbooks("Book2").Worksheets(Worksheets.Count) 23Worksheets("ヒナガタ").Copy After:=Workbooks("Book2").Worksheets(Workbooks("Book2").Worksheets.Count)

追記です。

シートをコピーするとコピー先のシートがアクティブになるのが原因と思われます。
アクティブ前提のコードにありがちな問題と思われます。
Book2にコピーするとBook2がアクティブになり、Worksheets("ヒナガタ")が参照できなくなっている。
これを回避するにはブックまたはシートを明示的に指定するようにしましょう。
list関数を次のようにしてみてください。
動作確認はしていないので問題あればコメントください。

VBA

1Sub list() 2 3 Dim srcbk As Workbook 4 Dim dstbk As Workbook 5 Dim 名前 As Range 6 7 Set srcbk = ThisWorkbook 8 Set dstbk = Workbooks("Book2") 9 10 For Each 名前 In srcbk.Worksheets("リスト").Range("A1:A2") 11 12 srcbk.Worksheets("ヒナガタ").Copy After:=dstbk.Worksheets(dstbk.Worksheets.Count) 13 14 ActiveSheet.Name = 名前.Value 15 ActiveSheet.Range("AH5") = 名前.Value 16 Next 名前 17 18End Sub 19

投稿2020/02/25 06:22

編集2020/02/25 07:04
ttyp03

総合スコア16998

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

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

kkkkkkkkkkkf

2020/02/25 06:29

ご返答ありがとうございます。 業者リスト.xlsmファイルのリストというシートからBook2へコピーをしたいと思っております。 業者リスト.xlsmファイルのリストシートを開いた状態でマクロを実行する予定です。
ttyp03

2020/02/25 06:36

で、結果はどうでしたか?
kkkkkkkkkkkf

2020/02/25 06:39

エラー '9': インデックスが有効範囲にありません。と再度表示されました。。。
ttyp03

2020/02/25 07:04

回答を追記しました。 ご確認ください。
radames1000

2020/02/25 07:18

Book2は開かれていますか?
ttyp03

2020/02/25 07:20

radames1000さん> そっちの可能性もありましたか。。。
radames1000

2020/02/25 07:20

あ、ttyp03さんの追記を更新していません。失礼しました。
radames1000

2020/02/25 07:21

ttyp03さん> 慌てて誤字脱字すぎて申し訳ないです。開かれていない可能性もあると思いましたが、大半は追記で書いてくださったものだと思います。
kkkkkkkkkkkf

2020/02/25 07:33

radames1000様> Book2は開いた状態で実行しています。
ttyp03

2020/02/25 07:40

追記を確認しました。 Book2を開いていないとしか思えませんが。。。 コピー先のブック名をよくお確かめください。
Y.H.

2020/02/25 07:54

「book2」か「マクロ記載しているworkbook」どちらかを「管理者として実行」で起動したExcelで開いていませんか?
kkkkkkkkkkkf

2020/02/25 07:56

ttyp03様> 再度追記しました。お手数をおかけして申し訳ございません。。。
kkkkkkkkkkkf

2020/02/25 07:58

Y.H.様> ご返答ありがとうございます。 普通に開いているので「管理者として実行」は行っていないと思います。
radames1000

2020/02/25 08:08

Set dstbk = Workbooks("Book2") ↓ Set dstbk = Workbooks("Book2.xlsx") でいかがでしょうか。
ttyp03

2020/02/25 08:08

以下に変更してください。 Set dstbk = Workbooks("Book2.xlsx")
ttyp03

2020/02/25 08:08

わ、かぶった。。。 ありがとうございます。
kkkkkkkkkkkf

2020/02/25 08:15

ttyp03様> ありがとうございます。mattuwan様が教えてくださったコードで試して、 With Workbooks("Book2").Worksheets ↓ With Workbooks("Book2.xlsx").Worksheets 実行することができました。 ご教授頂きありがとうございます!!!
guest

0

ベストアンサー

ExcelVBA

1Sub list() 2 Dim wsTemplate As Worksheet 3 Dim c As Range 4 Dim sName As String 5 6 Set wsTemplate = ThisWorkbook.Worksheets("ヒナガタ") 7 For Each c In ThisWorkbook.Worksheets("リスト").Range("A1:A2") 8 sName = c.Value 9 With Workbooks("Book2").Worksheets 10 wsTemplate.Copy After:=.Item(.Count) 11 With .Item(.Count) 12 .Name = sName 13 .Range("AH5") = sName 14 End With 15 End With 16 Next 17End Sub

インデックスが無いと言われる時は、
無い番号を指定しているか、
無い名前を指定しているかどっちかです。

質問者さんが、「あるじゃん!」って思ってるなら、
質問者さんとエクセル君の認識がずれているということです。
複数のブックを扱うときは、
誰がやっても紛れが無いよう、ブック名から明示すべきです。

コードは動作確認してません。間違ってたらごめんなさいです。


Book2という名前のブックが開いてないから、
インデックスがないと言われているようですね。


ExcelVBA

1Sub list() 2 Dim wsTemplate As Worksheet 3 Dim rngName As Range 4 Dim wbkNew As Workbook 5 Dim ws As Worksheet 6 7 Set wsTemplate = ThisWorkbook.Worksheets("ヒナガタ") 8 Set rngName = ThisWorkbook.Worksheets("リスト").Range("A1:A2") 9 10 wsTemplate.Copy 11 Set wbkNew = workbooks(workbooks.count) 12 wsTemplate.Copy after:=wbkNew.Worksheets(1) 13 14 For Each ws In wbkNew.Worksheets 15 With ws 16 .Name = rngName(.Index).Value 17 .Range("AH5").Value = rngName(.Index).Value 18 End With 19 Next 20End Sub

もしかしてこういう事かな?
新規作成で作られたブック名は、必ず「Book2」とは限られれません。
開いた順番で番号(インデックス番号)が振られますので、
最後に開いたブックは、
Workbooks(workbook.count)で示せます。

あぁ、ごめんなさい。
慌てて書いたからぐちゃぐちゃです><

投稿2020/02/25 07:58

編集2020/02/25 08:26
mattuwan

総合スコア2136

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

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

kkkkkkkkkkkf

2020/02/25 08:11

mattuwan様> ありがとうございます。 With Workbooks("Book2").Worksheets ↓ With Workbooks("Book2.xlsx").Worksheets を変更したら動きました!!
mattuwan

2020/02/25 08:27

なるほど。。。
mattuwan

2020/02/25 08:29

で、コードの意味がわかりました? 見慣れない書き方してると思いますけど。。。。 そこはどうでもいいのかな。。。。
kkkkkkkkkkkf

2020/02/25 08:53

ひとまず安心はしましたが、なんで拡張子が入ったら動いたかを調べています。 (原因を理解しないとまた同じところでつまずくかなと思いましたので(><;)) 後は下記の.Indexが何を意味しているかも調べます。 ↓ .Name = rngName(.Index).Value .Range("AH5").Value = rngName(.Index).Value
mattuwan

2020/02/25 23:02

なんで拡張子が入ったら動いたかを調べています。 拡張子を含めてブック名だからでは? Windowsの設定で拡張子を表示しないようにしたら、 ブック名も表示しなくなるかも? でも、拡張子を表示する設定のパソコンに移ったら、 今回のようにエラーになるのでブック名には拡張子を含めるのが、 より良いです。反対はエラーにならないので。 >後は下記の.Indexが何を意味しているかも調べます。 Workbooksはブックの集まり、 Worksheetsは、ワークシートの集まり、 Rangeはセルの集まり、 エクセルVBAでは、集合体の各要素を番号で指定できるよう設定されてます。
kkkkkkkkkkkf

2020/02/26 01:56

ご返答ありがとうございます。 >Windowsの設定で拡張子を表示しないようにしたら、 ブック名も表示しなくなるかも? そーいうことだったんですね(・・;) 今使っているパソコンには拡張子が表示されています。今後注意します。。。 >Workbooksはブックの集まり、 Worksheetsは、ワークシートの集まり、 Rangeはセルの集まり、 エクセルVBAでは、集合体の各要素を番号で指定できるよう設定されてます。 調べたら、Sheetsオブジェクトの性質?のようなもので、 取得したいシートを指定する時に使うんだなと理解しました。
mattuwan

2020/02/26 06:08

>調べたら、Sheetsオブジェクトの性質?のようなもので、 >取得したいシートを指定する時に使うんだなと理解しました。 ちょっと違います。 Sheetsオブジェクトを構成する属性の一つです。 Msgbox worksheets("Sheet1").Index のようにしたら、1が返ってくると思います。(新規ブックの場合。) つまり左から1番目というインデックス番号が返ってきます。 なので左から1番目のシートを選択しようとするなら、 Worksheets(1).Select とも書けます。 つまり、 エラー '9': インデックスが有効範囲にありません。 と出るときは、名前かインデックス番号のどちらかを、 存在しないものを指定していると、案内しているわけです。 これはブックでもセルでも同じことです。 で、 >With ws > .Name = rngName(.Index).Value 変数wsに入っているシートのインデックス番号を取得し、 その番号を流用し、セルの集合の何番目かを指定して値を取得しています。 つまり操作対象のシートが1番目ならセル範囲の中の1番目の値を、シート名に設定しています。 >With Workbooks("Book2").Worksheets > wsTemplate.Copy After:=.Item(.Count) この辺も意味解りました?
kkkkkkkkkkkf

2020/02/27 01:21

>変数wsに入っているシートのインデックス番号を取得し、 その番号を流用し、セルの集合の何番目かを指定して値を取得しています。 つまり操作対象のシートが1番目ならセル範囲の中の1番目の値を、シート名に設定しています。 ↑ 動きはわかりましたがコーディングする時に、Indexの値がどのように入ってくるかなど意図して組むのは難しいと思っています。 >With Workbooks("Book2").Worksheets > wsTemplate.Copy After:=.Item(.Count) Book2にコピーするのかなとは思っています。
guest

0

コピー先ブック(book2)の最後にシートをコピーするのであれば、After:=以降は
Workbooks("Book2").Worksheets(Workbooks("Book2").Worksheets.Count)
では?

投稿2020/02/25 07:52

DreamTheater

総合スコア1095

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

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

0

Excel VBAでは、配列のインデックスは0から始まります。

たとえば、Workbooks("Book2")にWorksheetが5枚入っているとすると、
worksheetの配列の各要素(つまり、各Worksheet)は、worksheets(0),worksheets(1),worksheets(2),worksheets(3),worksheets(4)
というように参照できる訳です(ここで、配列のインデックスの範囲が、0~4となっている事に注意してください)。

で、エラーが出たコード

Worksheets("ヒナガタ").Copy After:=Workbooks("Book2").Worksheets(Worksheets.Count)

を見ると、Worksheets.CountはWorksheetの数(5)なので、Worksheets(5)にアクセスしようとしている。

でも、上で説明したように5枚のWorksheetがある場合のWorksheetsのインデックスの範囲は0~4なので、「指定されたインデックス5は、Worksheetsの有効なインデックス範囲(0~4)に含まれていない」というエラーが出たのです。

『VBAの配列のインデックスは0から始まる(1から始まるんじゃないよ)』というのは、覚えておいてください。

投稿2020/02/25 07:24

coco_bauer

総合スコア6915

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

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

mattuwan

2020/02/25 07:42

Worksheetsはコレクションなので1からですよ。
kkkkkkkkkkkf

2020/02/25 07:44

coco_bauer様> ありがとうございます。 makeText関数内のループで、毎度list関数を呼び出せばインデックスの範囲外を指定することはないでしょうか? 拙い文章ですみません、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問