『ユーザーフォーム.showの時にブックを背面にしたい』(やわら)
たびたび申し訳ございません。
お力添えいただけると幸いです。
VBAの中で別のアプリを呼んで立ち上げております。
AppActivateでそのアプリを最前面に一度出すのですが、
その後にユーザーフォームのMe.Showをすると、ブックも最前面に来てしまいます。
ただし、ユーザーフォーム起動中にセルの中身を触りたい需要があるため
Application.Visibleは使用したくありません。
ユーザーフォームだけを最前面に出すことはできるのでしょうか?(Popupのように)
よろしくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
ユーザーフォームを常に最前面表示(TOPMOST)ウインドウにしてしまう。とか...
Private Declare PtrSafe Function WindowFromAccessibleObject Lib "oleacc.dll" (ByVal IAcessible As Object, ByRef hwnd As LongPtr) As Long Private 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 wFlags As Long) As Long Private Const SWP_NOSIZE = &H1& Private Const SWP_NOMOVE = &H2& Private Const HWND_TOPMOST = &HFFFFFFFF
Private Sub UserForm_Initialize() Dim hwnd As LongPtr WindowFromAccessibleObject Me, hwnd SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE End Sub
(白茶) 2025/03/07(金) 19:58:16
そっかぁ、Initializeだと不発なんですね。(当方環境ではイケたので普通にイケると思った...) とにかく教えて頂いてありがとうございました。^^;
これ↓オマケです。ユーザーフォームに「切り替えスイッチ」2個と「最小化ボタン」を付けてタスクバーにも表示させてみた。って例。 (昔書いたコードなので最近の環境では動作確認してませんけどたぶん大丈夫だと... ^^;)
Option Explicit Private Declare PtrSafe Function WindowFromAccessibleObject Lib "oleacc.dll" (ByVal IAcessible As Object, ByRef hWnd As LongPtr) As Long Private 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 wFlags As Long) As Long Private Const SWP_NOSIZE = &H1& Private Const SWP_NOMOVE = &H2& Private Const HWND_TOPMOST = &HFFFFFFFF Private Const HWND_NOTOPMOST = &HFFFFFFFE Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const GWL_EXSTYLE = &HFFFFFFEC Private Const WS_EX_APPWINDOW As Long = &H40000 Private Const GWL_STYLE = &HFFFFFFF0 Private Const WS_MINIMIZEBOX = &H20000 Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal nCmdShow As Long) As Long Private Const SW_SHOWNORMAL = 1& Private Const SW_MINIMIZE = 6& Private WithEvents chkTopMost As MSForms.CheckBox, WithEvents chkAppHide As MSForms.CheckBox Public Property Get hWnd() As LongPtr WindowFromAccessibleObject Me, hWnd End Property Public Property Get TopMost() As Boolean TopMost = chkTopMost.Value End Property Public Property Let TopMost(newBool As Boolean) 'Property使って遠回りする意味あんまり無い(外部にどう見せるかという拘り) chkTopMost.Value = newBool If chkTopMost.Value Then SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE chkTopMost.ForeColor = &HFF Else SetWindowPos hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE chkTopMost.ForeColor = &H80000012 End If End Property Private Sub chkAppHide_Change() 'Property経由して外部に見せたいモノでもない Application.Visible = Not chkAppHide.Value End Sub Private Sub chkTopMost_Change() TopMost = chkTopMost.Value End Sub Private Sub UserForm_Activate() Dim hw As LongPtr hw = Me.hWnd SetWindowLong hw, GWL_EXSTYLE, GetWindowLong(hw, GWL_EXSTYLE) Or WS_EX_APPWINDOW SetWindowLong hw, GWL_STYLE, GetWindowLong(hw, GWL_STYLE) Or WS_MINIMIZEBOX ShowWindow hw, SW_MINIMIZE ShowWindow hw, SW_SHOWNORMAL TopMost = True End Sub Private Sub UserForm_Deactivate() '本件ではあんまり意味無い(他のユーザーフォームに移った時の為の措置) chkAppHide.Value = False End Sub Private Sub UserForm_Initialize() Set chkTopMost = Me.Controls.Add("Forms.CheckBox.1", "chkTopMost") chkTopMost.Caption = "TopMost" chkTopMost.AutoSize = True Set chkAppHide = Me.Controls.Add("Forms.CheckBox.1", "chkAppHide") chkAppHide.Caption = "Hide Excel" chkAppHide.AutoSize = True chkAppHide.Left = chkTopMost.Left + chkTopMost.Width End Sub Private Sub UserForm_Terminate() Application.Visible = True End Sub
(白茶) 2025/03/11(火) 23:13:18
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.