PR
アフィリエイト広告を利用しています
アフィリエイト広告を利用しています

VBA「実行時エラー 1004」の原因7つと直し方|アプリケーション定義またはオブジェクト定義のエラー

ノートパソコンの画面を指差して微笑む女性講師 EXCEL VBA講座
スポンサーリンク

マクロを実行したら、いきなり画面が止まって「実行時エラー ‘1004’: アプリケーション定義またはオブジェクト定義のエラーです」——。この赤い箱が出たとき、あなたが最初に押すべきボタンは[デバッグ]です。押すとVBAの画面に切り替わり、1行だけ黄色く光ります。そこが原因の行です。そして1004の正体は、ほとんどの場合「VBAが指定した”モノ”が見つからない」こと。確認するのは3つだけ。①Sheets("○○")シート名の打ち間違い(余分なスペース・全角半角の混在)、②そのシートやブックが開いていない/存在しない、③Range("A1:A0") のような存在しないセル範囲を指している。この3つで大半が直ります。以下の早見表から、あなたの黄色い行に当てはまるものを選んでください。

パソコンの画面をのぞき込み、原因の一点を指差している女性
[デバッグ]を押して黄色く光る行を見つければ、原因はほぼ特定できます
スポンサーリンク
  1. まず[デバッグ]を押して「黄色い行」を見る(症状別 早見表)
    1. あなたの黄色い行はどれ?
    2. 直す前に必ずやること:黄色い行の中身を「見る」
  2. 原因1:シート名・ブック名の指定ミス(いちばん多い)
    1. ❌ ダメな書き方
    2. ✅ 直した書き方
    3. つまずき対策
  3. 原因2:閉じているブック/別ブックのセルを直接さわっている
    1. ❌ ダメな書き方
    2. ✅ 直した書き方
    3. つまずき対策
  4. 原因3:セル範囲の書き方が壊れている(変数が 0 や空になっている)
    1. ❌ ダメな書き方
    2. ✅ 直した書き方
    3. つまずき対策
  5. 原因4:Select / Activate を使っている(根本解決は「使わない」)
    1. ❌ ダメな書き方
    2. ✅ 直した書き方(Selectを消す)
    3. つまずき対策
  6. 原因5:シートやブックが「保護」されている/読み取り専用で開いている
    1. ❌ ダメな書き方
    2. ✅ 直した書き方(一時的に解除して、必ず戻す)
    3. つまずき対策
  7. 原因6:Copy / PasteSpecial のサイズが合っていない
    1. ❌ ダメな書き方
    2. ✅ 直した書き方(貼り付け先は「左上のセル1つ」でいい)
    3. つまずき対策
  8. 原因7:結合セルやフィルターがかかった範囲を操作している
    1. ❌ ダメな書き方
    2. ✅ 直した書き方(結合を解除してから操作する)
    3. つまずき対策
  9. 二度と止まらないための書き方(ここが本当の解決です)
    1. 1. Option Explicit を必ず1行目に書く
    2. 2. シートは必ず「どのブックの」まで書く
    3. 3. On Error は「握りつぶす」ためではなく「後始末する」ために使う
  10. よくある質問(Q&A)
    1. Q1. [デバッグ]を押したら、パスワードを聞かれました。
    2. Q2. 「実行時エラー ‘1004’」ではなく「’424′ オブジェクトが必要です」と出ました。
    3. Q3. 「’9′ インデックスが有効範囲にありません」との違いは?
    4. Q4. 自分のPCでは動くのに、同僚のPCでは1004になります。
    5. Q5. そもそもマクロを実行しようとすると、黄色いバーが出て動きません。
  11. 次に読むと、もっと自動化が進みます
  12. まとめ:1004は「モノが見つからない」の合図。あなたのミスではありません
  13. 出典(一次情報)

まず[デバッグ]を押して「黄色い行」を見る(症状別 早見表)

「実行時エラー 1004」は、エクセルVBAのエラーの中でもいちばん原因の種類が多いエラーです。逆に言えば、エラー文だけを見ていても絶対に原因は分かりません。ここで多くの方が「1004 直し方」で検索して、書いてあることを片っ端から試して疲れてしまいます。

やることは1つです。エラーの箱に出ている[デバッグ]をクリックしてください。VBAの編集画面(VBE)が開き、止まった1行が黄色く塗られます。その行に何が書いてあるかで、原因はほぼ確定します。

