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

【止まらない】VBA「実行時エラー438」の原因7つと直し方|オブジェクトはこのプロパティまたはメソッドをサポートしていません

EXCEL VBA講座
スポンサーリンク

「さっきまで動いていたマクロが、急に『実行時エラー ‘438’: オブジェクトはこのプロパティまたはメソッドをサポートしていません』で止まった」
「コードは1文字も変えていないのに、今日だけ動かない」

画面を見ても、どこが悪いのか見当がつかない。文法チェックは通っているのに、実行した瞬間だけ弾かれる――このエラーは、そんな”理不尽さ”が特徴です。

でも安心してください。エラー438は「あなたが指している”モノ”に、その機能が備わっていない」ことをVBAが正直に教えてくれているだけです。原因はほぼ次の7つに絞れます。①プロパティ・メソッド名のスペルミス/存在しないメンバーの呼び出し ②変数の型が本来のオブジェクトと違う ③Excelのバージョン差で使えない機能を呼んでいる ④SelectionやActiveCellの中身が想定と違う ⑤Withブロックの参照先がズレている ⑥参照設定(外部ライブラリ)が不足・破損している ⑦Word/Access向けのコードをそのままExcelに使っている。

この記事では、[デバッグ]を押して黄色い行を見るところから始め、原因を1つずつ、コピペで試せるコード付きで潰していきます。似た番号のエラー(91・9)との違いもQ&Aで整理するので、混同して遠回りする心配はありません。

VBAの実行時エラー438に向き合いながら原因を整理するExcel講師
スポンサーリンク
  1. まず[デバッグ]を押して「黄色い行」を見る(症状別 早見表)
  2. そもそも「実行時エラー438」とは何が起きているのか
  3. 原因1:プロパティ・メソッド名のスペルミス/存在しないメンバーを呼んでいる(最多)
    1. VBEの「自動メンバー表示」を信じる
    2. コピペで確認:オブジェクトが持つ機能を一覧で見る
  4. 原因2:変数の型が「本来のオブジェクト」と違う(Object型に頼りすぎ)
  5. 原因3:Excelのバージョン差・環境差で使えない機能を呼んでいる
  6. 原因4:Selection・ActiveCellなど「今何が選択されているか」が想定と違う
    1. 安全策:処理の前に型チェックを入れる
  7. 原因5:Withブロックの中で「.」の参照先がズレている
  8. 原因6:参照設定(外部ライブラリ)が不足している、または破損している
  9. 原因7:Word・Access向けのコードをそのままExcelに使っている
  10. 原因の切り分けに使う共通テクニック:TypeNameとイミディエイトウィンドウ
  11. よくある質問(Q&A)
    1. Q. エラー91・エラー9・エラー438の違いを一言で教えてください
    2. Q. マクロの記録機能で作ったコードなのに438が出ます
    3. Q. 他の人が作ったファイルを開いた瞬間に438が出ます
    4. Q. コピペしたのに動きません。何が違うのでしょうか
  12. まとめ:438は「相性の悪さ」を教えてくれているだけ
  13. 出典(一次情報)

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

エラーが出たら、迷わず[デバッグ]を押してください。止まった行が黄色く反転します。その行に何が書いてあるかで、疑うべき原因はほぼ決まります。

黄色い行によくあるパターン いちばん疑うべき原因 該当箇所
.Value2 や見慣れないプロパティ名の行 プロパティ・メソッド名のスペルミス/存在しないメンバー 原因1
Dim obj As Object で宣言した変数を使う行 変数の型が本来のオブジェクトと違う 原因2
他の人のPCや会社PCでだけ落ちる Excelのバージョン差・環境差 原因3
Selection.Rows / ActiveCell.○○ の行 今選択されているものが想定と違う 原因4
With ブロックの中の . で始まる行 Withの参照先がズレている 原因5
起動直後、または他PCに配って即エラー 参照設定(外部ライブラリ)の不足・破損 原因6
ネットや生成AIから拾ったコードの行 Word/Access等の別アプリ向けコード 原因7

そもそも「実行時エラー438」とは何が起きているのか

VBAの公式なエラー文言は「オブジェクトはこのプロパティまたはメソッドをサポートしていません」です。難しく聞こえますが、言っていることは1つだけです。

