Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1734 / 9994 ←次へ | 前へ→

【11551】Re:エクセルのイベント取得
質問  pon  - 10/3/28(日) 15:05 -

引用なし
パスワード
   ▼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 マクロの実装は、推奨されません
----------------------------------------------------
なるほどです
勉強になりました ありがとうございました

あわせて、上記に遭遇しないようなアプローチの方法等ありましたら
紹介頂けると嬉しいです
よろしくお願いいたします

950 hits

【11549】エクセルのイベント取得 pon 10/3/26(金) 18:20 質問[未読]
【11550】Re:エクセルのイベント取得 YU-TANG 10/3/27(土) 12:18 回答[未読]
【11551】Re:エクセルのイベント取得 pon 10/3/28(日) 15:05 質問[未読]
【11552】Re:エクセルのイベント取得 YU-TANG 10/3/28(日) 15:42 質問[未読]
【11553】Re:エクセルのイベント取得 pon 10/3/28(日) 18:16 質問[未読]
【11554】Re:エクセルのイベント取得 YU-TANG 10/3/29(月) 8:16 回答[未読]
【11555】Re:エクセルのイベント取得 pon 10/3/29(月) 12:44 お礼[未読]

1734 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078193
(SS)C-BOARD v3.8 is Free