プロが教える店舗&オフィスのセキュリティ対策術

他人が作ったExcel VBAの動作を確認していたところ、型が一致しません。のエラーとなりました。
一般的には数値型変数に文字列をいれようとするなどで発生しますが、
今回はサブプロシージャの「end sub」のところで発生しているようです。
なぜこのようなことが発生するのか、または、どのような観点でデバッグすればよいのか、
ご教授頂きたくお願いいたします。

質問者からの補足コメント

  • 早々のご回答を頂きありがとうございます。
    今回、型が一致しませんとエラーになるプロシージャは、ファイルシステムオブジェクトを空(Nothing)にしているだけなんです。したがってWithやIfは使用しておりません。
    他に考えられることはありますでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/07/28 08:23
  • 詳細な注意点を列挙していただきありがとうございます。
    今回のコードは、
    Private Sub_Class_Terminate()
    Set m_ObjFS = Nothing
    End Sub
    の3行のみで、ファイルオブジェクトを空にしています。
    Option Explicitは定義しています。
    VBAプロジェクトコンパイルは行っていなかったので、実行しましたが、特にメッセージなどは表示されず、2回目以降はグレーアウトされていて、再度コンパイルはできないようです。
    F8キーを押しながらエラー発生個所を確認したのですが、やはり上記3行のコードの、End Subでエラーとなっています。
    取り留めもない状況報告となってしまいましたが、何か他にヒントはありますでしょうか。
    大変お手数ですが、何かありましたらよろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/07/28 08:52
  • うれしい

    ご指摘の通り、SubとClassの間は「_」ではなく、空白となっていました。私のソースの転記ミスです。
    本件ですが、その後デバッグしてゆくと、そもそもm_ObjFSオブジェクトが正常に生成されていないようであることが判明しました。その部分を修正し、m_ObjFSオブジェクトが生成された状態で実行すると、エラーは解消されました。(私はVBA初心者なのでその辺の確認を怠っていました。)
    いろいろとご丁寧にアドバイス頂き、ありがとうございました。

    No.6の回答に寄せられた補足コメントです。 補足日時:2022/07/28 19:46
  • へこむわー

    すみません。Subの後ろは「_」ではなく、空白でした。私のソースの転記ミスでした。

    No.5の回答に寄せられた補足コメントです。 補足日時:2022/07/28 19:49
  • へこむわー

    すみません。ほかの方にも補足したのですが、SubとClassの間は、「_」ではなく、空白でした。私のソースの転記ミスでした。

    No.4の回答に寄せられた補足コメントです。 補足日時:2022/07/28 19:51
  • ご指摘の通り、オブジェクトを空にしているだけなので、なくても問題なさそうですね。
    まずはそれで試してみます。

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/07/28 19:56

A 回答 (6件)

#2です


詳細ありがとうございます・・
コードは Terminate イベントなのですね
構文は Private Sub object_Terminate( ) です
なので Sub_Classの間の_を半角スペースにしてください。

クラスモジュールで
(General)でClassを選択し(Declarations)でTerminateを選択すれば
イベントプロシージャが作成されます

'クラス
Private Sub Class_Terminate()
Set m_ObjFS = Nothing
End Sub

ここだけは良く分かりませんでした・・コンパイル出来る???
Private Sub_Class_Terminate()はプロシージャとして成立していません
ので
Setは出来ないはずなのでコンパイル出来ないかと思いますね
・・(プロシージャ外では無効)
又は
Privateは属性が違うためコンパイルできないかと・・・
ただ私は素人なので知らないパターンかも知れません。
この回答への補足あり
    • good
    • 1

ああ、なるほど。


目が弱いので全然気がつきませんでした。
確かにSubの後に余計な文字がありますね。
この回答への補足あり
    • good
    • 1

これが原因ですね。

subプロシージャがPrivate変数になっちゃってるんですね
Sub_Class_Terminate→Sub Class_Terminate
この回答への補足あり
    • good
    • 0

クラスモジュール内ですか。



通常、この内容でエラーになることはありませんし、コンパイルが通っているなら実行時エラーということですよね、、、

作法としては望ましいのですけど、この内容であれば無くても問題ありませんから、デストラクタ( Class_Terminate プロシージャ) 自体を全削除してみては?

または、デストラクタの End Sub の直前に stop を入れてブレイクしてみたらどうなりますか?
この回答への補足あり
    • good
    • 2

こんばんは


>他人が作ったExcel VBAの動作を確認していたところ
>どのような観点でデバッグすればよいのか、

VBEのオプションの編集>>コードの設定のチェックボックスをフルチェックします
Option Explicit を必ず 各モジュール上部に宣言します(フルチェックしてあれば追加されていると思います)

変数は出来るだけ型宣言を加えます

デバッグタグのVBAプロジェクトコンパイルを初めに必ず行います

コンパイルは他のモジュールでも実施されるのでエラーが返る部分を修正してください

ステップ実行(F8キー)で実行し各変数、値などを確認していきます
必要に応じてローカルウィンドウやイミディエイトウィンドウ、ウオッチウィンドウなどを使うと良いと思います

エラー13 型が一致しませんは実行時エラーと存じます
コンパイルを実施していないのだと思われますが

>今回はサブプロシージャの「end sub」のところで発生しているようです

通常 end subでデバッグする事は無いと思われますが、
Exit Sub とかの間違えでは無いでしょうか?
更に
そのサブプロシージャはFunctionプロシージャだったりしませんか?
Functionだった場合は End Function名での間に記されるプロシージャを抜けるコードは Exit Function です (これは上記end subも同様にexitです)
ただ、13エラーが返る場合はendもしくは subが変数として認識されている可能性がありますので
Option Explicit を追加する事で原因が早く分かると思います

実コードが示されていないので、実際とは異なるかも知れません
この回答への補足あり
    • good
    • 1

こんにちは。



End With、End If などの閉じ忘れはありませんか?
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています