スポンサーリンク
VBAツールで「メモリが不足しています」と表示されたり、アプリが落ちたり、クラッシュしたりするようになったら、VBAツールのソースが64bit版にきちんと対応できていない可能性が考えられます。
そこで今回は、64bit版に対応させる際に陥りがちな危険事例と、その対処法についてお話したいと思います。そのような場面に直面した方にとって、この記事が参考になれば嬉しいです。
こんなときは気をつけよう~危険事例~
最近はMicrosoft Officeを32bit版から64bit版に変更することが多くなってきました。
そうすると、今まで32bit版のAccess、Excel、Word、PowerPointで作成していたツールを、64bit版でも正しく動作するように修正する必要が出てきます。
その修正作業の中でも、64bit版Officeの導入されたPCでツールを実行したり、「VBAProjectのコンパイル」を行い、エラーになった箇所をコード上で直したりする作業は危険が伴います。より具体的な危険事例を2つご紹介します。
事例1:
「VBAProjectのコンパイル」を行った際、「Declare Function FindWindow ・・・」の部分でエラーになり、「PtrSafe」を付けて「Declare PtrSafe Function FindWindow」に変更し、コンパイルを行うとエラーは発生しなかった。また、動作させてエラーも発生したなかったため、Office 64bit版対応を完了とした。
事例2:
Windows API 宣言時に「As Long」を「As LongPtr」に変更し、事例1と同様にエラーの有無を確認し、対応を完了とした。
どうして危険なの?
このような確認の方法で、簡単に「VBAツールを32bit版から64bit版に変更できた」と思い込むことが、どうして危険なのか。続いて、その理由についてお話します。
理由は大きく3つあります。
理由1:
64bit版PCで「Declare PtrSafe」のように「PtrSafe」の有無の確認をすると、表面上の確認だけが行われ、コンパイル時には、64bit版で文法的に「PtrSafe」が付いているか確認しているだけとなってしまうから。
理由2:
コンパイル時に問題がなくても、大量のデータを扱う処理では、エラーになることが想定されるから。32bitと64bitでは扱えるメモリが違うため、32bitの変数に64bitの値を代入するとクラッシュする。
理由3:
Windows APIを用いていないコードであれば問題はないと思うが、Windows APIを用いたコードでは問題が発生することが想定される。Windows APIでは32bitで利用されることもあるため、64bitで格納された変数を引数にして、そのAPIを使おうとするとエラーが起きたりクラッシュしたりする。これはコンパイルでは確認できないので、問題があることに気付きにくい。
これらの理由から、事例1、事例2で紹介したような確認方法で、「64bit版に変更対応が完了した」と断定することは危険だと言えます。
スポンサーリンク
おすすめの対応方法
そこで最後に、64bit版に正しく対応させるおすすめの方法をご紹介したいと思います。
1.Microsoft365というクラウドサービスサイトに移動し、次の画像のように「Office2010Win32API_PtrSafe.exe」を取得した後、「Win32API_PtrSafe.TXT」を取得する。
2.「Win32API_PtrSafe.TXT」を開き、VBAツールで宣言されているWindows APIのAPI名を検索し、コピー&ペーストする。コピーしてきたものをツールに反映させる。
3.ウィンドウハンドル(Window Handle、Hwnd)やポインターを利用しているものの型が、コード上で「LongPtr型」になっているか確認する。
4.「APIの呼び出し元の変数の型が正しいか」、「Long型はLongPtr型に調査してから変更が適切か」など、ツールで利用しているAPIに関連があるものについて確認する。
備考
この理解をより深めたいという方には、下記の参考サイトをご確認頂ければと思います。
その他
検索キーボード:Win32API、32ビットバージョン、64ビットバージョン、Windowハンドル、オフィス、アプリ、アクセス、エクセル、ワード、パワーポイント
参考サイト/関連サイト
WinAPIの64bit化で出てくるPtrSafe、LongLong、LongPtrってなんなのさ? - えくせるちゅんちゅん
【VBA】64ビット版対応って結局何をすればいいの? - 経理屋とVBAの日記
WindowsAPI をOffice64bit版または32bit版のVBAで使うには - hatena chips
VBAでWin32APIを使う方法と定義一式 | Excel作業をVBAで効率化
VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 - Office 2010,2013 - ホームページ制作のサカエン Developer's Blog
Office の 32 ビット バージョンと 64 ビット バージョン間の互換性
#IF VBA7 ってどういうときに必要なのか? - Qiita
【エクセルVBA】Windows APIで外部プログラムを呼び出すための第一歩
64Bit版OfficeでVBAを扱う場合の注意事項 - エクセル塾
64bit 32Bit Access Excel VBA WinAPIを使用してフォームに最小化、最大化ボタンをつける - Qiita
VBA Windows APIを使う手順(調べる→宣言する→使う) - ゆんの業務改善ブログ
条件付きコンパイル(32ビット64ビットの互換性)|VBA技術解説
最後までお付き合いいただきありがとうございます!
この情報が誰かの役にたてれば幸いです。