2017-11-05 18 views
0

私は2つのワークブックを持っています。 Workbook1が実行され、表示され、同時に、このSubプロシージャでworkbook1を隠すのUserForm1を:ワークブックは表示されません。フォームから開かれたときは表示されます

Private Sub CommandButton2_Click() 
    Application.Visible = True 
    MainForm.Hide 
    On Error Resume Next 
End Sub 

しかし、私はまた、次のコードでコマンドボタンを使用してのUserForm1からWorkbook2を開く必要があります。

Private Sub CommandButton4_Click() 

     Dim Finfo As String 
     Dim FilterIndex As Integer 
     Dim Title As String 
     Dim Filename As Variant 
     Dim wb As Workbook 


'  Setup the list of file filters 

     Finfo = "Excel Files (*.xlsx),*xlsx," 

'  Display *.* by default 

     FilterIndex = 1* 

'  Set the dialog box caption 

     Title = "Select a File to Open" 

    ' Get the Filename 
     Filename = Application.GetOpenFilename(Finfo, _ 
     FilterIndex, Title) 

'  Handle return info from dialog box 

     If Filename = False Then 
     MsgBox "No file was selected." 
     Else 
     MsgBox "You selected " & Filename 
     End If 

     Set wb = Workbooks.Open(Filename) 

     End Sub 

私の問題は、一部またはCommandButton2をするコードは、コードApplication.Visible =私はWorkbook2を開いたときに偽の一部を持っているので、私は私がUserForm1でを閉じない限り、それを見ることができないんだということです。だから私はWorkbook1を隠しておきたいのですが、私はWorkbook2を見て作業することができます。

+0

あなたの投稿のタイトルは意味がありません。 ...ほとんどの人はあなたの投稿を見ていません – jsotola

+0

うん!あなたはそれについて正しいのです。あなたはそれが私の投稿の神のタイトルとなると思いますか – Sergio

答えて

0

あなたがここに探していることは、あなたが「ダイアログボックスが表示されている間、現在のアプリケーションの別の場所で作業を続ける」ことを可能にするモードレスユーザーフォームを持つことである(More infos

とをお願い致しますあなたは、フォームを作成するには、showメソッドを使用すると、表示され、あなたはvbModelessオプションを追加する必要があります:

MainForm.Show(vbModeless) 

さて、すべての時間(すべてのウィンドウの上)に見えるユーザーフォームを維持する方法? あなたがWindows上にいると仮定すると、いくつかのAPI宣言を利用することになります。あなたはこれが正確に把握していない場合は、心配しないで、あなただけの次の手順に従います。

1)独立したモジュールで

Option Explicit 

Public Const SWP_NOMOVE = &H2 
Public Const SWP_NOSIZE = &H1 

Public Enum HWND_TYPE 
    HWND_TOP = 0 
    HWND_NOTOPMOST = -2 
    HWND_TOPMOST = -1 
    HWND_BOTTOM = 1 
End Enum 

#If VBA7 Then 

    Public Declare PtrSafe Function SetWindowPos Lib "user32" _ 
     (ByVal hWnd As LongPtr, _ 
     ByVal hWndInsertAfter As LongPtr, _ 
     ByVal x As Long, _ 
     ByVal Y As Long, _ 
     ByVal cx As Long, _ 
     ByVal cy As Long, _ 
     ByVal uFlags As Long) As Long 

    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _ 
     (ByVal lpClassName As String, _ 
     ByVal lpWindowName As String) As LongPtr 

#Else 

    Public Declare Function SetWindowPos Lib "user32" _ 
     (ByVal hWnd As Long, _ 
     ByVal hWndInsertAfter As Long, _ 
     ByVal X As Long, _ 
     ByVal Y As Long, _ 
     ByVal cx As Long, _ 
     ByVal cy As Long, _ 
     ByVal uFlags As Long) As Long 

    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
     (ByVal lpClassName As String, _ 
     ByVal lpWindowName As String) As Long 

#End If 

2を次のコードをコピーしてください)ユーザーフォームのコードモジュールにAlwaysOnTopの手順については、このコードをコピーしてください:

Private Sub AlwaysOnTop(caption As String) 
'PURPOSE: This function allows the userform to remain on top of all windows - Adjusted 
'REFERENCE: https://www.mrexcel.com/forum/excel-questions/386643-userform-always-top-2.html 

    #If VBA7 Then 
     Dim hWnd As LongPtr 
    #Else 
     Dim hWnd As Long 
    #End If 
    Dim lResult As Boolean 

    If Val(Application.Version) >= 9 Then 
     hWnd = FindWindow("ThunderDFrame", caption) 
    Else 
     hWnd = FindWindow("ThunderXFrame", caption) 
    End If 

    If hWnd <> 0 Then 

     lResult = SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) 

    Else 

     MsgBox "AlwaysOnTop: userform with caption '" & caption & "' not found" 

    End If 

End Sub 

3)UserForm_InitializeのどこかにAlwaysOnTopの手順を使用します。すなわち:

Private Sub UserForm_Initialize() 

    'Your code 

    AlwaysOnTop Me.caption 

End Sub 
+0

こんにちは。 vbModeless Optionについてのあなたの洞察は非常に役に立ちます。しかし、私はフォームから実行しているワークブックを非表示にし、フォームから開くことができる他のワークブックを表示したいと思っているコードの部分ではまだ苦労しています。ありがとうございました – Sergio

+0

私はあなたのフォームを見えるようにするのに役立つ私の答えを編集しました。 – DecimalTurn

+0

手順1,2および3であなたの指示に従いましたが、エラーメッセージが表示されます。コンパイルエラー:Subまたは機能が定義されていません。ごめんなさい! – Sergio

関連する問題