|
▼YU-TANG さん:
ありがとうございます
自宅環境は
アクセスエクセル2007
vista home
>変数の有効期間を理解されていないのが原因ではないでしょうか。
あやふやな理解のままでした
-----------------------------------------------
変数の有効期間の概要
クラス モジュールでは、クラスのインスタンスが存在する限り、
値を保持します。モジュール レベルの変数は、値がリセットされるまで
メモリ リソースを消費するので、必要な場合のみ使用することを
お勧めします。
-----------------------------------------------
なんてありました
>プロシージャ内で宣言された変数の寿命はそのプロシージャの実行中だけ
>ですから、提示されたコードの objClass1 は一瞬で解放されてしまいます。
>これが原因です。
クラスモジュールのデバッグ方法に自信が無かったのですが
ツール/オプション/全般/エラートラップ/クラスモジュールで中断
にチェックしたので、デバッグは問題ないと思います
ステップ実行してみると
Class_Initialize の End Sub が終了すると
Class_Terminateが実行されてイベントが終了してしまいます
>対策として、たとえば objClass1 をモジュールレベルで宣言するように
>してはいかがでしょうか。
Private WithEvents xlsApp As Excel.Application
Public bokWork As Excel.Workbook
Public shtSheet As Excel.Worksheet
を標準のジュールに移動してみたのですが
Private WithEvents xlsApp As Excel.Application
は
コンパイル エラー:
オブジェクト モジュールでのみ有効です。
となってしまいます
結果的には
Public bokWork As Excel.Workbook
Public shtSheet As Excel.Worksheet
を標準モジュールに
Private WithEvents xlsApp As Excel.Application
は、クラスモジュールのままとなってしまいました
結果的に修正コードは
クラスモジュール
Option Compare Database
Option Explicit
Private WithEvents xlsApp As Excel.Application
'Private bokWork As Excel.Workbook
'Private shtSheet As Excel.Worksheet
'Private WithEvents bokWork As Excel.Workbook
'Private WithEvents shtSheet As Excel.Worksheet
Private Sub Class_Initialize()
'Public Sub Class_Initialize()
Set xlsApp = CreateObject("Excel.Application")
Set bokWork = xlsApp.Workbooks.Open("\\sv_hoge\fuga.xls")
xlsApp.Visible = True
Set shtSheet = bokWork.Worksheets(1)
bokWork.Activate
shtSheet.Activate
End Sub
Private Sub xlsApp_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name
'MsgBox shtSheet.Name
End Sub
Private Sub xlsApp_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
MsgBox Sh.Name
'MsgBox shtSheet.Name
End Sub
Private Sub xlsApp_WorkbookOpen(ByVal Wb As Excel.Workbook)
MsgBox Wb.Name
'MsgBox bokWork.Name
End Sub
標準モジュール
Option Compare Database
Option Explicit
'Private WithEvents xlsApp As Excel.Application
Public bokWork As Excel.Workbook
Public shtSheet As Excel.Worksheet
Sub TG_BK_open()
Dim objClass1 As Object
Set objClass1 = New Class1
End Sub
として TG_BK_open では エラーは出ませんがやはり
ブックの操作イベントは取得できませんでした
原因は
>Private WithEvents xlsApp As Excel.Application
>は、クラスモジュールのままとなってしまいました
にあると思うのですが
>対策として、たとえば objClass1 をモジュールレベルで宣言するように
>してはいかがでしょうか。
とするためには
どのような記述をすればよいのでしょうか
また
bokWork.Name
shtSheet.Name
のような取得がうまく出来ません
これはどのように記述すればよいのでしょうか
よろしくお願いいたします
>もっとも「kb408871」で検索すると出てくるような話もあるので、
>いかなる状況でも保証できるものではありませんが。
----------------------------------------------------
[VBA] Public 宣言された変数の有効期間
tp://support.microsoft.com/kb/408871/ja
ほとんどの場合、プロシージャ終了後も値は保持されますが、意図しないタイミングで保持されていた Public 変数の値が破棄され、使えていた変数の値が突然使えなくなる場合があります。そのため、Public 変数がアプリケーション終了時まで有効であることを期待する VBA マクロの実装は、推奨されません
----------------------------------------------------
なるほどです
勉強になりました ありがとうございました
あわせて、上記に遭遇しないようなアプローチの方法等ありましたら
紹介頂けると嬉しいです
よろしくお願いいたします
|
|