2016-05-23 4 views
1

ExcelでVBAフォームを使用しているときに、私はある種の動作に遭遇しました。私は他のフォームを呼び出すためのハブとして機能するModelessフォームを呼び出すモジュールを持っています。他のフォームはModalとして呼び出されます。問題は、子フォームが隠されたりアンロードされたりするとすぐに、親のModelessフォームも閉じられるということです。終了時にモーダルフォームがすべてのモードレスオープンフォームを閉じるのを防ぐ

私はこれに対する答えを見つけようとしましたが、これらの行には疑問がありますが、答えが得られなかった人はいませんでした。

少しのテストの後、私は開いている任意の数のフォームが同じ方法で閉じられると決めました。さらに、新しいワークブックで最小限のモデルを使用して問題を再現することができませんでした。その後、元のワークブックのすべてのコンポーネント(いくつかのモジュール、10-20クラス、およびいくつかのフォームがあります)を追加して、問題がいつ発生するかを確認しました。

私は、絶対にすべてを戻しても問題が再現されないことがわかったとき、私は同時に安心して迷惑になりました。私の結論は、これは私をもう一度気にしないであろう一種の虫だったということでした。しかし、まもなく、同一の呼び出しコードを持つ別の子フォームを追加すると、同じものが新しいもので再び発生し始めましたが、古いものでは起こりませんでした。

次に、誤動作しているフォームをエクスポートし、ブックから削除してからインポートします。そして、もう一度働いた。

以前にこのような動作が発生した人はいますか?私は何か間違っているのですか?あるいは、私はこれを厄介で回避可能なバグとして扱うべきですか?

すべてのコンテンツを除いて、問題の最小モデルの下ご覧ください:

Sub testA() 

Dim main1 As MainForm1 

Set main1 = New MainForm1 

main1.Show (vbModeless) 

End Sub 

メインフォーム::

Option Explicit 

Dim formobject As frmPickInjection 

Private Sub CommandButton1_Click() 

Set formobject = New frmPickInjection 


With formobject 
    .Show (vbModal) 
    Label1.Caption = CStr(.SelectedInjection) 
End With 

End Sub 

子フォーム:

メインフォームを呼び出す

モジュール

Option Explicit 

Public passvar As Boolean 

Private Sub CheckBox1_Click() 
passvar = CheckBox1.Value 
End Sub 

システム:Microsoft Windows 7のエンタープライズ6.1.7601(サービスパック1つのビルド7601)

Excelのバージョン:Office365エクセル2016(16.0.6729.1014)、64ビット

VBAのバージョン:7.1

答えて

0

私はしました前にこの問題が発生しました。 これが既に解決されているかどうかはわかりませんが、将来のユーザーはこれを修正しようとしています:

この厄介で間欠的な問題を解決するには、ユーザーフォームを表示し、ユーザーフォーム。

Unload MyChildUserform 
MyParentUserform.Show vbModal 
MyParentUserform.Hide 
MyParentUserform.Show vbModeless 

これは厄介で厄介ですが、動作しているようであり、一貫しています。

編集:

IMHOはるかに優れたソリューションは、フォーム自身の様式を制御することです。

宣言:

Public Declare Function EnableWindow lib "user32.dll" (ByVal hWnd as Long, ByVal fEnable as Long) as Long 
Public Declare Function FindWindow lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName as String, ByVal lpWindowName as String) as Long 

Public Enum MakeAsModal 
    Modal = 0 
    Modeless = 1 
End Enum 

Public ghWndParent as Long 

パブリックサブ(S):

Public Sub ChangeModality(ByRef hWnd as Long, ByVal isModal as MakeAsModal) 
    On Error Resume Next 
    Dim RetVal as Long 
    RetVal = EnableWindow(hWnd,isModal) 
End Sub 

親フォーム:

Private Sub Userform_Initialize() 
'Parent Form 
    ghWndParent = FindWindow(vbNullString, Me.Caption) 
End Sub 

Private Sub CallChild() 
'Parent Form 
    ChildUserform.Show vbModeless 
    ChangeModality ghWndParent, Modal 
End Sub 

子フォーム:

Private Sub Userform_QueryClose(Cancel As Integer, CloseMode as Integer) 
'Child Form 
    ChangeModality ghWndParent, Modeless 
End Sub 
+0

魅力的!私はそれを解決することはできませんでしたが、回避策でOKです。すべてのフォームをエクスポートする - マクロに割り当てたすべてのフォームをインポートし直します。 このコマンドシーケンスを一度実行してから、しばらくの間それを修正する必要がありますか、これはフォームの呼び出しコードの一部でなければなりませんか? そして、好奇心を離れて - どうやってこれを見つけ出すのですか? –

+0

私は実際にWinAPIのコマンドを含んでいますが、実際にはそれを使ってもっと良い解決策を見つけました。新しい解決策で上記の答えを修正します。 – Gnixxus

関連する問題