💡 黄色い行=「悪い行」とは限りません。正確には「実行しようとして失敗した行」です。原因そのものは、その少し上で変数に入れた値だったりします。まずは黄色い行を起点に、上へ数行たどるクセをつけると一気に解決が早くなります。

あなたの黄色い行はどれ?

黄色く光っている行に書いてあるもの 疑うこと 進む先
Sheets("売上") / Worksheets("Sheet1") のようにシート名が書いてある その名前のシートが本当にあるか(スペース・全半角) 原因1
Workbooks("○○.xlsx") など別ファイル名が書いてある そのブックを開いているか 原因2
Range("A1:A" & i) のように変数で範囲を作っている 変数が 0 や空になっていないか 原因3
.Select / .Activate で終わっている 対象のシートがアクティブでない 原因4
値を書き込む行(= 100.Value = シートやブックが保護・読み取り専用 原因5
.Copy / .PasteSpecial がある コピー元と貼り付け先のサイズ違い 原因6
.Delete / .Sort / .Merge など範囲を丸ごと操作 結合セル・フィルターが範囲に混ざっている 原因7

⚠️ お使いのエクセルのバージョンや言語設定によって、メッセージが「アプリケーション定義またはオブジェクト定義のエラーです」ではなく「Range メソッドは失敗しました: ‘_Global’ オブジェクト」「指定された名前のシートが見つかりません」のように表示されることがあります。番号が1004なら、対処は同じと考えて読み進めて大丈夫です。

直す前に必ずやること:黄色い行の中身を「見る」

黄色い行にマウスカーソルを合わせるだけで、変数の中身が小さな吹き出しで表示されます。これが最強の武器です。もっと確実に見たいときは、VBAの画面で [表示]タブ → [ウィンドウ]グループ → [イミディエイト ウィンドウ](ショートカット CtrlG)を開き、次の1行を打って Enter を押してください。

? ActiveSheet.Name

今どのシートを見ているかが表示されます。同じ要領で ? i(変数 i の中身)、? Sheets.Count(シートの数)も確認できます。推測せず、目で見る。これだけで解決時間は半分になります。

原因1:シート名・ブック名の指定ミス(いちばん多い)

1004の最頻出がこれです。VBAは Sheets("売上") と書かれたら、「売上」という名前のシートを1文字違わず探します。1文字でも違えば「そんなモノはありません」=1004です。

❌ ダメな書き方

Sub NGSheetName()
    Sheets("売上 ").Range("A1").Value = 100   '← 「売上」の後ろに半角スペース
End Sub

✅ 直した書き方

Sub OKSheetName()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("売上")   '← ブックも明示して確実に取る
    ws.Range("A1").Value = 100
End Sub

シート名の食い違いは、目視ではまず気づけません。次のマクロを1回流して、実際のシート名を機械に読ませてください。これが最短ルートです。

Sub シート名を全部表示()
    Dim ws As Worksheet
    Dim s As String
    For Each ws In ThisWorkbook.Worksheets
        s = s & "[" & ws.Name & "]" & vbCrLf   '← [ ] で挟むと余分な空白が見える
    Next ws
    MsgBox s
End Sub

[売上 ] のようにカッコの内側に空きがあれば、それが犯人です。VBA側のコードを直すか、シートのタブ名から余分なスペースを削ってください。

つまずき対策

「見た目は同じなのに一致しない」——ほぼ全角と半角の混在です。Sheet1(半角)と Sheet1(全角)は、VBAにとって完全に別の文字列です。数字の「1」と英字の「l」、ハイフンと長音符「ー」も定番の落とし穴です。上のマクロで表示された名前をコピーしてコードに貼り付けるのが確実です。

「シート名を後から変えられてしまう」——共有ファイルなら十分あり得ます。その場合は名前ではなくインデックス番号Worksheets(1))やオブジェクト名(VBA画面の左側に出る Sheet1 という名前。タブ名を変えても変わりません)で指定すると、名前変更に強いマクロになります。

原因2:閉じているブック/別ブックのセルを直接さわっている

VBAは閉じているブックのセルを直接読み書きできません。「別のファイルからデータを取ってくる」タイプのマクロで、ファイルを開かずに実行すると1004で止まります。

