[[20250307172627]] 『ユーザーフォーム.showの時にブックを背面にしたax(やわら) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『ユーザーフォーム.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


ユーザーフォームに上記コード入れてためしてみたのですが、これだけだとアプリの下にユーザーフォームが隠れてしまいました。
ですが、上記コードを参考に検索したところ、
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10184591240
このページが見つかり、
UserForm_Initialize → UserForm_Activateで希望の動作ができました!
大変助かりました。ありがとうございます。
(やわら) 2025/03/10(月) 12:33:29

 そっかぁ、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


毎回クローズしているため、理論上Initializeでも行けそうなんですが、
なにが違っているのか正直あまり理解はできていないです。
おまけありがとうございます。手の空いたときに遊んでみます(笑)
(やわら) 2025/03/13(木) 10:47:38

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.