PR

Access VBAが突然動かなくなった? Office 64bit移行で発生する代表的なエラーと対処法

VBA
スポンサーリンク

Access管理担当者として悩んでいませんか

  • Accessを長年運用している担当者
  • Access 32bitから64bitへ移行する担当者
  • Copilotで生成したVBAコードが突然エラーになる担当者
  • Office更新後にVBAが動かなくなった担当者

本記事では、以下の観点から64bit移行について解説します。

  • なぜ突然動かなくなるのか
  • どのコードが危険なのか
  • 32bitと64bitの違い
  • 移行前に確認すべきポイント
  • Copilot生成コードの注意点

直面する問題

Accessシステムを長年運用していると、

ある日突然

コンパイルエラー

や

Declare ステートメントは

PtrSafe 属性である必要があります

というエラーが発生することがあります。

原因を調べると、

Windows更新

Office更新

Microsoft 365導入

PC入替

がきっかけになっているケースが少なくありません。

結論から言うと、

32bit時代のVBAコードが64bit Officeに対応していない

ことが原因です。

今回は実務でよく遭遇する64bit対応について整理します。


なぜ突然エラーになるのか

AccessのVBA自体が変わったわけではありません。

問題はOfficeのビット数です。

例えば、

旧PC

Office 2016 32bit

↓

新PC

Microsoft 365 64bit

という環境変更が発生すると、

今まで正常だったAPI宣言がコンパイルエラーになります。


よくあるエラーメッセージ

もっとも有名なのがこれです。

Declare ステートメントは

PtrSafe 属性である必要があります

例

Declare Function GetUserName Lib "advapi32.dll" _

Alias "GetUserNameA" _

(ByVal lpBuffer As String, _

nSize As Long) As Long

32bit環境では問題ありません。

しかし64bit環境ではエラーになります。


修正方法

64bit対応版です。

Declare PtrSafe Function GetUserName _

Lib "advapi32.dll" _

Alias "GetUserNameA" _

(ByVal lpBuffer As String, _

nSize As Long) As Long

まずは

PtrSafe

を追加します。

これが第一歩です。


PtrSafeだけでは直らない場合

実はここが重要です。

初心者向け記事では

PtrSafeを付ければOK

と書かれています。

しかし実務では不十分です。

例えばポインタを扱うAPIでは

Long

を

LongPtr

へ変更する必要があります。

例

#If VBA7 Then

Declare PtrSafe Function FindWindow _

Lib "user32" Alias "FindWindowA" _

(ByVal lpClassName As String, _

ByVal lpWindowName As String) _

As LongPtr

#Else

Declare Function FindWindow _

Lib "user32" Alias "FindWindowA" _

(ByVal lpClassName As String, _

ByVal lpWindowName As String) _

As Long

#End If

これが実務でよく使われる書き方です。


特に注意が必要なAPI

以下を利用している場合は要確認です。

FindWindow

GetWindowLong

SetWindowLong

ShellExecute

GetUserName

Sleep

CopyMemory

特に古いAccessシステムでは

画面制御

Excel操作

ファイル操作

で利用されていることがあります。


移行プロジェクトでよく起きる失敗

失敗① コンパイル確認をしていない

Accessは実行されるまでエラーが出ないコードがあります。

特に

数年前から実行していない機能

が危険です。

移行時は必ず

デバッグ

↓

VBAプロジェクトのコンパイル

を実施しましょう。


失敗② 開発環境だけで確認

開発PCで動いても安心できません。

利用者PCで

32bit

64bit

権限

が異なる場合があります。

本番環境での確認が必須です。


失敗③ Access Runtimeを考慮していない

配布先がRuntime利用の場合、

想定外の動作になるケースがあります。

特に社内展開しているシステムでは注意が必要です。


Copilotでコード変換できるのか

最近増えているのが、

既存VBAをCopilotへ貼り付けて修正する方法です。

例えば、

このVBAを

64bit対応へ修正してください。

PtrSafe

LongPtr

条件コンパイルも含めて

修正してください。

という依頼です。

かなり効率化できます。

ただし注意点があります。


Copilot生成コードの落とし穴

Copilotは高確率で

PtrSafe

を追加してくれます。

しかし、

Long

LongPtr

の判定までは誤ることがあります。

その結果、

コンパイル成功

↓

実行時異常

になる場合があります。

生成結果をそのまま採用せず、

API仕様を確認しましょう。


実務でおすすめの移行手順

Step1

まずAPI宣言を検索

Declare

で検索します。


Step2

64bit非対応箇所を抽出

PtrSafeなし

LongPtrなし

を確認します。


Step3

全機能コンパイル

デバッグ

↓

VBAプロジェクトのコンパイル

を実施します。


Step4

実際の業務シナリオを確認

以下を実行します。

CSV取込

Excel出力

PDF出力

メール送信

集計処理

既存機能を一通り試験します。


独自チェックリスト

移行前に確認したい項目です。

□ Office 64bitへ変更予定

□ Declare文が存在する

□ Windows APIを使用している

□ Access 2010以前から利用している

□ 開発者が退職済み

□ ドキュメントが残っていない

□ 「触ると壊れる」と言われている

3つ以上該当する場合は、

64bit対応の事前調査をおすすめします。


まとめ

Accessシステムの64bit対応では、

PtrSafe追加

だけで終わらないケースが多くあります。

重要なのは

  • API宣言の確認
  • LongPtrの見直し
  • 条件コンパイル利用
  • 本番環境での検証

です。

特に5年以上運用しているAccessシステムは、

将来的なPC更新やMicrosoft 365導入に備えて、

一度コンパイルチェックを実施しておくことをおすすめします。

コメント

タイトルとURLをコピーしました