以下の内容はhttps://hake.hatenablog.com/entry/20180318/p1より取得しました。


EXCEL VBAメモ - ユーザーフォームを常に最前面にする(Excel2016)

2019/3/14追記

現時点のWindows10環境のExcelExcel for Office365 64bit)で確認したところ、下記で述べている問題は発生しませんでした。Excel側で改善されたようですね。
 
 
 

背景

職場のPCは現在Windows7 Excel2010の環境で統一されていて、そこで以下のようなExcelマクロを使用している。

  1. マクロ付ブックを起動する
  2. 同時にユーザーフォームが自動で(VbModelessオプションにて)起動する
  3. 対象ブックを開く(この時ユーザーフォームは最前面に表示されている)
  4. 対象ブックに対し、ユーザーフォームを操作しながら作業を行う。

Excel2016での問題点

ユーザーフォームを操作すると、マクロ付ブックがアクティブになり、対象ブックが隠れてしまう。また、対象ブックをアクティブにすると今度はユーザーフォームが隠れてしまう。
これは、Excel2013以降でExcel自体が変更になった結果みたい。
でも、これでは今後Windows10等に環境移行した際に、作業に支障でまくりなので何等かの対策が必要となる。

ユーザーフォームを常に最善面にくる様にする方法

標準モジュールに以下を追加(64bit用のコード)

  • 32bitの場合は、PtrSafeを削除、LongPtrをLongに変更で良かったはず(未検証)
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1


Public Const HWND_TOP = 0
Public Const HWND_BOTTOM = 1
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2


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


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

ユーザーフォームに以下を追加

Private Sub UserForm_Initialize()
    Const C_VBA6_USERFORM_CLASSNAME = "ThunderDFrame"

    Dim ret As Long
    Dim formHWnd As Long

    'Get window handle of the userform
    formHWnd = FindWindow(C_VBA6_USERFORM_CLASSNAME, Me.Caption)
    'If formHWnd = 0 Then Debug.Print Err.LastDllError

    'Set userform window to 'always on top'
    ret = SetWindowPos(formHWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    'If ret = 0 Then Debug.Print Err.LastDllError

    Application.WindowState = xlMinimized ' この操作は必須

End Sub

ただしこれでも、ユーザーフォーム操作後に、対象ブックのセルを選択しなおす等の操作をする際に、一旦対象ブックを選択しなおすという作業が必要なので、Excel2010と完全に同じ操作手順というようにはいかない。




以上の内容はhttps://hake.hatenablog.com/entry/20180318/p1より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14