web-dev-qa-db-ja.com

ユーザーフォームを表示した後、フォーカスをアプリケーションウィンドウに戻します

ユーザーフォームを表示すると(Showメソッドを実行して)、画面に表示されるだけでなく、フォーカス(キーストロークなどの宛先)も表示されます。

たとえば、ユーザーフォームはカスタムツールバーです。そのShowWorkbook_Open()で起動しますが、フォーム自体は比較的まれにしか使用されないため、外観が表示された直後にメインアプリケーションウィンドウにフォーカスを戻す必要があります。

残念ながら、SetFocusメソッドはアプリケーションオブジェクトに対して有効ではないようです。

これはどのように行われるのですか?

私の例の解決策は後に来ると思います

Private Sub Workbook_Open()
    [...]
    UserForm1.Show
8
Greenberet

私はこれを使います:

AppActivate Application.caption

これにより、フォーカスがユーザーフォームからExcelシートにリセットされます。

17

私のために

AppActivate ThisWorkbook.Application

Showステートメントの直後は正常に動作するようです。

その他の場合

AppActivate "Microsoft Excel"

大丈夫かもしれません。

2
Greenberet

これは少しトリッキーですが、これは何ができるかです。

サブルーチン「Private Sub UserForm_Initialize()」で、これを最後の行として追加します。

Private Sub UserForm_Initialize()
    . . . . . . . . . . 
    Application.OnTime Now(), "MoveFocusToWorksheet"
End Sub

一般的なコードモジュールのいずれか(ない場合は1つ追加)で、API関数を宣言します。

Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

一般的なコードモジュールのいずれか(もちろん、API宣言が含まれている可能性があります)に、次のサブルーチンを追加します。

Public Sub MoveFocusToWorksheet()
    Dim Dummy As Long

    ThisWorkbook.Worksheets("Sheet1").Activate
    ' "Sheet1" here is the tab name of the sheet you want to move focus to. _
        Or simply use then: With shtABC.Activate _
        where "shtABC" being the worksheet's CodeName, _
        same as ThisWorkbook.Worksheets("Sheet1").CodeName, _
        same as the sheets module name showing in the Project Explorer panel.
    Dummy = SetForegroundWindow(Application.hwnd)
End Sub
2

同じワークブックに対して複数のウィンドウが開かれている場合、AppActivate Application.Captionが誤ったウィンドウにフォーカスする可能性があるため、AppActivate ActiveWindow.Captionを使用します。

1
CETAB

他の形式は次のとおりです。

AppActivate ThisWorkbook.Name
1

ダミーフォームを追加し、以下のようにコードを追加します。

Private Sub SomeButton_Click()

    frm_Dummy.Show vbModeless
    Unload frm_Dummy

End Sub

OR

Sub SomeSub()

    frm_Some.Show vbModeless
    frm_Dummy.Show vbModeless
    Unload frm_Dummy

End Sub
0
Fen

アプリケーションのオブジェクトを作成します。 Outlook、次にWindowSateをMaximized(OlMaximized)に変更し、フォーカスを削除したいときに最小化(olMinimized)

Set OutlookObj = GetObject(, "Outlook.Application")
OutlookObj.ActiveExplorer.WindowState = olMinimized
OutlookObj.ActiveExplorer.WindowState = olMaximized

または、アプリケーション内から状態を変更し、その場所やサイズなどを変更して詳細を確認することもできます: https://msdn.Microsoft.com/en-us/library/office/ff838577.aspx

Application.WindowState = xlMaximized
0
Andrew J Martin

この優れたディスカッションの脚注として、状況によっては、.Showの呼び出しをスキップしてフォーカスの問題を回避し、最初からフォーカスが移動しないようにすることができます。たとえばWordを使用して、モードレスフォームまたはダイアログボックスを更新する場合は、必要な領域を更新し、.Showの呼び出しを省略します。例:

Sub ShowProblems(ByVal ProbLoc)
    EditBox2.TextBox.Text = "Here is the problem location: " & ProbLoc
    ' not needed: EditBox2.Show vbModeless
End Sub
0
CODE-REaD

ユーザーフォームでフローティングメニューを作成し、このコードを使用して、カーソルをユーザーフォームから離れ、ワークシートにジャンプ/フォーカスを戻しました。各コマンドボタンのコードの最後に、ユーザーフォームの開始コードでも機能します。

AppActivate ThisWorkbook.Application

上記のコード行を、コマンドボタンコードの「End Sub」行と最初のshow userformコードの前に配置するだけです。

0
Geo Matrix
Private Sub UserForm_Activate()
    RefRangeIn.SetFocus
End Sub

excel 2013 VBAで機能します

0
Carlosmuerto