2020年10月08日

いつの間にか 64Bit版 VBAへの移植(というかVBAソースコードの32Bit版との共用)は「無理」から「可能」になっていた

LongPtr がいい仕事してるという事が分かった。

Excel2010 以降の環境をターゲットにし、2007より古い環境は切り捨てる、という事でもあるけれども

VBAでWin32APIの64bit対応自動変換プログラムを作ってみた - えくせるちゅんちゅん

数年前まで手持ちの 32Bit版エクセルで動くマクロアドインを同じコードで
64Bit版ExcelVBA環境でも動かそうと、頑張っていた。
その中での一番の強敵は Win32APIの64ビット対応と、あとは MSCOMCTRL.ocx の参照設定である。このOCXが、当時は64Bit版にそもそも存在しなかったのだ。この時点であきらめていたんだけど。

2020年の今、それらは64Bit版にも用意されている。

そこで重い腰を上げ API対応に取り組んでみると、意外と簡単。これまで 条件付きコンパイル引数で VBA7 やら Win64やらで切り替えていた(そうするようにおすすめされていた)記述は、全く条件分岐させる必要がなく 1パターンの記述で(だいたいが)対処可能という事が分かった。

非常に大事な資料は Win32API_PtrSafe.txt 。まずは忠実にこのAPI宣言を コピーする。今までいい加減に Long だとか LongLongとか、Boolean とか書いていたところを改める。

Excel2010以降を対象にする限りは、32Bit環境でも PtrSafe宣言は 書いてあっても動く。
しかも LongPtr を書くと、32Bit環境では自動的にLong と解釈される。
つまり #If VBA7 で振り分ける必要がない。

一気に手持ちのマクロを改修した。 置き換えたAPI宣言が 手持ちの定義と違っていて動かなかったところが少しだけあったけど、そういう変な記述を見直すいい機会になった。

確実に64Bit対応するには、Excelを64Bit版導入して、ビルドエラーが出なくなるまで完全に問題を消し込むこと。思い込みで型を書き換えていってもどこかで間違える。

#余談
使用するOSのBit数も64Bit環境であることを前提にできるととても楽ちんだし、
さらにはOSについてもWindows10と決め打ちできるともっと楽だ、
Office2016以降だとするともっともっと簡単だ


・おすすめ楽天ショップ1:trendyimpact楽天市場店
・おすすめサプリショップ:iHerb.com
・おすすめ楽天ショップ2:上海問屋
Powered by さくらのブログ