2016-05-20 6 views
1

システム:Excel 2013; Windows 7 Pro x64Excel VBA - ワークシートのパブリックメンバーが利用できません

vbaコードのワークシートのパブリックメンバーにアクセスする際に奇妙な問題が発生しています。

ここに複製する最小限のコードを示します。

シート1(一般)VBAコード

Public memberVar As Integer 

MyModuleというのVBAコードが

Sub MySub() 
    MySub2 Sheet1 
End Sub 

Sub MySub2(sht As Worksheet) 
    Dim foo As Integer 
    foo = 1 
    sht.memberVar = foo 
End Sub 

私がイミディエイトウィンドウからMySubを実行すると、私は次のエラーを取得する: 「コンパイルエラー:メソッドまたはデータメンバーが見つかりません "MySub2の3行目、参照先sht.memberVar

私が奇妙な部分は、sht.memberVar = fooという行をコメントアウトし、ブレークポイントをfoo = 1に設定し、ローカルウィンドウでshtを検査すると、実際にはmemberVarがオブジェクトのメンバーとしてリストされているということです。

だから何ですか?私はこれについて間違っていますか?宣言をMySub2(sht As Object)に変更すると、エラーは発生しませんが、これはハックのように思えます。なぜなら、オブジェクトがどのような型であるべきかを私はすでに知っているからです。

答えて

1

shtは、「一般的で非特定の」ワークシートとタイプされています。ただし、Sheet1は「特別な」ワークシートで、memberVarというプロパティがあります。 shtSheet1で実行されるという事実は、実行時、すなわち動的にのみ分かる。あなたは最高のように定義された、周りの他のサブがあったと仮定することによって、これを可視化することができます:

Sub UglySub() 
    MySub2 Sheet2 
End Sub 

をコードを起動すると、あなたはVBAスクリプトをコンパイルしている - そしてそこにあなたはプロパティがあったことを主張しmemberVar 「一般的で非特異的な」ワークシート - これは真実ではありません。したがって、コードをコンパイル/開始するときのエラーメッセージ。

代入をコメントアウトし、タイプをObjectに変更すると(ワークシートは同じように良いとは言えませんが)、静的なデザインタイムからランタイムに渡ります。コンパイラが終了し、実行時の状況が観察されます。

IIRCでは、ワークシートは変数のグローバル識別子ではなく、型の位置でも使用できます。したがって

Sub MySub2(sht As Sheet1) 
    Dim foo As Integer 
    foo = 1 
    sht.memberVar = foo 
End Sub 

は、すでにコンパイラの口を閉めておくのに十分であるかもしれません。

+0

ああ、面白いです。タイプとして特定のワークシートを使用するこのトリックは実際には機能します。ありがとう! – wgrant

関連する問題