「あなたが今指しているモノに、その機能(プロパティ・メソッド)は付いていません」

たとえば、車に「翼を広げて」と命令するようなものです。コード自体の文法は正しくても、命令する相手(オブジェクト)が、その命令に対応していないため弾かれます。文法エラーではなく、”組み合わせ”の間違いだという点が重要です。

似た番号のエラーと混同しやすいので、先に整理しておきます。実行時エラー91(オブジェクト変数またはWithブロック変数が設定されていません)は「箱(変数)の中身が空っぽ」の話、実行時エラー9(インデックスが有効範囲にありません)は「指定した名前・番号のモノが存在しない」の話でした。それに対してエラー438は「モノは存在する。中身も入っている。でも、その機能だけが無い」という、もう一段こまかい話です。

【止まらない】VBA「実行時エラー91」の原因7つと直し方|オブジェクト変数またはWithブロック変数が設定されていません
VBAで『実行時エラー91:オブジェクト変数またはWithブロック変数が設定されていません』が出て止まる原因を7つに整理。Set忘れ・Find・Withブロックなど、コピペで直せる修正コードつきで解説します。
【もう止まらない】VBA「実行時エラー9」の原因7つと直し方|インデックスが有効範囲にありません
VBAの「実行時エラー9:インデックスが有効範囲にありません」を、シート名・ブック名・配列・Split・コレクションの7原因に分けて解説。コピペで使える存在チェック関数つきで、今日中に直せます。

原因1:プロパティ・メソッド名のスペルミス/存在しないメンバーを呼んでいる(最多)

いちばん多いのが、単純な書き間違いです。.Value のつもりが .Vaule になっていた、他のオブジェクト用のプロパティを書いてしまった、というケースです。

VBEの「自動メンバー表示」を信じる

VBE(VBAエディタ)で .(ピリオド)を打った瞬間に出てくる候補リストは、そのオブジェクトが実際に持っている機能の一覧です。手打ちせず、候補から選ぶだけでスペルミスはほぼ消えます。候補が出ない・少ない場合は、変数の型そのものが疑わしいサインです(原因2へ)。

コピペで確認:オブジェクトが持つ機能を一覧で見る

候補リストを見逃した、または後から確認したい場合は、イミディエイトウィンドウで実際に触ってみましょう。

Sub セルの型を確認する()
    Dim tgt As Range
    Set tgt = ActiveCell
    Debug.Print TypeName(tgt)   ' → "Range" と出るはず
End Sub

Ctrl + G でイミディエイトウィンドウを開いてから実行してください。TypeName は「今その変数が本当は何者なのか」を教えてくれる、原因調査の最重要関数です。この後の原因でも繰り返し使います。

原因2:変数の型が「本来のオブジェクト」と違う(Object型に頼りすぎ)

意外と見落とされがちなのがこれです。Dim obj As Object のように何でも受け取れる型で変数を宣言していると、コンパイル時にはエラーが出ず、実行して初めて「そのプロパティは無い」と弾かれます。

' ❌ 実行するまで型が確定しない書き方
Sub 危険な例()
    Dim obj As Object
    Set obj = Sheets("集計").Range("A1")
    obj.Formula2 = "=SUM(B:B)"   ' Excelのバージョンによっては438
End Sub

' ✅ 型を具体的に書けば、入力候補も出るし早期に気づける
Sub 安全な例()
    Dim rng As Range
    Set rng = Sheets("集計").Range("A1")
    rng.Formula = "=SUM(B:B)"
End Sub

As Object は便利ですが、「何でも入るが、何が入っているかVBE自身も分からない」諸刃の剣です。可能な限り RangeWorksheetWorkbook など具体的な型で宣言する習慣に変えるだけで、この種のエラーはかなり減ります。

TypeName関数で変数の正体をイミディエイトウィンドウで確認するExcel講師

原因3:Excelのバージョン差・環境差で使えない機能を呼んでいる

