古いExcelで作られたVBAの内容に処理を追加して欲しいという依頼がありました。
VBAについては、ほとんど仕様も変わっていないので古くても問題ないだろうと思っていたところ
「このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントの確認および更新を行い、次にDeclareステートメントに PtrSafe 属性を設定してください。」
というメッセージが表示されVBAが動きません。
目次
「このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります」原因は?
このメッセージについて調べたところ、
「PtrSafe キーワードを含む Declare ステートメントが推奨される構文です。 64 ビットの数量を格納する必要がある Declare ステートメント (パラメーターと戻り値) のすべてのデータ型が更新され、ポインターとハンドルに LongLongまたは LongPtrを使用した後にのみ、32 ビットおよび 64 ビットプラットフォームの VBA バージョン 7 の開発環境で PtrSafe を含むステートメントが正しく動作します。 VBA バージョン 6 以前との下位互換性を確保するには、次の構造を使用します。」
というこでした。
つまり
「64ビットのVBA バージョン 7を使うときは、DeclareにはPtrSafeを付けろ」
ということらしいです。
なんのこっちゃ良くわからないのですが、PtrSafeを付ければ安全ですということなのか?
※Declareについては、簡単にいうと動的リンクライブラリ(DLL)をVBAなどから使うための宣言に使用します。
対応方法は?
実際の対応方法については簡単です。
こちらに記載されている内容に修正するだけで終わります。
Declare Sub → Declare PtrSafe Sub
Declare Function → Declare PtrSafe Function
これだけで正常に動作するようです。
VBA バージョン 6 以前も使う場合は
#If VBA7 Then
Declare PtrSafe Sub…
#Else
Declare Sub…
#EndIf
で分ける必要がある問うことみたいですね。
まとめ
こんかいの件については、VBAでDeclareを使用することが、ほとんどなかったので全く知りませんでした。
ただ、これからも「昔作ったVBAのプログラムをそのまま使いたい」という要望はあると思います。
VBAの書き方自体はほとんど変わっていないのですが、たまにこういう仕様変更もあるので焦らずに対応したいですね。