ユーザーフォームを表示すると(Show
メソッドを実行して)、画面に表示されるだけでなく、フォーカス(キーストロークなどの宛先)も表示されます。
たとえば、ユーザーフォームはカスタムツールバーです。そのShow
はWorkbook_Open()
で起動しますが、フォーム自体は比較的まれにしか使用されないため、外観が表示された直後にメインアプリケーションウィンドウにフォーカスを戻す必要があります。
残念ながら、SetFocus
メソッドはアプリケーションオブジェクトに対して有効ではないようです。
これはどのように行われるのですか?
私の例の解決策は後に来ると思います
Private Sub Workbook_Open()
[...]
UserForm1.Show
私はこれを使います:
AppActivate Application.caption
これにより、フォーカスがユーザーフォームからExcelシートにリセットされます。
私のために
AppActivate ThisWorkbook.Application
Show
ステートメントの直後は正常に動作するようです。
その他の場合
AppActivate "Microsoft Excel"
大丈夫かもしれません。
これは少しトリッキーですが、これは何ができるかです。
サブルーチン「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
同じワークブックに対して複数のウィンドウが開かれている場合、AppActivate Application.Captionが誤ったウィンドウにフォーカスする可能性があるため、AppActivate ActiveWindow.Captionを使用します。
他の形式は次のとおりです。
AppActivate ThisWorkbook.Name
ダミーフォームを追加し、以下のようにコードを追加します。
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
アプリケーションのオブジェクトを作成します。 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
この優れたディスカッションの脚注として、状況によっては、.Show
の呼び出しをスキップしてフォーカスの問題を回避し、最初からフォーカスが移動しないようにすることができます。たとえばWordを使用して、モードレスフォームまたはダイアログボックスを更新する場合は、必要な領域を更新し、.Show
の呼び出しを省略します。例:
Sub ShowProblems(ByVal ProbLoc)
EditBox2.TextBox.Text = "Here is the problem location: " & ProbLoc
' not needed: EditBox2.Show vbModeless
End Sub
ユーザーフォームでフローティングメニューを作成し、このコードを使用して、カーソルをユーザーフォームから離れ、ワークシートにジャンプ/フォーカスを戻しました。各コマンドボタンのコードの最後に、ユーザーフォームの開始コードでも機能します。
AppActivate ThisWorkbook.Application
上記のコード行を、コマンドボタンコードの「End Sub」行と最初のshow userformコードの前に配置するだけです。
Private Sub UserForm_Activate()
RefRangeIn.SetFocus
End Sub
excel 2013 VBAで機能します