「自分のPCでは動くのに、上司や取引先のPCでだけ438になる」というときは、使っているプロパティやメソッドが相手のExcelバージョンに存在しない可能性が高いです。たとえば動的配列数式向けの新しいプロパティは、古いバージョンのExcelには存在しません。

  • 切り分け方:エラーが出るPCと出ないPCで、[ファイル]→[アカウント]→[Excelのバージョン情報]を見比べる。
  • 対処:新しめのプロパティ・メソッドを使う処理は、古い書き方(互換性の高い書き方)に置き換える。
  • 予防:社内で配布するマクロは、いちばん古いExcelを使っている人の環境でも1回テストする。

原因4:Selection・ActiveCellなど「今何が選択されているか」が想定と違う

SelectionActiveCell は、実行した瞬間に何が選ばれているかで中身の種類が変わる厄介なオブジェクトです。セルを選んでいれば Range ですが、図形やグラフを選んでいれば全く別物になり、Range 用のプロパティを呼ぶと438で止まります。

Sub 選択中の種類を確認する()
    Debug.Print TypeName(Selection)
    ' セル選択中なら "Range"
    ' 図形選択中なら "DrawingObjects" や "Shape" など
End Sub

安全策:処理の前に型チェックを入れる

Sub 安全にセル操作する()
    If TypeName(Selection) <> "Range" Then
        MsgBox "セルを選択してから実行してください。", vbExclamation
        Exit Sub
    End If

    Selection.Interior.Color = RGB(255, 255, 0)
End Sub

マクロをボタンから実行する運用にしている場合、「押す前に何を選んでいたか」はユーザー任せになります。上のような型チェックを先頭に1行入れておくだけで、突然の438を未然に防げます。

原因5:Withブロックの中で「.」の参照先がズレている

With でまとめて書いている途中に、別のWithが割り込んでいたり、インデントが崩れて自分がどのオブジェクトの中にいるか見失うケースです。特にネスト(入れ子)が深いコードで起きがちです。

' ❌ ネストが深く、内側の . がどこを指すか分かりにくい
With Sheets("集計")
    With .Range("A1")
        .Value = 1
        .Font.Bold = True
        With .Font
            .Color = RGB(255, 0, 0)
            .Sixe = 12   ' ← スペルミス(Size)にも気づきにくい
        End With
    End With
End With

対処はシンプルです。ネストを1〜2段までに抑え、深くなりそうなら変数に受けてから使うようにしてください。

' ✅ 変数に受ければ、参照先を見失わない
Dim ws As Worksheet, c As Range
Set ws = Sheets("集計")
Set c = ws.Range("A1")

c.Value = 1
c.Font.Bold = True
c.Font.Color = RGB(255, 0, 0)
c.Font.Size = 12

変数名がはっきりしていれば、VBEの入力候補も正しく効くので、スペルミスにもその場で気づけます。

原因6:参照設定(外部ライブラリ)が不足している、または破損している

他のPCから受け取ったファイルや、久しぶりに開いたファイルで急に438が出た場合は、[ツール]→[参照設定]の中で「見つかりません」となっている項目がないかを確認してください。

  1. VBE(Alt+F11)を開く
  2. メニュー[ツール]→[参照設定]
  3. 一覧の先頭に「MISSING:」と付いた項目がないか確認する
  4. あれば、そのチェックを外し、代わりに同じ機能を持つ別バージョンのライブラリにチェックを入れる

参照設定が壊れていると、そのライブラリに属するオブジェクトのプロパティ・メソッドが軒並み「サポートしていません」扱いになり、一見無関係に見える行でも438が連発することがあります。心当たりがあれば真っ先に疑ってください。

参照設定ダイアログでMISSING項目を確認するExcel講師

原因7:Word・Access向けのコードをそのままExcelに使っている

ネット記事や生成AIから拾ったコードをそのまま貼り付けたら438になった、というケースも増えています。Word・Access・PowerPointにはあってもExcelには無いプロパティ・メソッドは珍しくありません。「VBA コード集」として一括りに紹介されている情報の中に、アプリを問わず同じように動くと誤解されやすい落とし穴があります。

対処は、コピペしたコードの先頭のオブジェクト(何に対して命令しているか)を確認し、ExcelのRangeWorksheetWorkbookのいずれかに置き換えられるかを1行ずつ見直すことです。急いでいるときほど、この確認を飛ばしがちなので注意してください。

ファイル自体が保存できない・開けないといった別トラブルと合わせて起きている場合は、こちらもご確認ください。

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

