[VBA]エラー解消!
64ビット対応「Declare PtrSafe Function」の書き方と注意点

Declare PtrSafe Functionの使い方とエラー解決法

Excel VBAで外部ライブラリを使う際に登場する「Declare PtrSafe Function」。特に「PtrSafe」を付け忘れたりしてエラーになった経験はありませんか?この記事では、初心者の方にもわかりやすく、このコードの必要性、書き方、64ビット版Excelでの注意点などを解説します。


目次

  1. Declare PtrSafe Functionとは?
  2. PtrSafeの必要性 – なぜエラーが起きるのか
  3. Declare PtrSafe Functionの基本構文
  4. 32ビットと64ビットに両方に対応
  5. 実際の使い方例
  6. 使用時の注意点とトラブルシューティング
  7. よくある質問(FAQ)

1. Declare PtrSafe Functionとは?

**「Declare Function」**は、VBAで外部ライブラリ(DLL)の関数を呼び出す際に使われる宣言文です。

しかし、Excelの64ビット版が登場したことで、古い宣言文だけでは対応できなくなりました。そのために登場したのが「PtrSafe」というキーワードです。これにより、64ビット環境でも問題なく動作するようになります。


2. PtrSafeの必要性 – なぜエラーが起きるのか

Excelの32ビット版では、Declare文に「PtrSafe」がなくても動作します。しかし、64ビット版では**「PtrSafe」が必須**です。

エラー例:
64ビット環境で「PtrSafe」を省略した場合、以下のようなエラーが表示されます:

コンパイルエラー: PtrSafe キーワードが必要です。

コンパイルエラー: このプロジェクトは64ビットシステムで使用するため更新する必要があります。Declareステートメントの確認及び更新を行い、次にDeclareステートメントにPtrSafe属性を設定してください。

これにより、64ビット環境向けにVBAコードを更新する必要が出てきました。


3. Declare PtrSafe Functionの基本構文

以下が基本的な構文です:

Declare PtrSafe Function 関数名 Lib "ライブラリ名" (引数) As 戻り値の型

構文の詳細説明

  • Declare PtrSafe Function: 外部関数を安全に宣言するための記述。
  • Lib “ライブラリ名”: 使用するDLLの名前(例: “user32.dll”)。
  • (引数): 関数が受け取るパラメータ。
  • As 戻り値の型: 関数の戻り値のデータ型。

4. 32ビットと64ビット両方に対応

32ビットと64ビット両方で動作する汎用的なコードを書きたい場合、この基本の一文で対応可能です。

Declare PtrSafe Function 関数名 Lib "ライブラリ名" (引数) As 戻り値の型

「PtrSafe」は64ビット専用ではなく、32ビット環境でも問題なく動作します。そのため、全てのコードにPtrSafeを付けることを推奨します。


5. 実際の使い方例

例えば、「kernel32」のGetTickCount関数をVBAで呼び出す場合、以下のように記述します。

' GetTickCount関数を宣言 (ミリ秒単位で経過時間を取得)
Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long

Sub MeasureElapsedTime()

Dim startTime As Long
Dim endTime As Long
Dim elapsedTime As Double

' 開始時間を取得
 startTime = GetTickCount

' 処理: サンプルとしてループを実行
Dim i As Long
 For i = 1 To 1000
     DoEvents ' CPU負荷を軽減
 Next i

 ' 終了時間を取得
 endTime = GetTickCount

 ' 経過時間を計算 (ミリ秒 → 秒)
 elapsedTime = (endTime - startTime) / 1000 

 ' 経過時間を表示
 MsgBox "処理にかかった時間は " & elapsedTime & " 秒です。", vbInformation, "経過時間"

End Sub

コードのポイント

  1. GetTickCount関数を使って処理の経過時間を取得
    • GetTickCount 関数は、システムが起動してから経過したミリ秒を返します。この関数を利用することで、処理の開始時刻と終了時刻を取得し、その差分を計算することで処理時間を計測することができます。
  2. Declare PtrSafeで64ビット対応
    • 64ビット環境に対応するために PtrSafe を指定しています。これにより、64ビット版Excelでもエラーなく動作するようになります。
  3. 処理時間の計算
    • startTimeendTime でミリ秒単位の経過時間を取得し、その差を秒単位に変換して表示します。elapsedTime = (endTime - startTime) / 1000 で秒単位に変換しています。
  4. DoEventsを使ってCPU負荷を軽減
    • ループの中で DoEvents を使用しています。これにより、Excelのインターフェースが応答し続け、他の処理がブロックされることなく実行されます。特に長時間の処理や重い処理を行う際に役立ちます。





6. 使用時の注意点とトラブルシューティング

  1. 「PtrSafe」を付け忘れないこと
    64ビット環境で動作させるためには必須です。
  2. 「LongPtr」の使用
    64ビット環境ではポインタサイズが異なるため、ポインタ型(LongPtr)の使用が重要です。LongPtr は、32ビットおよび64ビットの両方で適切に動作する型です。

    注意点:
    Long を使うと、64ビット環境では誤動作する可能性があるため、LongPtr を使用することをお勧めします。
    ・引数や戻り値がポインタを使用する場合は、LongPtr を使います。

    例:
    Declare PtrSafe Function SomeFunction Lib “some.dll” (ByVal p As LongPtr) As LongPtr
  3. 32ビット環境でも動作するか確認する
    開発環境と実行環境が異なる場合があるため、双方での動作確認が必要です。

7. よくある質問(FAQ)

Q1. PtrSafeは64ビット専用ですか?
いいえ、32ビット環境でも動作します。そのため、全てのコードに「PtrSafe」を付けておくのがおすすめです。

Q2. 「LongPtr」と「Long」の違いは何ですか?
「LongPtr」は32ビット環境では「Long」、64ビット環境では「LongLong」にマップされます。ポインタ型に適した型です。

Q3. エラーが出た場合はどうすればいいですか?
以下を確認してください:

  • 「PtrSafe」を付け忘れていないか。
  • 関数の引数や戻り値の型が正しいか。
  • 使用するDLLが正しい場所に存在するか。

まとめ

「Declare PtrSafe Function」は、64ビット環境対応に欠かせない重要な要素です。特に64ビット環境が主流となっている現在では、全てのDeclare文に「PtrSafe」を付けることが推奨されます。この記事の内容を参考に、エラーを回避し、効率的なVBA開発を進めてください。

記事が役に立ったら、ぜひシェアしてください!
VBA初心者の方やエラーで困っている方の助けになれば幸いです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です