Excel VBA質問箱 IV

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

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


3304 / 13645 ツリー ←次へ | 前へ→

【62991】ワークブック、ワークシートが変わったときのイベント mixia 09/9/30(水) 0:25 質問[未読]
【62993】Re:ワークブック、ワークシートが変わった... Jaka 09/9/30(水) 9:18 発言[未読]
【62995】Re:ワークブック、ワークシートが変わった... Jaka 09/9/30(水) 9:57 発言[未読]
【62994】Re:ワークブック、ワークシートが変わった... kanabun 09/9/30(水) 9:47 発言[未読]
【63014】Re:ワークブック、ワークシートが変わった... mixia 09/9/30(水) 22:49 お礼[未読]
【63003】Re:ワークブック、ワークシートが変わった... neptune 09/9/30(水) 16:11 発言[未読]
【63016】Re:ワークブック、ワークシートが変わった... mixia 09/9/30(水) 23:07 お礼[未読]

【62991】ワークブック、ワークシートが変わったと...
質問  mixia  - 09/9/30(水) 0:25 -

引用なし
パスワード
   はじめまして、色々と調べてみたのですが、解決策がわからない問題がありご教授願いたいと思います。

現在、アドインとしてコンボボックスが1つあるユーザーフォームを作成しています。
このユーザーフォームが起動したときアクティブなシートのZoomの値をコンボボックスに表示し、このコンボボックスの値を変更するとアクティブなシートのZoomを変更するといったオリジナルのズームを作成しています。
ここで教えていただきたいのですが、開いているシートから別のシートがアクティブになったときにこのコンボボックスの値を変更したいと思っているのですが、VBAが記述されているワークブックではないワークブック(シート)からさらに別のワークブック(シート)が選択されたといったことを取得することは可能でしょうか?

可能であれば、そのイベントの取得法も教えていただければと思います。
ちなみに環境は、Excel2000です。

よろしくお願いします。

【62993】Re:ワークブック、ワークシートが変わっ...
発言  Jaka  - 09/9/30(水) 9:18 -

引用なし
パスワード
   thisworkbookの
アクティベイトとかデアクティベイトとか。

【62994】Re:ワークブック、ワークシートが変わっ...
発言  kanabun  - 09/9/30(水) 9:47 -

引用なし
パスワード
   ▼mixia さん:

> VBAが記述されているワークブックではないワークブック(シート)
> からさらに別のワークブック(シート)が選択されたといったこと
> を取得することは可能でしょうか?

いわゆるアプリケーションレベルのイベントのことですよね?
これはExcel.Applicationクラスにあります。

そのUserForm で
ひとつExcel.Applicationのインスタンスを「イベント付きで」作成
して、テストしてみてください。

'------------------------------- UserForm モジュール
Option Explicit

Private WithEvents XLApp As Excel.Application

↑UserForm モジュールの宣言セクションに上のように宣言すると、
コードウィンドウの上部の左のドロップダウンリストに
--------------▼
 (General)
 ComboBox1
 Userform1
 XLApp   <--- これが追加される
--------------
いま宣言したXLAppクラスが 他のコントロールにならんで追加されたこと
が確認できます。

で、これを使うためにはまず
UserFormの初期化イベントプロシージャに、
XLAppクラスを実行可能なオブジェクトにする(インスタンスを作成する)
設定をしておきます。↓
Private Sub UserForm_Initialize()
  Set XLApp = Excel.Application
End Sub

また、UserFormが閉じるとき、XLAppオブジェクトも終了するために
UserFormの終了イベントに以下のように、インスタンスを破棄して
おきます。
Private Sub UserForm_Terminate()
  Set XLApp = Nothing
End Sub

あとは、コードウィンドウの先ほどの左ドロップダウンから
 -----------▼      -------------------------▼
  XLApp          WindowActivate
              WindowDeactivate 
------------
「XLApp」 を選ぶと コードウィンドウの右ドロップダウンにXLApp 関連の
Event リストがずらっと出てきますので、やろうとしている処理にあった
Eventを選んで、そのイベントプロシージャ内に処理を記述します。
たとえば、ウィンドウが切り替わった時にはApplicationレベルの
WindowDeactivate イベントやWindowActivateイベントが発生しますので
ここで現在アクティブになっているWindowのZoomを取得すればよいわけです。

Private Sub XLApp_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window)
  MsgBox Wn.Zoom
End Sub
といった感じで。

シートが切り替わったときには、SheetActivateイベントが発生するので
ここに処理を書いておいてもいいかもしれません。
Private Sub XLApp_SheetActivate(ByVal Sh As Object)
  MsgBox XLApp.ActiveWindow.Zoom
End Sub

【62995】Re:ワークブック、ワークシートが変わっ...
発言  Jaka  - 09/9/30(水) 9:57 -

引用なし
パスワード
   > VBAが記述されているワークブックではないワークブック(シート)
> からさらに別のワークブック(シート)が選択されたといったこと
> を取得することは可能でしょうか?
あ、そうか。
私のは無視してください。

【63003】Re:ワークブック、ワークシートが変わっ...
発言  neptune  - 09/9/30(水) 16:11 -

引用なし
パスワード
   ▼mixia さん:
こんな方法でも出来たと思います。
「Excel でアプリケーションレベルのイベント ハンドラーを作成する方法」
ht tp://support.microsoft.com/kb/213566/ja
勿論、適当に自分の必要な処理は書き加える必要があります。

【63014】Re:ワークブック、ワークシートが変わっ...
お礼  mixia  - 09/9/30(水) 22:49 -

引用なし
パスワード
   ▼kanabun さん:

あのような方法でフォーム内で上位レベルでのイベントの発生を知ることができるとはとてもためになります。

おかげさまで自分とはまったく関係のないところでのイベントでズーム倍率の表示内容の変更という目的が達成できました。

ありがとうございました。

【63016】Re:ワークブック、ワークシートが変わっ...
お礼  mixia  - 09/9/30(水) 23:07 -

引用なし
パスワード
   ▼neptune さん:

ためになります。
イベントを受け取る人はどこにいますか?といった形で探していたのですが、まさかイベントを受け取る人がいなくて受け取れないならば受け取る人を作ってしまえという回答が得られるとは思ってもみませんでした。

新しい考え方が生まれました。
ありがとうございました。

3304 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free