❌ ダメな書き方

Sub NGClosedBook()
    '「元データ.xlsx」を開いていないのにさわろうとしている
    MsgBox Workbooks("元データ.xlsx").Worksheets("Sheet1").Range("A1").Value
End Sub

✅ 直した書き方

Sub OKOpenThenRead()
    Dim wb As Workbook
    Dim v As Variant

    Set wb = Workbooks.Open("C:\data\元データ.xlsx")   '← まず開く
    v = wb.Worksheets("Sheet1").Range("A1").Value
    wb.Close SaveChanges:=False                         '← 読んだら閉じる

    MsgBox v
End Sub

「もう開いているかどうか分からない」場合は、開いていれば使い、閉じていれば開く、という書き方が安全です。

Sub OKOpenIfNeeded()
    Dim wb As Workbook
    Dim opened As Boolean

    On Error Resume Next
    Set wb = Workbooks("元データ.xlsx")     '← 開いていればここで取れる
    On Error GoTo 0

    If wb Is Nothing Then
        Set wb = Workbooks.Open("C:\data\元データ.xlsx")
        opened = True
    End If

    MsgBox wb.Worksheets("Sheet1").Range("A1").Value

    If opened Then wb.Close SaveChanges:=False
End Sub

つまずき対策

「拡張子まで書いていますか?」——Workbooks("元データ") では見つかりません。Workbooks("元データ.xlsx") のように拡張子込みのファイル名が必要です。ただしWindowsの設定で拡張子が非表示だと、本当は .xlsm なのに .xlsx だと思い込んでいる、というすれ違いも起きます。エクスプローラーの[表示]タブ → [表示/非表示]グループ → [ファイル名拡張子]にチェックを入れて確認してください。

「フォルダーの場所が人によって違う」——C:\Users\あなたの名前\... をコードに直書きすると、他の人のPCで必ず落ちます。マクロ入りファイルと同じフォルダーに置くルールにして、ThisWorkbook.Path & "\元データ.xlsx" と書くのがおすすめです。

原因3:セル範囲の書き方が壊れている(変数が 0 や空になっている)

これは「昨日まで動いていたのに今日は止まる」タイプの1004です。原因はコードではなくデータにあります。

Range("A1:A" & i) と書いたとき、変数 i0 なら、VBAには Range("A1:A0") という存在しない範囲が渡されます。i が空なら Range("A1:A") です。どちらも「そんなモノはありません」=1004。

❌ ダメな書き方

Sub NGRange()
    Dim lastRow As Long
    lastRow = Worksheets("売上").Cells(Rows.Count, 1).End(xlUp).Row
    '↑ データが1行も無いシートだと lastRow が 1 や 0 になることがある

    Worksheets("売上").Range("A2:A" & lastRow - 1).ClearContents   '← A2:A0 になり得る
End Sub

✅ 直した書き方

Sub OKRange()
    Dim ws As Worksheet
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("売上")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    If lastRow < 2 Then
        MsgBox "データがありません。処理を中止します。"
        Exit Sub                                  '← 空のときは何もしないで抜ける
    End If

    ws.Range("A2:A" & lastRow).ClearContents
End Sub

ポイントは「範囲を作る前に、その範囲が成り立つか確かめる」こと。If lastRow < 2 Then Exit Sub の1行を足すだけで、このタイプの1004はほぼ消えます。

つまずき対策

「範囲は正しそうなのに止まる」——シートに 65,536行の壁が絡んでいることがあります。古い形式(.xls)で保存されたブックでは、行数が65,536・列数が256までしかありません。ここに Rows.Count(新しい形式なら1,048,576)で作った範囲を渡すと1004です。上の「✅直した書き方」のように ws.Rows.Countシートを明示して書くと、そのシートの本当の行数が使われるので安全です。

「1行だけ処理すると落ちる」——Range("A2:A" & lastRow)lastRow が 2 のとき、範囲は A2:A2。これは有効なので問題ありません。落ちるのは 1 以下のときだけです。

原因4:Select / Activate を使っている(根本解決は「使わない」)

ネットで拾ったマクロや、エクセルの「マクロの記録」で作ったコードには .Select.Activate が大量に入っています。これが1004の隠れた大量発生源です。

