VBAでWin32API(WindowsAPI)を64bit対応する方法
- 最初に、上に書いているWin32API_PtrSafe.TXTを入手してメモ帳などのテキストエディタで開いておきます。後で使います。
- そしてExcelを起動します。起動したらAltキー+F11キーを押してください。そうすると「Microsoft Visual Basic for Applications」というタイトルが付いた画面が表示されます。これがVBAの画面です。既にエラーダイアログが表示されていればこの画面が表示されている場合があります。
- 次に、VBAのコードを書く画面を開きます。具体的には、VBA画面の左上にある「プロジェクト」のところに「VBAProject (ブック名)」があり、その中に「Microsoft Excel Objects」→「Sheet1」や「ThisWorkbook」がありますので、どちらでもいいのでダブルクリックして右側に表示させます。ここではSheet1を開いています。
- 右側にウィンドウが開いたら、Ctrl + Fキー(もしくは編集メニュー→検索)を押して検索ダイアログを表示し、以下の画像のように検索する文字列に「Declare」と入力し、対象に「カレントプロジェクト」を選択して、「次を検索」ボタンを押します。
- すると、Win32APIを使用している箇所が見つかります。
- 例えば、「Private Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long) As Long」という行が見つかったとします。ここでの関数名は「Function」と書かれた右側の部分になりますので、例では「GetWindowLong」が関数名になります。
- そうしたら、関数名「GetWindowLong」を事前に開いておいたWin32API_PtrSafe.TXTで検索します。
- GetWindowLongをメモ帳で検索すると以下の4行が見つかります。
Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" ( ByVal hwnd As LongPtr , ByVal nIndex As Long ) As LongPtr
Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" ( ByVal hwnd As LongPtr , ByVal nIndex As Long ) As LongPtr
Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( ByVal hwnd As LongPtr , ByVal nIndex As Long ) As Long
#IFでの分岐はしない方がよい Visual Basic # If VBA7 And Win64 ThenDeclare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( ByVal hwnd As LongPtr , ByVal nIndex As Long ) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( ByVal hwnd As Long , ByVal nIndex As Long ) As Long
しかし、こういうことをしなければならないような状況に陥っているのならば、その状況自体が問題です。そして#IFでの分岐なんかやめてしまった方がいいです。
数年前までは「64bit版をインストールするといろいろ面倒だから32bit版を入れましょう」という話がいたるところにありました。その当時は周辺環境なども64bit対応への過渡期だったためそういう理屈も一理ありますが、2020年現在では64bitは当たり前の話で「32bit版を入れましょう」なんて話も聞かなくなりました。実際32bit版のPCなんて中古や在庫物で扱っているのがほとんどで、「Windows7 + 32bit + 新品PC」とかがあったとしても新品であっても最新ではありません。
関連記事 カテゴリー 最近の投稿- Win11でNAS上のExcelを開くと保護ビューになる原因と対処方法
- VBAからMySQLの接続や操作をする方法(VBAのみで接続可)
- VBAでブックやシートを一括でPDF出力する方法
- VBAのWorkbook_Openイベントを実行せずにブックを開く方法
- VBAでZIPファイルの中身を確認・一覧表示する方法