Excel VBA質問箱 IV

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

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


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

【70337】VBA Userformの表示、非表示について。 瞬希 11/11/2(水) 20:08 質問[未読]
【70339】Re:VBA Userformの表示、非表示について。 UO3 11/11/3(木) 6:06 回答[未読]
【70340】Re:VBA Userformの表示、非表示について。 瞬希 11/11/3(木) 10:33 お礼[未読]
【70360】VBA Userformの表示、非表示について。 瞬希 11/11/5(土) 20:04 質問[未読]
【70361】Re:VBA Userformの表示、非表示について。 Abyss 11/11/5(土) 20:19 発言[未読]
【70363】Re:VBA Userformの表示、非表示について。 瞬希 11/11/5(土) 21:43 発言[未読]
【70366】Re:VBA Userformの表示、非表示について。 瞬希 11/11/5(土) 22:58 発言[未読]
【70362】Re:VBA Userformの表示、非表示について。 UO3 11/11/5(土) 21:41 発言[未読]
【70364】Re:VBA Userformの表示、非表示について。 瞬希 11/11/5(土) 21:46 発言[未読]
【70367】Re:VBA Userformの表示、非表示について。 瞬希 11/11/5(土) 23:01 質問[未読]
【70368】Re:VBA Userformの表示、非表示について。 Abyss 11/11/6(日) 2:15 発言[未読]
【70369】Re:VBA Userformの表示、非表示について。 瞬希 11/11/6(日) 7:21 お礼[未読]

【70337】VBA Userformの表示、非表示について。
質問  瞬希  - 11/11/2(水) 20:08 -

引用なし
パスワード
   皆様よろしくお願いいたします。

Book1にUserformを作りModelessで利用しています。

Book1と他Bookを複数立ち上げ使用する際にBook1がアクティブになった時にだけUserformがModelessで表示されるようにしたいと考えています。

Workbook_WindowActivateでshowにし、Workbook_WindowDeactivateでhideにするだけでは他ブックがアクティブになった際にもUserforomが表示されてしまいます。
(表示されてしまう事があります、表示しない時もあるのですが・・・。)

上記の利用方法では不完全なのでしょうか?
何が不完全なのでしょうか?

是非教えていただきたいです。

よろしくお願いいたします。

【70339】Re:VBA Userformの表示、非表示について。
回答  UO3  - 11/11/3(木) 6:06 -

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

おはようございます

以下でお試しください。

Option Explicit

Dim WithEvents xlApp As Application

Private Sub Workbook_Open()
  Set xlApp = Application
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)  'これはなくてもいいですけど。
  Unload UserForm1
End Sub

Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)
  If Wb Is ThisWorkbook Then UserForm1.Show vbModeless
End Sub

Private Sub xlApp_WorkbookDeactivate(ByVal Wb As Workbook)
  If Wb Is ThisWorkbook Then UserForm1.Hide
End Sub

【70340】Re:VBA Userformの表示、非表示について。
お礼  瞬希  - 11/11/3(木) 10:33 -

引用なし
パスワード
   ▼UO3 さん:
>▼瞬希 さん:
>
>おはようございます
>
>以下でお試しください。
>
>Option Explicit
>
>Dim WithEvents xlApp As Application
>
>Private Sub Workbook_Open()
>  Set xlApp = Application
>End Sub
>
>Private Sub Workbook_BeforeClose(Cancel As Boolean)  'これはなくてもいいですけど。
>  Unload UserForm1
>End Sub
>
>Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)
>  If Wb Is ThisWorkbook Then UserForm1.Show vbModeless
>End Sub
>
>Private Sub xlApp_WorkbookDeactivate(ByVal Wb As Workbook)
>  If Wb Is ThisWorkbook Then UserForm1.Hide
>End Sub

UO3 さん、おはようございます。

回答ありがとうございます。
上記のコードで問題無く正しい動きができました。

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

【70360】VBA Userformの表示、非表示について。
質問  瞬希  - 11/11/5(土) 20:04 -

引用なし
パスワード
   何度も質問ばかりしてしまい申し訳ありません。

また皆様の知恵を貸してください。

ユーザーフォームの表示、非表示はUO3様の助言にて自分にも理解できましたのですが、また違う挙動に悩んでいます。

私のPCの問題なのか、何かまだコードを書き足りないのか?
エクセルの不具合なのか教えてください。