理由はシンプルで、アクティブでないシートのセルは選択できないから。「Sheet2を表示していないのに、Sheet2のセルをSelectしろ」と言われたVBAは、1004で止まります。

❌ ダメな書き方

Sub NGSelect()
    Sheets("集計").Range("A1").Select     '← 「集計」を表示していないと1004
    Selection.Value = "合計"
End Sub

✅ 直した書き方(Selectを消す)

Sub OKNoSelect()
    ThisWorkbook.Worksheets("集計").Range("A1").Value = "合計"
End Sub

3行が1行になりました。Select はほぼ全部消せます。「選んでから何かする」ではなく「何をするか、を直接書く」のがVBAの本来の書き方です。速度も体感で変わります。

同じシートを何度もさわるなら、With ステートメントを使うと読みやすくなります。With は「このオブジェクトに対して、一連の処理をまとめて行う」ための書き方です(Microsoft Learn)。

Sub OKWith()
    With ThisWorkbook.Worksheets("集計")
        .Range("A1").Value = "合計"
        .Range("B1").Value = 12345
        .Range("A1:B1").Font.Bold = True
    End With
End Sub

つまずき対策

「どうしてもSelectが必要な場面」——マクロの最後に「見てほしいセルにカーソルを置いておく」ような用途は残ります。その場合はシートをアクティブにしてから選択してください。

Sub OKSelectIfYouMust()
    With ThisWorkbook.Worksheets("集計")
        .Activate            '← 先にシートを表示する
        .Range("A1").Select  '← そのうえで選択
    End With
End Sub

「非表示のシートは選択できない」——シートが非表示だと .Activate も1004になります。.Visible = xlSheetVisible で先に表示するか、そもそも Select を使わない書き方に直しましょう。

原因5:シートやブックが「保護」されている/読み取り専用で開いている

コードは完璧なのに、書き込む瞬間だけ止まる。これは保護が原因のことが多いです。

まず、あなたのファイルがどの状態か確認してください。

状態 見分け方 対処
シートの保護 [校閲]タブ →[保護]グループが「シート保護の解除」になっている 解除するか、VBAで一時解除
ブックの保護 同じく[校閲]タブに「ブックの保護」が押された状態 シートの追加・削除ができない
読み取り専用 タイトルバーに「[読み取り専用]」と出ている 閉じて開き直す/別名保存
他の人が開いている 開くときに「使用中」のメッセージが出た 相手が閉じるのを待つ

❌ ダメな書き方

Sub NGProtected()
    Worksheets("請求書").Range("C5").Value = 1000   '← 保護されていると1004
End Sub

✅ 直した書き方(一時的に解除して、必ず戻す)

Sub OKUnprotect()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("請求書")

    ws.Unprotect Password:="1234"       '← パスワードが無いなら Password: は不要
    ws.Range("C5").Value = 1000
    ws.Protect Password:="1234"         '← 処理が終わったら必ず保護し直す
End Sub

つまずき対策

「パスワードが分からない」——ファイルの作成者に確認してください。保護は意図的にかけられたものです。解除方法を無理に探すより、作成者に「この列だけ編集を許可してほしい」と頼むほうが早く、安全です。

「保護は解除したのに、まだ止まる」——シートではなくセル単位のロックが残っている可能性があります。また、ファイル自体が読み取り専用推奨で開かれている場合もあります。タイトルバーを一度確認しましょう。

💡 保護マクロを書くときの鉄則。「解除 → 処理 → 保護し直す」の3点セットにしてください。途中でエラーが出ると解除されたまま放置されます。それが心配なら、後述の On Error GoTo で「何があっても最後に保護し直す」形にするのが安全です。

原因6:Copy / PasteSpecial のサイズが合っていない

コピー&貼り付けを自動化したときの定番1004です。VBAは「コピー元と貼り付け先の形が違う」と拒否します。

❌ ダメな書き方

Sub NGPaste()
    Worksheets("元").Range("A1:C10").Copy
    Worksheets("先").Range("A1:B10").PasteSpecial xlPasteValues  '← 3列を2列に貼れない
End Sub

✅ 直した書き方(貼り付け先は「左上のセル1つ」でいい)

Sub OKPaste()
    Worksheets("元").Range("A1:C10").Copy
    Worksheets("先").Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False     '← 点滅する枠線を消す
End Sub

