Excelは 2013からSDIを採用。
SDIになって、最初にこまったのがFormの管理。
UserForm を Modelessモードで表示し時、別のブックに切り替えると UserFormがブックの下に隠れてしまう。
UserFormをアクティブすると必ず、UserFormを起動したブックのウインドウが前に来てしまいます。
つまり、全てのブックの前に UserFormを表示することが簡単に出来なくなってしまったのです。
ネットでは、当時その問題を解決する方法が 色々話題になってたように記憶しています。
で、海外のどこだったのサイトで、分かりやすいのがあってそれを当時採用しました。(この記事を書く時、探してみたが見つからない。。)
最近その手のフォームを利用することがなかったのですが、ちょっと使うことがあって 覚書。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | Option Explicit'■ Form_ModulePrivate WithEvents XLApp As Excel.ApplicationDim mXLHwnd As LongPtr 'Excel's window handleDim mhwndForm As LongPtr 'userform's window handle#If VBA7 Then 'Excel2010(ver14)- '32/64bit 'キャプション名からウインドウハンドルを取得 Private Declare PtrSafe Function FindWindowA Lib "user32" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String _ ) As LongPtr '指定ウィンドウ最前面&アクティブにする Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long #If Win64 Then '64bit 'ウインドウの属性変更 SetWindowLongA(ウインドウハンドル, 変更するデータの指定, 新しい値) Private Declare PtrSafe Function SetWindowLongA Lib "user32" Alias "SetWindowLongPtrA" ( _ ByVal hwnd As LongPtr, _ ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr _ ) As LongPtr #Else '32bit Private Declare PtrSafe Function SetWindowLongA Lib "user32" ( _ ByVal hwnd As LongPtr, _ ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr _ ) As LongPtr #End If#End IfConst GWL_HWNDPARENT As Long = -8 '親ウィンドウのハンドル'■ UserForm_Initialize -------------------------------------------Private Sub UserForm_Initialize() 'Excel2013(ver15)- SDI If Val(Application.Version) >= 15 Then Set XLApp = Application 'ユーザーフォームのハンドルをCaption名から取得 mhwndForm = FindWindowA("ThunderDFrame", Caption) End IfEnd Sub'■ WindowActivate ---------------------------------------------Private Sub XLApp_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window) mXLHwnd = Application.hwnd SetWindowLongA mhwndForm, GWL_HWNDPARENT, mXLHwnd SetForegroundWindow mhwndFormEnd Sub'■ WorkbookBeforeClose --------------------------------------------Private Sub XLApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) SetWindowLongA mhwndForm, GWL_HWNDPARENT, 0&End Sub |
コメント