前提・実現したいこと
複数ブックを表示しているという前提で、対象のブックに対してタイトルバーを非表示にする処理をVBAにて作成しています。
エクセルの機能だけでは実現できないと考え、WindowsAPIを用いております。
発生している問題・エラーメッセージ
コード自体は記述できており内容も問題ないと考えているのですが、処理を実行しても画面上は特に変化は無く、タイトルバーの非表示が実現できません。
基本的な処理の流れとしては、対象のブックのハンドル値を取得、SetWindowLongにてウインドウ変更、SetWindowPosにて反映といった形になります。
以下、ソースコードになります。
宣言は全て記載、処理は該当の部分のみを記載しました。
ウインドウ名を渡して処理を呼び出しています。
当方はWindowsAPIを最近利用し始めたばかりのため不慣れであり、もし問題があると思われる箇所がありましたらご指摘頂けたらと思います。
該当のソースコード
VBA
1'最前面 2Private Declare Function GetForegroundWindow Lib "user32" () As Long 3Private Declare Function SetWindowPos Lib "user32" _ 4(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ 5 ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, _ 6 ByVal wFlags As Long) As Long 7 8Private Const HWND_TOP = 0 9Private Const HWND_TOPMOST As Long = -1 10Private Const SWP_NOSIZE As Long = &H1& 11Private Const SWP_NOMOVE As Long = &H2& 12Private Const SWP_FRAMECHANGED = &H20& 13 14 15'フォーム背景透明化 16Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 17 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 18Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ 19 (ByVal hwnd As Long, ByVal nIndex As Long) As Long 20Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ 21 (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 22Private Declare Function SetLayeredWindowAttributes Lib "user32" _ 23 (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Long, ByVal dwFlags As Long) As Long 24 25Const GWL_EXSTYLE = (-20) 26Const WS_EX_LAYERED = &H80000 27Const LWA_COLORKEY = 1& 28Const LWA_ALPHAKEY = 2& 29 30 31'フォームタイトルバー非表示 32#If VBA7 And Win64 Then 33Private Declare PtrSafe Function WindowFromObject Lib "oleacc" Alias "WindowFromAccessibleObject" _ 34 (ByVal pacc As Object, phwnd As LongPtr) As LongPtr 35Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As LongPtr) As Long 36#Else 37Private Declare Function WindowFromObject Lib "oleacc" Alias "WindowFromAccessibleObject" _ 38 (ByVal pacc As Object, phwnd As Long) As Long 39Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long 40#End If 41 42Const GWL_STYLE = (-16&) 43Const WS_CAPTION = &HC00000 44Const WS_EX_DLGMODALFRAME = &H1& 45 46Sub ウインドウ設定(ウインドウ As String) 47 48 Dim hwnd As Long 49 50 hwnd = FindWindow("XLMAIN", ウインドウ) 51 Call SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) And Not WS_CAPTION) 52 Call SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_FRAMECHANGED) 53 54End Sub 55
試したこと
ハンドル値が正常に取得できているかは検証済みです。
問題があるとすればそれ以降の処理になるかと思います。
補足情報(FW/ツールのバージョンなど)
Excel2016 32ビット バージョン2011
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。