貼り付け先に左上の1セルだけを指定すれば、サイズ違いのエラーは起きません。

さらに、値をコピーするだけならクリップボードを使わない書き方が最速・最安定です。Copy はクリップボードを経由するため、他のアプリの操作に邪魔されると突然1004になることがあります。

Sub OKValueCopy()
    Worksheets("先").Range("A1:C10").Value = Worksheets("元").Range("A1:C10").Value
End Sub

1行です。書式は引き継がれませんが、値だけ移せば十分という場面ならこれが最強です。

つまずき対策

「フィルターで絞った結果を貼りたい」——絞り込み後は行が飛び飛びなので、そのままではサイズが合いません。SpecialCells(xlCellTypeVisible) で「見えているセルだけ」を対象にしてから Copy してください。

Sub OKVisibleOnly()
    Worksheets("元").Range("A1:C100").SpecialCells(xlCellTypeVisible).Copy
    Worksheets("先").Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
End Sub

「途中でクリップボードが空になる」——CopyPasteSpecial の間に MsgBox や他の処理を挟むと、コピー状態が解除されて1004になります。コピーしたら、すぐ貼る。これが原則です。

原因7:結合セルやフィルターがかかった範囲を操作している

最後は、範囲そのものが「素直な四角形になっていない」ケースです。

セルの結合がある範囲に対して Sort(並べ替え)、Delete(削除)、Merge を実行すると、VBAは「この操作はこの範囲に適用できません」と判断して1004を返します。エクセルの画面から手作業でやったときに「この操作を行うには、すべての結合セルを同じサイズにする必要があります」と怒られるのと、まったく同じ現象です。

❌ ダメな書き方

Sub NGMerged()
    '見出し行に結合セルが混ざっている範囲を、そのまま並べ替え
    Worksheets("売上").Range("A1:D50").Sort _
        Key1:=Worksheets("売上").Range("B1"), Order1:=xlAscending, Header:=xlYes
End Sub

✅ 直した書き方(結合を解除してから操作する)

Sub OKUnmergeThenSort()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("売上")

    ws.Range("A1:D50").UnMerge          '← まず結合を解除
    ws.Range("A1:D50").Sort _
        Key1:=ws.Range("B1"), Order1:=xlAscending, Header:=xlYes
End Sub

「結合を解除したら見た目が崩れる」場合は、結合の代わりに[セルの書式設定]→[配置]タブ→[横位置]→[選択範囲内で中央]を使うと、見た目はそのままで結合を避けられます。この考え方は、手作業でつまずいたときにも効きます。詳しくはこちらの記事にまとめました。

【もう固まらない】エクセルのセル結合で並べ替え・フィルターができない原因と直し方7手順
エクセルで「結合されたセルには同じ操作を実行できません」と出て並べ替え・フィルター・コピーができない原因は「セルの結合」です。Ctrl+Aで一括解除する方法、結合セルの探し方、見た目を保つ「選択範囲内で中央」、解除後の空白を埋める手順まで7ステップで解説します。

つまずき対策

「フィルターがかかったまま行を削除したら止まった」——絞り込み中の削除は動作が不安定です。処理の先頭で ws.AutoFilterMode = False と書いてフィルターを解除してから操作してください。

「どこが結合セルか分からない」——次のマクロで一発で分かります。

Sub 結合セルを探す()
    Dim c As Range
    Dim s As String
    For Each c In ActiveSheet.UsedRange
        If c.MergeCells Then s = s & c.Address(False, False) & " "
    Next c
    If s = "" Then s = "結合セルはありません。"
    MsgBox s
End Sub
作業を終えて親指を立て、笑顔でうなずいている女性
原因さえ分かれば、1004はもう怖くありません

二度と止まらないための書き方(ここが本当の解決です)

原因を1つずつつぶすのも大事ですが、そもそも1004が出にくいコードの書き方を覚えると、明日からのストレスが激減します。3つだけ紹介します。

1. Option Explicit を必ず1行目に書く

これはモジュールの中のすべての変数を、宣言してから使うことを強制する命令です(Microsoft Learn)。

Option Explicit          '← モジュールの1行目に書く

Sub Sample()
    Dim lastRow As Long
    lastRow = 10
    MsgBox lastRwo       '← 打ち間違い。実行前にエラーで教えてくれる
End Sub