原因の切り分けに使う共通テクニック:TypeNameとイミディエイトウィンドウ

ここまでの7原因に共通する、いちばん効く調査方法をまとめておきます。

  • 止まった行の1つ手前に Debug.Print TypeName(変数名) を1行だけ挿入して実行し、イミディエイトウィンドウ(Ctrl+G)で正体を確認する。
  • 正体が想定と違っていたら、原因2・4・7のどれかである可能性が高い。
  • 正体は合っているのにエラーになるなら、原因1(スペルミス)・原因3(バージョン差)・原因6(参照設定)を疑う。

「何が起きているか分からない」ときほど、推測せずに機械に聞くのが結局いちばん早い近道です。

よくある質問(Q&A)

Q. エラー91・エラー9・エラー438の違いを一言で教えてください

91=箱(変数)が空っぽ(Setし忘れ)。9=指定した名前・番号のモノが存在しない(シート名違いなど)。438=モノは存在し中身もあるが、その機能だけが無い(型違い・命令違い)。似ていますが、疑うべき場所がそれぞれ違います。

Q. マクロの記録機能で作ったコードなのに438が出ます

記録直後は動いても、後から選択範囲やシート構成を変えたことで、Selectionの中身が記録時と変わっているケースが多いです。原因4の型チェックを先頭に入れて確認してください。

Q. 他の人が作ったファイルを開いた瞬間に438が出ます

ファイルを開いた直後の自動実行マクロ(Workbook_Openなど)で起きているなら、まず原因6の参照設定を確認してください。「MISSING:」表示は、環境差によるエラーの典型サインです。

Q. コピペしたのに動きません。何が違うのでしょうか

コピー元の環境(バージョン・言語設定・別アプリ)と、あなたの環境が完全には一致していない可能性があります。原因3・原因7を順に確認し、それでも分からなければ、行を1つずつDebug.Print TypeName(...)で確かめるのが結局いちばん確実です。

まとめ:438は「相性の悪さ」を教えてくれているだけ

もう一度、確認の順番だけおさらいします。

  1. まず:[デバッグ]で止まった行を確認し、何のオブジェクトに命令しているかを見る
  2. 原因1:VBEの入力候補でスペルミス・存在しないメンバーを疑う
  3. 原因2As Object をやめ、具体的な型で宣言し直す
  4. 原因3:エラーが出るPCと出ないPCでExcelのバージョンを見比べる
  5. 原因4SelectionActiveCellの中身をTypeNameで確認する
  6. 原因5:深いWithのネストをやめ、変数に受けて使う
  7. 原因6:参照設定に「MISSING:」がないか確認する
  8. 原因7:他アプリ向けコードをそのまま使っていないか見直す

エラー438は、いかにも難解な名前をしていますが、正体は「その組み合わせでは無理です」という、VBAからの正直な合図にすぎません。1つずつ潰していけば、必ずどこかで解決します。

マクロが思いどおりに動いた瞬間は、何度経験しても嬉しいものです。今日エラーと向き合ったあなたは、その分だけ確実にVBAへの理解を積み上げています。焦らず、1行ずつ。それがいちばんの近道です。

エラー番号ごとの止まり方に慣れてきたら、次はマクロ全体をもっと安定して動かすコツもあわせてどうぞ。

VBA「実行時エラー 1004」の原因7つと直し方|アプリケーション定義またはオブジェクト定義のエラー
VBAの「実行時エラー 1004(アプリケーション定義またはオブジェクト定義のエラー)」は、[デバッグ]で黄色く光る行を見れば原因が特定できます。シート名の指定ミス、閉じたブック、Range範囲、Select、保護、PasteSpecial、結合セルの7原因を、❌ダメな書き方→✅直した書き方のコピペ可VBAコード付きで解説します。
【コピペOK】エクセルで行挿入しても合計がずれない5つの方法|SUM範囲を自動で広げる設定
「行を追加したのに合計が増えない」を今日で終わりに。結論はテーブル化(Ctrl+T)です。テーブルが使えない場合の範囲指定・列全体・SUBTOTAL・OFFSETまで、コピペできる数式つきで5つの方法を解説します。

出典(一次情報)

コメント

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