Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2013)
ユーザーフォーム Deactivateイベントで
投稿日時: 18/05/09 16:36:25
投稿者: maruco33

こんにちは、いつもお世話になっております。
 
ユーザーフォーム(usrSonyu)を作成しました。
Label1設置
 
シート上にあるコマンドボタンをクリックすると
ユーザーフォーム1をモードレスで表示させます。
 
その後、シートの行をクリックして、行範囲をユーザーフォームのラベルのキャプションに表示させるという作業をしたいです。
 
標準モジュールへは
 
Sub Uchi_in()
    usrSonyu.Show (0)
End Sub
 
Sub Lbl_Gyo()
    Dim Gr As String
    Gr = Selection.Address
    usrSonyu.Label1.Caption = Gr
End Sub
 
ユーザーフォーム側では
 
Private Sub UserForm_Deactivate()
Call Lbl_Gyo
End Sub
 
と、したのですが、うまく表示してくれません。
試しに
Private Sub UserForm_Activate()
Call Lbl_Gyo
End Sub
イベントを変えてみたらうまく表示してくれました。
Deactivateやほかのイベントの使い方を理解していないのか、、、
どうかご教授よろしくお願いいたします。
 
 

投稿日時: 18/05/09 16:41:14
投稿者: maruco33

追記:
Private Sub UserForm_Activate()
でうまく表示されたとは、
最初に行範囲を選択したあとで
ユーザーフォーム1を表示させました。
 
なので、当然その後、行の選択範囲を変えてもラベルのキャプションは変わりません。
 
ユーザーフォームイベントにチェンジなるもの?があるのでしょうか?
 

回答
投稿日時: 18/05/09 17:12:43
投稿者: sk

引用:
シート上にあるコマンドボタンをクリックすると
ユーザーフォーム1をモードレスで表示させます。
  
その後、シートの行をクリックして、行範囲をユーザーフォームの
ラベルのキャプションに表示させるという作業をしたいです

([usrSonyu]のフォームモジュール)
---------------------------------------------------------------------
Option Explicit
 
Private WithEvents app As Excel.Application
 
Private Sub UserForm_Initialize()
 
    Set app = Application
 
End Sub
 
Private Sub UserForm_Terminate()
 
    Set app = Nothing
 
End Sub
 
Private Sub app_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 
    Dim Gr As String
    Gr = Target.Address(External:=True)
    Me.Label1.Caption = Gr
 
End Sub
---------------------------------------------------------------------
 
こういうことでしょうか。

回答
投稿日時: 18/05/10 16:10:30
投稿者: WinArrow
投稿者のウェブサイトに移動

>ユーザーフォーム1をモードレスで表示させます。
この状態で、ワークシートを選択しただけでは、
DeActivateイベントは発生しません。
  
シートモジュールのイベント側で
USerformのラベルにデータをセットする方法を提案します。
  
skさんのレスでは
>Private WithEvents app As Excel.Application
を使った案を提案していますが、
  
シートモジュールに
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     If usrSonyu Is Nothing Then Exit Sub
     usrSonyu.Label1.Caption = Target.Address
 End Sub
を記述するだけで、できると思います。
 
標準モジュールの
>Sub Lbl_Gyo()
を活かすならば
    usrSonyu.Label1.Caption = Target.Address
の代わりに
    Call Lbl_Gyo
でも可能です。
  
  

投稿日時: 18/05/10 16:49:45
投稿者: maruco33

sk様ありがとうございます。
 
>Private WithEvents app As Excel.Application
の部分が、初めてでむつかしく、わからないのでいろいろ調べている最中です
 
WinArroww様、ありがとうございます。コードをもとに解決できました。
 
ちなみに、

WinArrow さんの引用:
>ユーザーフォーム1をモードレスで表示させます。
この状態で、ワークシートを選択しただけでは、
DeActivateイベントは発生しません。
  

 
の、部分ですが、
ユーザーフォームをモードレスにする→DeActivateイベントは発生しない
ユーザーフォームをモードレスにしない→DeActivateイベントは発生する
 
との解釈でいいのでしょうか?
重ねた質問で申し訳ありません。もう少しご教授ください。

回答
投稿日時: 18/05/10 17:46:40
投稿者: WinArrow
投稿者のウェブサイトに移動

maruco33 さんの引用:

ちなみに、
WinArrow さんの引用:
>ユーザーフォーム1をモードレスで表示させます。
この状態で、ワークシートを選択しただけでは、
DeActivateイベントは発生しません。
  

 
の、部分ですが、
ユーザーフォームをモードレスにする→DeActivateイベントは発生しない
ユーザーフォームをモードレスにしない→DeActivateイベントは発生する
 
との解釈でいいのでしょうか?
重ねた質問で申し訳ありません。もう少しご教授ください。

 
>ユーザーフォームをモードレスにする
の目的を考えてみてください。
ユーザーフォームを表示させた状態で、
ワークシートを操作する
というのが、モードレスにする
ということです。
 
モードレスにしない
は、ワークシートの操作はできないのですから
DeActivateイベント発生を考えることそのものナンセンスです。
勿論、DeActivateイベントは発生しませんよ!
 
 

回答
投稿日時: 18/05/10 18:09:32
投稿者: WinArrow
投稿者のウェブサイトに移動

>ユーザーフォームの
DeActovateイベントがどのようなときに発生するかを説明しておきます。
 
たとえば
Userform1 と Userform2 のように複数のユーザーフォームを使う処理において
 
Userform1の中で Userform2 を開いた場合、
Userform1のDeActivateイベントが発生します。
Userform2側は、Activateイベントが発生します。
 
 

投稿日時: 18/05/11 09:19:32
投稿者: maruco33

>>モードレスにしない
は、ワークシートの操作はできないのですから
DeActivateイベント発生を考えることそのものナンセンスです。
勿論、DeActivateイベントは発生しませんよ!
 
たしかに、、、モードレスにしない時の動きを頭に入れないでのうかつな質問でした。
 
ありがとうございます。
 
問題も解決したのでこちらで、終了とさせていただきます。