|
▼YU-TANG さん:
ありがとうございます
>すみませんが、意味がまったく分かりません。
>objClass1 という宣言をモジュールレベルに移動することをお勧めした
>ことと、この xlsApp 等の宣言を標準モジュールに移動されたこととの
>関連はいったい何でしょうか?
クラスモジュールの理解が足りないのと
頭が固くてみたいなでした
再度の書き込みを頂いて
標準モジュールの宣言を
Option Compare Database
Option Explicit
'Private WithEvents xlsApp As Excel.Application
'Public bokWork As Excel.Workbook
'Public shtSheet As Excel.Worksheet
Dim objClass1 As Object
として、希望の操作がかないました
うう うれぴー ♪
ありがとうございました
下記動作確認してみました
Private Sub xlsApp_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
MsgBox Sh.Name
MsgBox Target.Address
End Sub
Private Sub xlsApp_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean)
MsgBox Wb.Name
Set shtSheet = Nothing
Set bokWork = Nothing
Set xlsApp = Nothing
End Sub
Private Sub xlsApp_WorkbookBeforeSave(ByVal Wb As Excel.Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox Wb.Name
MsgBox Wb.ActiveSheet.Name
End Sub
動作的には
CreateObjectしているので
別途エクセルが先行して開いていても問題は無いと考えています
また
xlsApp_WorkbookBeforeClose
で
Set shtSheet = Nothing
Set bokWork = Nothing
Set xlsApp = Nothing
しているので、エクセルのお化けも残らないようです
ブックの×ボタンで閉じられても大丈夫でした
Q1)
以上確認してみたのですが
他に確認すべき事項とか注意事項ありますでしょうか
アドバイスありましたらよろしくお願いいたします
Q2)
あと
ブックが閉じられる前なら上記のようにちゃんとイベントは取得できているのですが
ローカルウインドウには何も表示されていません
この状態で(ブックが開いている状態で)
イミディエイトウインドウで開いているブック名とか
取得したいと ?Class1.xlsApp.Wb.Name してみましたが
実行時エラー '424':
オブジェクトが必要です。
となってしまいます
この辺がクラスの使い方の肝のような気もしていますがよくわかりません
イミディエイトウインドウから開いているワークブック名を取得する
ことは出来ますでしょうか?
>> あわせて、上記に遭遇しないようなアプローチの方法等ありましたら
>> 紹介頂けると嬉しいです
>その KB に書いてありますが、
特に、記述先等は無いのですが
どこかのQAでみかけた、変数の値は保証されるものではない
が頭にあって
別途アプローチもあるのかなと思った次第でした
>これらの行為を (実行中には) しない、ということです。
>また実行時エラーはすべてトラップします。トラップし忘れた実行時エラー
>によって、変数が破棄されるケースが (経験則的に) あります。
詳細な解説ありがとうございました
完成後の状態であればこのような状況に遭遇しないと思います
ちょっと感激したのは
開くブックにはコードは無いので
開く時にマクロを有効にする を出さないで
ブックのイベントが取得できたことです
当然といえば当然のような気もしますが・・・・・
Q1、Q2
他コメントあれば、アドバイスよろしくお願いいたします
|
|