例えば、UO3様のコードを2枚のブックに貼り付けます。
その後、その2枚のブックを開き最小化して交互に表示させると両方のユーザーフォームが表示されてしまいます。

最小化→ブック1表示→最小化→ブック2表示→最小化(繰り返し)
結構繰り返さないと表示されないかもしれません。

くだらない質問で大変申し訳ありません。
この現象は一体どのような事なのでしょうか?
application.window.topなどで回避するしかないのでしょうか?
皆さんはどの様に改善されていますでしょうか?

宜しくお願いいたします。

【70361】Re:VBA Userformの表示、非表示について。
発言  Abyss  - 11/11/5(土) 20:19 -

引用なし
パスワード
   最初からその事が気になっていたが、
丁度その問題に気付いたのですね。

自分を表示、非表示するコードは自分の
モジュールに書くべきです。

【70362】Re:VBA Userformの表示、非表示について。
発言  UO3  - 11/11/5(土) 21:41 -

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

Abyss大先生から指摘がありますので、何か問題があるのだとは思うのですが
私の理解は「2つのブック」に同じものを記述するのではなく、フォームを保持しているブック(Book1)のみに記述。
Book1がアクティブになったときのみにフォームが表示されると、こう思っているんですが。
何か、とんでもない勘違いをしているんでしょうか?

【70363】Re:VBA Userformの表示、非表示について。
発言  瞬希  - 11/11/5(土) 21:43 -

引用なし
パスワード
   ▼Abyss さん:
>最初からその事が気になっていたが、
>丁度その問題に気付いたのですね。
>
>自分を表示、非表示するコードは自分の
>モジュールに書くべきです。

Abyss様、お久しぶりで御座います。

過去、確かdictionaryあたりでAbyss様にお世話になった記憶があります。
その節は本当に有難う御座いました。
Abyss様のお陰で、仕事もかなり楽になっております。

そして他掲示板でも、今でも本当にお世話になっております。

感謝の一言しかでません。

本当にありがとう御座います。

なるほど、自分のモジュールにですか・・・。

少し考え直してみます。

【70364】Re:VBA Userformの表示、非表示について。
発言  瞬希  - 11/11/5(土) 21:46 -

引用なし
パスワード
   ▼UO3 さん:
>▼瞬希 さん:
>
>Abyss大先生から指摘がありますので、何か問題があるのだとは思うのですが
>私の理解は「2つのブック」に同じものを記述するのではなく、フォームを保持しているブック(Book1)のみに記述。
>Book1がアクティブになったときのみにフォームが表示されると、こう思っているんですが。
>何か、とんでもない勘違いをしているんでしょうか?

UO3様、再レス大変ありがとう御座います。

私も自身、何か勘違いしているようです。
本当にAbyss様は大先生ですよね。

少し考えてみます、ありがとう御座います。

【70366】Re:VBA Userformの表示、非表示について。
発言  瞬希  - 11/11/5(土) 22:58 -

引用なし
パスワード
   ▼Abyss さん:
>最初からその事が気になっていたが、
>丁度その問題に気付いたのですね。
>
>自分を表示、非表示するコードは自分の
>モジュールに書くべきです。

かなり、乱暴だとは思いますが・・・・・・。

こんな感じは邪道なのでしょうか・・・・・・?
'〜〜〜〜〜〜標準モジュールに〜〜〜〜〜〜〜〜
Public USERFORM_VISIBLE_FLAG As Boolean

'〜〜〜〜〜〜Userformモジュールに〜〜〜〜〜〜
Private Sub UserForm_Activate()

With UserForm1
  If USERFORM_VISIBLE_FLAG = True Then
    If Application.Top < -100 Then
    
    ElseIf Application.Top >= -100 Then
      .Show (vbModeless)
    End If
  ElseIf USERFORM_VISIBLE_FLAG = False Then
    .Hide
  End If
End With
End Sub

Private Sub UserForm_Terminate()
USERFORM_VISIBLE_FLAG = Clear
End Sub

'〜〜〜〜〜〜〜ThisWorkbookモジュールに〜〜〜〜〜〜〜〜
Option Explicit

Dim WithEvents xlApp As Application

Private Sub Workbook_Open()
  Set xlApp = Application
    With UserForm1
      .Show (vbModeless)
    End With
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Unload UserForm1
End Sub

Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)
  With UserForm1
    .Show (vbModeless)
  End With
  If Wb Is ThisWorkbook Then USERFORM_VISIBLE_FLAG = True
End Sub

