VBAいままでOfficeの32bit版のVBAでWindowsAPIを使用していたコードが、Officeを64bit版に変更するとコンパイルエラーになり使えないということが発生します。64bit版に対応させるためには、WindowsAPIのDeclareステートメントの宣言を書き換える必要があります。WEB検索するとMS公式のものも含めていろいろ情報が見つかりますが、分かりにくかったり、不正確な情報も多々あります。そこでhatenaなりに分かり安く整理してみました。詳しい解説は後回しにして、結論を先に書きます。いうAPIを例に説明します。旧来の宣言は下記になります。Longこれを、64bitにも対応させるには、下記のように書き換えます。Long変更箇所は、下記の2点です。ウィンドウハンドル、ポインタを表す関数の引数、戻り値の型は、Long型からLongPtr型に変更する。これで、64bitでも32bitでも動作します。使ってかき分けるコードを提示しているサイトがありますが、かき分ける必要はありません。そこに64bit対応のAPI宣言が網羅されてますので、それを開いて検索するといいでしょう。置いておきましたので、クリックしてブラウザの検索機能で検索すると簡単です。Declare文がヒットしますのでそれをコピペすればOKです。使用する定数宣言もヒットするので、これもコピペしておきます。(APIによってない場合もあります。-264bit版と32bit版で宣言を変更する必要があるAPI通常は64bit版と32bit版で共通の宣言でいいのですが、例外的に分ける必要があるAPIがあります。検索すると、下記がヒットします。いうのは、条件付きコンパイルというもので、コンパイル時に条件に合ったものだけ有効にするというものです。64bit版の時のみ有効という意味になります。代用するという意味になります。以上で、Office2010以降のVBAでAPIを使う場合の話は終了です。2007以前は使用しないという場合は以下は読む必要はありません。Office2007以前の場合Office2007は2017年に延長サポートも既に終了しています。サポート終了のものを使い続けるのは、セキュリティ上非常に危険なのでやめるべきです。しても使わざるをえない事情がなるなら、条件付きコンパイルを使って2007以前に対応できるように宣言する必要があります。変更したものを記述します。以降という意味になります。Office2010以降に付属してくるVBAは7.0以降になります。VBA7には64bit版と32bit版があります。2007以前はVBA6になります。これは32bit版のみです。切り分けるというコードをみかけます。これでもエラーなく動作はします。VBA7.0以降かつ64bit版という意味になりますが、64bit版はVBA7.0以降しかないで冗長な条件です。64bit版と32bit版で異なる宣言が必要な場合に使用するので、このような用途(VBA6に対応させる)では使用すべきではないです。下記のように使い分けるべきであるということです。Ifなぜ、VBA7では64bit版と32bit版で共通の宣言でいいのかここからは、ややこしいので興味のある方のみ読んでいただければ結構です。いう関数を使えるようにする、という意味になります。いう関数を、GetWindowLongPtrという別名で使えるようにする、という意味になります。いうファイルが実体です。(APIのdllファイルは他にもあります。Windows\System32フォルダはパスか通っているので省略することができます。32bitOSの場合は、32bit版のAPI(dllファイル)が上記のフォルダーにあります。64bitOSの場合はというと、やはりWindows\System32フォルダに64bit版のAPI(dllファイル)があります。64bitなのになぜかSystem32です。互換性のためにそうしたのでしょう。64bitOS上の64bitアプリケーションから使う場合はここを参照すればいいです。64bitOS上の32bitアプリケーションからAPIを使用するにはどうしましょうか。32bitアプリケーションから、64bit版APIは使えるのでしょうか。32bitなのに64、なんとややこしい。64bitOS上で32bitアプリケーションを動かすための仕組みということです。用語「WOW64」の意味を何となく説明しています。https://wa3.i-3-i.info/word12434.htmlもっと詳しい説明をという場合は、下記を参照。OSでも32bitアプリケーションのサポートが必須。...https://www.atmarkit.co.jp/ait/articles/1007/01/news131.html32bit版OSをエミュレーションするための環境を作成してそこで32bitアプリケーションを実行するという複雑なことをしています。いう仕組みがSYSWOW64フォルダへリダイレクト(誘導)してくれるわけです。64bitアプリから64bit版のAPIが、32bitアプリからは32bit版のAPIが呼び出され、どちらも正常に使用できるわけです。64bit版にも対応してますよという宣言で、64bitVBAではこれがないとコンパイルエラーになります。32bitVBAでは意味は持たないので、ないのと同意になります。バイトの数値だか、32bitVBAでは4バイトの数値です。4バイトの数値とはすなわちLong型です。Longと同義ということです。32bitVBA上でエラーなく使用できます。挿入し、ウィンドウハンドル、ポインタを表す関数の引数、戻り値はLongPtr型にする。Win32API_PtrSafe.TXTに64bit/32bit両対応のAPI宣言が網羅さているのでそれを参照するとよい。Office2007以前には対応していない。...VBAで変数宣言をまだプロシージャの先頭にまとめてしてますか?hatenaも1年前までは変数をプロシージャの先頭にまとめて記述してました。Office64bit版と32bit版のVBAで共用するための「条件付きコンパイル」について体系的に整理されており、大変参考になりました。下記サイトに記載されている内容も、この記事を読んだ後だと非常に良く理解できます。https://excel-ubara.com/excelvba4/EXCEL269.html今後も「hatena19さん」からご指導いただきたいと思います。旧ブログにもVBAの記事が多数ありますのでご参考にどうぞ。コメントをキャンセルメールアドレスが公開されることはありません。