Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2018 | 02 | 03 | 04 | 05 |

2018-03-18(Sun)

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

背景

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

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

Excel2016での問題点

ユーザーフォーム操作すると、マクロ付ブックがアクティブになり、対象ブックが隠れてしまう。また、対象ブックをアクティブにすると今度はユーザーフォームが隠れてしまう。

これは、Excel2013以降でExcel自体が変更になった結果みたい。

でも、これでは今後Windows10等に環境移行した際に、作業に支障でまくりなので何等かの対策必要となる。


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

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

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と完全に同じ操作手順というようにはいかない。


参考サイト

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20180318/p1