私の周りのExcel環境が 64bit版 が主流になってきている。
そして、ついに 私も Excelの32bit 版 の インストールされている PCが 無くなった。 てか 64bitだけに うっかりしてしまった。 (笑
VBAで 32bit版 での動作テストが。。。 まぁ いいか! (笑
必要な時があれば 再インストールです。
条件コンパイルも 最近は全然 使ってないし。。。 一応 覚書
#If VBA7 Then
'Office2010以降で64/32bit共通の宣言
#If Win64 Then
' 64bit専用の宣言:分ける必要がある時
#Else
' 32bit専用の宣言:分ける必要がある時
#End If
#Else
'Office2007以前用の宣言
#End If
ん? Office2007は サポート終わったし。。
新しいAPIの記述方法や 条件コンパイルが必要な API は MSサイトからダウンロードできる「Win32API_PtrSafe.txt」に載ってます。
公式:https://www.microsoft.com/en-us/download/details.aspx?id=9970
インストール 面倒なので 予備の保管場所として ここにアップしておく(いいのか? ) Win32API_PtrSafe.txt
実際の利用としては、こんな 感じ
#If VBA7 Then
Dim mXLHwnd As LongPtr 'Excel's window handle
Dim mhwndForm As LongPtr 'userform's window handle
Private Declare PtrSafe Function FindWindowA Lib "user32" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As LongPtr
#If Win64 Then
Private Declare PtrSafe Function SetWindowLongA Lib "user32" Alias "SetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr _
) As LongPtr
#Else
Private Declare PtrSafe Function SetWindowLongA Lib "user32" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr _
) As LongPtr
#End If
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
Dim mXLHwnd As Long 'Excel's window handle
Dim mhwndForm As Long 'userform's window handle
Private Declare Function FindWindowA Lib "user32" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long
Private Declare Function SetWindowLongA Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If
64bit版は 基本 32bit版 に下記の変更を加えます。
- Declare の後に PtrSafe を挿入する。
- ウィンドウハンドル、ポインタを表す関数の引数、戻り値の型は、Long型からLongPtr型に変更する。
で、64bit に対応です。
LongPtr データ型
<MSの説明>
LongPtr は、32 ビット環境では Long に変換され、64 ビット環境では LongLong に変換されるので、実際のデータ型ではありません。LongPtr を使用すると、32 ビット環境と 64 ビット環境の両方で実行できる移植性のあるコードを作成できます。ポインターおよびハンドラーには LongPtr を使用してください。
外部サイト
Office の 32 ビット バージョンと 64 ビット バージョン間の互換性:
https://docs.microsoft.com/ja-jp/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office
LongPtr データ型:
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/longptr-data-type
コメント