Private Sub xlApp_WorkbookDeactivate(ByVal Wb As Workbook)
  With UserForm1
    .Hide
  End With
  If Wb Is ThisWorkbook Then USERFORM_VISIBLE_FLAG = False
End Sub

【70367】Re:VBA Userformの表示、非表示について。
質問  瞬希  - 11/11/5(土) 23:01 -

引用なし
パスワード
   UO3様

ちょっと、無理ありそうですけど・・・。

'〜〜〜〜〜〜標準モジュールに〜〜〜〜〜〜〜〜
Public USERFORM_VISIBLE_FLAG As Boolean

'〜〜〜〜〜〜Userformモジュールに〜〜〜〜〜〜
Private Sub UserForm_Activate()

With UserForm1
  If USERFORM_VISIBLE_FLAG = True Then
    If Application.Top < -100 Then
    
    ElseIf Application.Top >= -100 Then
      .Show (vbModeless)
    End If
  ElseIf USERFORM_VISIBLE_FLAG = False Then
    .Hide
  End If
End With
End Sub

Private Sub UserForm_Terminate()
USERFORM_VISIBLE_FLAG = Clear
End Sub

'〜〜〜〜〜〜〜ThisWorkbookモジュールに〜〜〜〜〜〜〜〜
Option Explicit

Dim WithEvents xlApp As Application

Private Sub Workbook_Open()
  Set xlApp = Application
    With UserForm1
      .Show (vbModeless)
    End With
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Unload UserForm1
End Sub

Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)
  With UserForm1
    .Show (vbModeless)
  End With
  If Wb Is ThisWorkbook Then USERFORM_VISIBLE_FLAG = True
End Sub

Private Sub xlApp_WorkbookDeactivate(ByVal Wb As Workbook)
  With UserForm1
    .Hide
  End With
  If Wb Is ThisWorkbook Then USERFORM_VISIBLE_FLAG = False
End Sub

じゃダメですかね・・・・。

【70368】Re:VBA Userformの表示、非表示について。
発言  Abyss  - 11/11/6(日) 2:15 -

引用なし
パスワード
   > 邪道なのでしょうか・・・・・・?

コーディングに「邪道」と言う概念はないと
思いますよ。しかし、今回の現象はModeless
Userformのバグの一つだと私は思います。
(VBAのUserformに完璧さを求めるのも無意味ですけどね)

Userformもクラスですので、オブジェクトイベントの
キャッチが可能です。それを利用すれば、もう少し
シンプルにコードを書けます。

WorkbookイベントもUseformモジュールの
中で記述するだけです。そうすると、Userformインスタンスが
存在する時だけに目的のイベントを掴む事ですので。

それから、上で述べましたように今回の件は
ModelessユーザーフォームをHideする際、インスタンス管理に
なにかしら問題があると考えられます。
個人的には「Userform1」と言うクラス名を直接使うのは
テスト以外ではほとんどないですが、
今回は下記のような非同期Likeな方法で回避できると思います。
(本音はAPITimerを使うべきだと思っていますが)

'(標準モジュール)

Private Sub auto_open()
  UserForm1.Show 0
End Sub

Private Sub FormHide()
  UserForm1.Hide
End Sub


'(Userformモジュール)

Private WithEvents WB As Workbook

Private Sub UserForm_Initialize()
  Set WB = ThisWorkbook
End Sub

Private Sub WB_Activate()
  StartUpPosition = 0 '元の位置から表示。
  Show 0
End Sub

Private Sub WB_Deactivate()
  Application.OnTime Now, "FormHide"
End Sub

Private Sub WB_BeforeClose(Cancel As Boolean)
  Set WB = Nothing
End Sub

【70369】Re:VBA Userformの表示、非表示について。
お礼  瞬希  - 11/11/6(日) 7:21 -

引用なし
パスワード
   Abyss様、UO3様。

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

実はフォームの表示、非表示の挙動はかなり前から気になっており検索ワードを色々と変えながら調べていましたが・・・・一向にほしい情報が手に入ってきませんでした。
まったく情報が手に入らないので、私のPCが壊れているのか?などと思い込む事にして、誤魔化し状態で使用していたのが解決できスッキリしました。

しかし正直に言うと、頭はまだ混乱しております。

この、頭の混乱が解決してからお礼を書くと相当な時間が掛かってしまうと思われるので御礼だけ先に書かせて頂きます。

Abyss様、UO3様、大切なお時間と、お知恵を私に頂きありがとう御座いました。

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