これを書いていないと、lastRwo という新しい空っぽの変数が勝手に作られ、Range("A1:A" & lastRwo)Range("A1:A") になって——1004です。原因3の正体はこれだった、というケースが本当に多いのです。

毎回自動で書かせる設定もあります。VBAの画面で [ツール]メニュー → [オプション] → [編集]タブ → [変数の宣言を強制する]にチェック。これで新しいモジュールの1行目に自動で入ります。今日、この5秒の設定だけはやっておいてください。

2. シートは必ず「どのブックの」まで書く

Sheets("売上") は、実は ActiveWorkbook.Sheets("売上") の省略形です。つまり「今、手前に表示されているブック」を見に行きます。マクロの実行中に別のブックが手前に来ると、探す場所が変わって1004になります。

'❌ 曖昧
Sheets("売上").Range("A1").Value = 1

'✅ 確実(マクロが入っているブックの、売上シート)
ThisWorkbook.Worksheets("売上").Range("A1").Value = 1

Worksheets プロパティは、指定したブックの中のワークシートを返します(Microsoft Learn)。Sheets はグラフシートも含むので、ワークシートだけを扱うなら Worksheets のほうが安全です。

3. On Error は「握りつぶす」ためではなく「後始末する」ために使う

1004が出るからといって、先頭に On Error Resume Next と書いてエラーを見えなくするのはいちばん危険な対処です。エラーは消えますが、処理も抜け落ちたまま最後まで走ります。「エラーは出ないのに、なぜか数字が合わない」という、もっと厄介な問題に化けます。

正しい使い方は、「何があっても後始末をする」です。On Error GoTo は、エラーが起きたときに指定した場所へ処理を飛ばす命令です(Microsoft Learn)。

Option Explicit

Sub SafeMacro()
    Dim ws As Worksheet

    On Error GoTo ErrHandler              '← エラーが起きたら下へ飛ぶ
    Application.ScreenUpdating = False

    Set ws = ThisWorkbook.Worksheets("売上")
    ws.Unprotect
    ws.Range("A2:A100").ClearContents
    ws.Protect

CleanUp:
    Application.ScreenUpdating = True     '← 正常時もエラー時も必ず戻す
    Exit Sub

ErrHandler:
    MsgBox "エラー番号 " & Err.Number & vbCrLf & Err.Description, vbExclamation
    Resume CleanUp                        '← 後始末に合流してから終わる
End Sub

この形にしておくと、1004が出ても画面が固まったままにならず、エラーの内容もきちんと表示されます。エラー番号と説明が出るので、次の調査もぐっと楽になります。

「変数の型をきちんと宣言する」考え方は、数式でいえば「セルの表示形式を揃える」のと同じです。エクセル側で数値が文字列になっていて計算が合わない、というトラブルとも根っこは同じなので、あわせて読んでおくと理解が深まります。

【コピペで解決】エクセルで数値が「文字列」になって合計できない!直し方まとめ
数字を入れたのに合計できないのは「文字列」化が原因。緑の三角マークや区切り位置での一括変換、VALUE関数など、コピペで使える直し方を初心者にもやさしく解説します。

よくある質問(Q&A)

Q1. [デバッグ]を押したら、パスワードを聞かれました。

そのマクロはVBAプロジェクトにパスワード保護がかけられています。作成者以外は中身を見られない設定です。作成者に連絡して確認してください。無理にこじ開ける方法は、業務ファイルではトラブルの元になるのでおすすめしません。

Q2. 「実行時エラー ‘1004’」ではなく「’424′ オブジェクトが必要です」と出ました。

これは別のエラーですが、原因はよく似ています。424は変数にオブジェクトが入っていないときに出ます。よくあるのは Set の書き忘れです。

'❌ Set が無い
Dim ws As Worksheet
ws = ThisWorkbook.Worksheets("売上")

'✅ オブジェクトを入れるときは Set が必要
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("売上")

Q3. 「’9′ インデックスが有効範囲にありません」との違いは?

9番は「その番号・その名前のものが、コレクションの中に存在しない」ときのエラーです。Worksheets("存在しない名前")Worksheets(5)(シートが3枚しかない)で出ます。1004とは番号が違うだけで、やることは同じ——原因1の「シート名を全部表示」マクロで実在を確かめてください。

