@morikyuu3327 (mori hisashi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

vbaにてエラー9が起き、直せません。

解決したいこと

Excelのリストsheetの内容を社員紹介sheetの指定箇所に代入し、
社員紹介sheetをリストのC列が空になるまでDo~loop文を回したいのですが、
インデックスが有効範囲にありませんと出てしまい困ってます。

発生している問題・エラー

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

例)

NameError (uninitialized constant World)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

Sub ensyu()
Dim a(3) As String
Dim i As Integer
Dim m As Integer
Dim s As Integer
Dim t As String
i = 7
s = 3
Do
  For m = 0 To 3 Step 1  '空の配列aにリストの情報を入れる
    a(m) = Sheets("リスト").Cells(i, s).Value
    s = s + 1
  Next m

  For m = 0 To 3 Step 1 'sheet社員紹介にリストの情報を移す
    If m = 0 Then
      Sheets("社員紹介").Range("D2:H4").Value = a(m)
    ElseIf m = 1 Then
      Sheets("社員紹介").Range("D4:H6").Value = a(m)
    ElseIf m = 2 Then
      Sheets("社員紹介").Range("D7:H9").Value = a(m)
    ElseIf m = 3 Then
      Sheets("社員紹介").Range("D10:H12").Value = a(m)
    End If
  Next m

  t = a(2) & "_" & a(1)

  Sheets("社員紹介").Copy 'シートの複製
  Application.Dialogs(xlDialogSaveAs).Show _
    Arg1:=t

  If Sheets("リスト").Cells(i, 3).Value <> "" Then  '社員コードにデータが無ければループを終了
    Exit Do
  End If

  i = i + 1

Loop


End Sub

例)

vba

自分で試したこと

色々サイトを調べてみたのですが、よくわかりません。

0 likes

2Answer

恐らく、複製されたブックがアクティブになり、
そのブックにシート「リスト」が無いためエラーが出ているのだと思います。

下記に、なんとなく動きそうなコードを書いておきます。

Sub ensyu()
Dim a(3) As String
Dim i As Integer
Dim m As Integer
Dim s As Integer
Dim t As String
+Dim book As Workbook
+Set book = ActiveWorkbook
i = 7
s = 3
Do
  For m = 0 To 3 Step 1  '空の配列aにリストの情報を入れる
    a(m) = Sheets("リスト").Cells(i, s).Value
    s = s + 1
  Next m

  For m = 0 To 3 Step 1 'sheet社員紹介にリストの情報を移す
    If m = 0 Then
      Sheets("社員紹介").Range("D2:H4").Value = a(m)
    ElseIf m = 1 Then
      Sheets("社員紹介").Range("D4:H6").Value = a(m)
    ElseIf m = 2 Then
      Sheets("社員紹介").Range("D7:H9").Value = a(m)
    ElseIf m = 3 Then
      Sheets("社員紹介").Range("D10:H12").Value = a(m)
    End If
  Next m

  t = a(2) & "_" & a(1)

  Sheets("社員紹介").Copy 'シートの複製
  Application.Dialogs(xlDialogSaveAs).Show _
    Arg1:=t

-  If Sheets("リスト").Cells(i, 3).Value <> "" Then  '社員コードにデータが無け
+  If book.Sheets("リスト").Cells(i, 3).Value <> "" Then  '社員コードにデータが無ければループを終了
    Exit Do
  End If

  i = i + 1

Loop


End Sub

何かの参考になれば幸いです。

0Like

Comments

  1. @morikyuu3327

    Questioner

    御回答頂きありがとうございます。
    リストシートがエラーの原因になってたんですね。。。

追記:以下の回答は間違いでした。 Dim a(3) As String はインデックスの最大値が3となる4要素の配列ですね。


a は3要素の配列なのでインデックスの範囲は0〜2ですが、 For m = 0 To 3 Step 1 ではインデックス0〜3を参照しようとしています。結果、 m が3のとき a(m) が範囲外になります。 For m = 0 To 2 Step 1 に直してください。

0Like

Your answer might help someone💌