条件付きコンパイル(32ビット64ビットの互換性)
条件付きコンパイルは、
VBAの特定のコードブロックを選択してコンパイルします、VBAの他の部分は無視されます、
条件付きコンパイルステートメントは、実行時ではなくコンパイル時に実行されます。
#If...Then...#Else ディレクティブを使用します。
(ディレクティブという言い方をするだけで、特段気にする必要はありません)
Decrareステートメント
モジュール定数・変数の宣言
プロシージャ内のステートメント
これら全てに有効なものです。
したがって、32ビットと64 ビットで、処理ロジックを変えることも可能です。
デバッグ時と本番を切り替えたりにも使いますが、
一番よく使われるのは、
Excel32ビットとExcel64 ビットの互換性を保つ為に、共通のVBAソースコードにする場合です。
具体的には、Win32APIを使用しているとき、
Excel32ビットとExcel64 ビットでは、Declareステートメントを変えなければなりません。
※Excel32ビット
Excel2007以前の32ビットになります。
Excel2010以降では、32ビットのExcelでも、も64 ビットの記述で問題ありません。
Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性
64 ビット Visual Basic for Applications の概要
コンパイラ定数
Declare Function GetActiveWindow Lib "user32" () As Long
この記述では、64ビットでは実行時エラーとなります。
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
この記述では、32ビットでは、コンパイルエラーとなります。
APIのDeclare ステートメントを更新して、64 ビット バージョンで動作するようにしなければなりません。
これらのステートメントで使われているアドレス ポインターおよび表示ウィンドウ ハンドルを更新することも必要です。
64ビットでは、以下の機能が追加されています。
変数型エイリアスLongPtr が追加されています。
LongPtr が解決される実際のデータ型は、実行しているOfficeのバージョンによって決まります。
32 ビット版ではLongPtはLongに解決され、64 ビットではLongPtrはLongLongに解決されます。
LongPtrはポインターおよびハンドラーに使用します。
LongLong データ型は符号付きの 64 ビット整数であり、64 ビットでのみ使用できます。
PtrSafe キーワードは、Declare ステートメントが 64 ビット版の Office で実行しても安全であることを示します。
すべてのDeclareステートメントにPtrSafeキーワードが含まれている必要があります。
PtrSafeをDeclareステートメントに追加しただけではDeclareステートメントが64 ビットを対象にしていることを示しているだけです。
64 ビットを格納する必要があるステートメント内のすべてのデータ型を、64 ビットの大きさを保持するように変更する必要がります。
このDecrareステートメントを、
32ビット、64 ビットのどちらでも、実行可能なVBAコードにするには、
条件付きコンパイルを使用して、
#If Vba7 Then
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
#Else
Declare Function GetActiveWindow Lib "user32" () As Long
#End If
このように、
#If...Then...#Elseディレクティブ
を使用します。
64ビットでは、コンパイルエラーの赤字にはなりません。
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
がコンパイルされ、
32ビットでは、
Declare Function GetActiveWindow Lib "user32" () As Long
がコンパイルされます。
の部分を、
#If VBA7 And Win64 Then
としてサンプルが書かれているものをよく見かけますが、64ビット版のOfficeでは、VBAのバージョンが7を使用しているということで、
Vba7、Win64のどちらで判断しても、今回の場合は同じことになります。
Vba7条件付きコンパイラ定数は、
コードがバージョン7のVBエディター(Office2010以降に付属するVBAのバージョン)で実行するかどうかを判別するために使用されます。
Win64条件付きコンパイル定数は、
実行しているOfficeの版 (32ビットまたは64ビット) を特定するために使用されます。
使用できるコンパイラ定数は以下になります。
定数 | 説明 |
Vba6 | 開発環境が、Visual Basic for Applications Version 6.0 互換の場合に True、以外は False |
Vba7 | 開発環境が、Visual Basic for Applications Version 7.0 互換の場合に True、以外は False |
Win16 | 開発環境が、16 ビット互換の場合に True、以外は False |
Win32 | 開発環境が、32 ビット互換の場合に True、以外は False |
Win64 | 開発環境が、64 ビット互換の場合に True、以外は False |
Mac | 開発環境が、Macintoshである場合に True、以外は False |
とくに難しいこともありません。
ただ、個人的には、
32ビットで、Decrareが赤字のコンパイルエラーになってしまうのは、どうも気色が悪いですね。
ただ、Excelのバージョンも2010以降が主力になりつつあるので、
このような問題も、今後は無くなってくると思います。
同じテーマ「マクロVBA技術解説」の記事
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.条件分岐(Select Case)|VBA入門
9.メッセージボックス(MsgBox関数)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 条件付きコンパイル(32ビット64ビットの互換性)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。