Q4. 自分のPCでは動くのに、同僚のPCでは1004になります。

次の3つを順に疑ってください。①ファイルの保存場所がコードに直書きされている(原因2のつまずき対策)、②同僚のエクセルのバージョンが古い.xls の行数上限=原因3のつまずき対策)、③同僚側で別のブックが手前にある状態で実行している(「二度と止まらないための書き方」の2番)。ほとんどがこの3つのどれかです。

Q5. そもそもマクロを実行しようとすると、黄色いバーが出て動きません。

それは1004ではなく、マクロが起動する前で止まっている状態です。手順が違うので、こちらの記事を先に読んでください。

【動かない人へ】エクセルのマクロが実行できない原因7つと直し方|有効化・ブロック解除・xlsm保存
エクセルのマクロが実行できない原因は、ほとんど3つ。黄色いバーの「コンテンツの有効化」、赤いバー「セキュリティ リスク」のブロック解除、.xlsmでの保存です。症状別の早見表から、開発タブ・ボタン無反応・トラストセンター設定まで、7つの原因を手順つきで直します。

次に読むと、もっと自動化が進みます

マクロで自動化したい作業の筆頭が「集計」です。そもそも合計が合わない状態のまま自動化すると、間違いが高速で量産されます。先に土台を固めておきましょう。

【コピペ確認付き】エクセルの合計が合わない・ずれる原因と直し方7選(SUM/行挿入/縦の足し算)
エクセルの合計が合わない・ずれる原因は「型」と「範囲」から疑うのが最短。ISNUMBERやCOUNTでの確認方法つきで、7つの原因と直し方をやさしく解説します。

「VBAはまだ早い」と感じるなら、まずは数式で自動化の感覚をつかむのが近道です。関数1つで仕事が変わる体験を、こちらで。

【コピペOK】エクセルで行挿入しても合計がずれない5つの方法|SUM範囲を自動で広げる設定
「行を追加したのに合計が増えない」を今日で終わりに。結論はテーブル化(Ctrl+T)です。テーブルが使えない場合の範囲指定・列全体・SUBTOTAL・OFFSETまで、コピペできる数式つきで5つの方法を解説します。

まとめ:1004は「モノが見つからない」の合図。あなたのミスではありません

今日の要点を、もう一度短く整理します。

  • エラーが出たら、まず[デバッグ]→ 黄色い行を見る。原因はそこから数行以内にある。
  • 原因1:シート名の打ち間違い(余分なスペース・全半角)。「シート名を全部表示」マクロで実物を確認する。
  • 原因2:閉じているブックはさわれない。Workbooks.Open で開いてから読む。
  • 原因3Range("A1:A0") のような空の範囲。If lastRow < 2 Then Exit Sub を足す。
  • 原因4Select / Activate は消す。「選んでから」ではなく「直接書く」。
  • 原因5:保護は「解除 → 処理 → 保護し直す」の3点セットで。
  • 原因6:貼り付け先は左上の1セルだけを指定する。値だけなら .Value = .Value が最速。
  • 原因7:結合セル・フィルターを先に解除してから範囲を操作する。
  • 予防策は3つ。Option ExplicitThisWorkbook.Worksheets で明示/On Error GoTo で後始末。

「実行時エラー 1004」という文字列は、たしかに冷たく見えます。でも中身を訳すと、「あなたが言った”それ”が、私には見つかりませんでした」という、ただの報告です。怒られているわけでも、あなたにセンスが無いわけでもありません。エクセルが「どこを探せばいいか分からない」と困っているだけです。

そして今日、あなたはその”どこ”を特定する方法を手に入れました。[デバッグ]を押して黄色い行を見る。この動作ができる人は、職場でもそう多くありません。明日、隣の席で誰かが1004で固まっていたら、そっと「デバッグ、押してみてください」と言ってあげてください。それだけで、あなたは「VBAが分かる人」になります。

40代からのリスキリングは、全部を覚え直すことではありません。詰まったときに、詰まった場所を自分で見つけられるようになることです。その力は、一度身につけば一生使えます。今日がその1日目です。

出典(一次情報)

※ エラーの表示文言やメニュー名は、お使いのエクセルのバージョン・更新チャネル・言語設定によって異なる場合があります。ご自身の画面の表示に合わせて読み替えてください。

タイトルとURLをコピーしました