VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 - Office 2010,2013 ホームページ制作 | 墨田区

VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 – Office 2010,2013

LINEで送る
Pocket

Office VBAで32Bit版と64BitでDeclareステートメントの宣言を分ける方法 Office VBAで32Bit版と64BitでDeclareステートメントの宣言を分ける方法をご紹介します。







【PR】マジか?!「アレ」してるLINEスタンプっていったい・・・


Office 32Bit 版と 64Bit 版の違い

MS Office は、Version2010 より、32Bit 版と 64Bit 版がリリースされました。

64Bit 版 Office では、32Bit 版に比べて使用できるメモリ容量が大きくなり、2GB を超えるサイズのファイルを扱うことができるようになりました。
これに伴い、VBA も VBA7 (Microsoft Visual Basic for Applications 7.0) にバージョンアップされました。

64Bit 版では、ポインターやハンドルのサイズが 32Bit 版に比べて大きくなったため、Long 型を使用すると予期しないエラーが発生する可能性があります。
そのため、Office 2010 以降ではその問題に対応した新しいデータ型として、
LongPtr 型(ポインターデータ型)LongLong型(64Bit 数値型)が追加されています。
※型変換するための CLngPtr() や CLngLng() も追加されています。

64Bit 版では、Declare ステートメントを使って Windows API を呼び出す場合、これまで使っていた Long 型を適切な形で置き換える必要があります。
そうなると、32Bit 版なのか、64Bit 版なのかを判別する方法が必要になりますね。
Office 2010 以降、VBA7Win64 という条件付きコンパイル定数が追加されました。
VBA7 は VBA のバージョンを区別するもので、Win64 は 32Bit/64Bit を区別するために利用します。

また、64Bit 版では Declare ステートメントに PtrSafe 属性がないとコンパイル時にエラーが発生します。こちらのページで詳しく紹介しています。
[このプロジェクトのコードは、64ビット・・Declare ・・]エラー解決方法 Excel VBA 2010 2013


サンプルソース

それでは、実際のソースをみてみましょう。

#If VBA7 And Win64 Then
  ' 64Bit 版
  Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
#Else
  ' 32Bit 版
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
#End If

※32Bit 版/64Bit 版だけを区別する場合は #If Win64 Then を利用します。


参考サイト

・Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性
http://msdn.microsoft.com/ja-jp/library/office/ee691831(v=office.14).aspx


既存の 32Bit版 で作られた VBA プログラムは、その多くが 64Bit 版では動作しません。
いづれ 64Bit 版の波が訪れ移行されていくのでしょうが、現時点ではまだまだ多くの企業様で 32Bit 版が利用されているのも事実です。
64Bit 版の Office を導入する際は、この辺りの問題も含め、よく検討する必要があると思います。


追記

ご質問をいただいたので追記しておきます。
以下の画像は、Excel 64ビットでVBAのソースを開いた状態です。32ビットの記述は赤字でエラーのように表示されます。しかし、条件付きコンパイル関数のおかげで、32ビットの記述があってもコンパイルエラーにはなりません。

64ビット版VBAの表示

上図は64ビット版Excelで表示した場合。32ビット版の記述は赤字になるがコンパイルエラーにはならない。

このため、Excelを開いた直後から64ビット版のプログラムが利用できます。


おつかれさまでした。

LINEで送る
Pocket

この記事がお役に立ちましたら シェア をお願いいたします。

Office / VBAの勉強が思うように進まないときは!

Office / VBAの勉強が思うように進まないのであれば、プロに直接質問ができる プログラミングスクール を検討してみてはいかがでしょうか?プログラミングスクールに申し込めば、短期間で一定のスキルを身に着けることができます!

Office / VBAコースあり!未経験者にウケてる KENスクール パソコンスクール・パソコン教室 【KENスクール】個別指導のWeb-DTP・OA・IT PCスクール

理解度や学習ペースに合わせて、一人ひとりが納得して前進できる授業を提供してくれるのが特徴です。特に課題製作は現場さながらで、実務に即したものとなっていますので短期でのスキルアップが望めます。自宅学習のサポートも充実していて、授業内容をいつでもビデオで振り返ることができるのもうれしいですね。好きな時間に好きな場所で、無理なくスケジューリングできるので、仕事の忙しい方でも柔軟に学ぶことができますよ。

更にさらに、なんと 就職サポート をしてくれるというのですから驚きです!!

履歴書の書き方から面接指導、求人の紹介など、具体的な就職先まで提案してくれるんです!私も「もっと早く出会いたかったなぁー、こんなスクール」・・・って思っちゃいました^^

東京・神奈川・愛知・大阪を営業エリアとされています。
まずは気軽に 無料体験予約 に申し込んでみるのもアリですよ。


コメント - Thank you for the comment.

  1.  

    (先ほどのコメントはできれば削除してもらえると助かります。)

    条件付きコンパイル関数は、実際にエクセルの動作したとき(開いた直後から)でも使えるのでしょうか?

    返信

     
  2.  

    質問ありがとうございます。開いた直後から使えますよ。Excel 64ビットでVBAのソースを開いた時、32ビットエラー部分は赤字でエラーのように表示されます。これは、条件付きコンパイル関数のおかげで、32ビットの記述があってもコンパイルエラーにはなりません。このページの追記欄に画像を張っておきますのでご確認ください。

    返信

     

コメントを残す

お名前 (必須)
メールアドレス
(アドレスは公開されません)

コメント(必須)

Trackback URL