Declare 構文の基本

VBA — Declare 構文
' 関数を宣言する場合
Declare [PtrSafe] Function 関数名 Lib "DLL名" [Alias "実際の関数名"] _
        ([引数リスト]) As 戻り値型

' Sub(戻り値なし)を宣言する場合
Declare [PtrSafe] Sub 関数名 Lib "DLL名" [Alias "実際の関数名"] _
        ([引数リスト])

64bit 対応:PtrSafe と LongPtr

項目32bit VBA64bit VBA(Excel 2010以降)
PtrSafe不要(書いても無視)必須(ないとコンパイルエラー)
ポインタ型LongLongPtr(32bitでは Long, 64bitでは LongLong相当)
ハンドル型LongLongPtr
VBA — 32bit/64bit 両対応の書き方
' #If VBA7 で 64bit VBA を判定
#If VBA7 Then
    ' 64bit Excel 2010 以降
    Declare PtrSafe Function Sleep Lib "kernel32" (ByVal ms As Long): End Declare
#Else
    ' 32bit(旧環境)
    Declare Function Sleep Lib "kernel32" (ByVal ms As Long): End Declare
#End If

よく使うAPI宣言集

VBA — よく使うAPI宣言(64bit対応)
Option Explicit

' ── スリープ(ミリ秒単位)──
#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

' ── ファイルを関連付けアプリで開く ──
#If VBA7 Then
    Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
         ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
#Else
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
         ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If

' ── ウィンドウハンドル取得 ──
#If VBA7 Then
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If

使用例:スリープ・ファイルを開く

VBA — API 使用例
Sub ApiUsageExamples()
    ' 2秒待機(Waitより精度が高い)
    Sleep 2000
    Debug.Print "2秒後"

    ' PDF をデフォルトビューアで開く
    ShellExecute 0, "Open", "C:\data\report.pdf", vbNullString, vbNullString, 1
End Sub

注意事項

⚠️ APIの誤使用はExcelごとクラッシュする

引数の型ミス・ポインタの渡し方を間違えると、VBAではなくExcelプロセス自体がクラッシュします。必ず公式ドキュメントで引数の型を確認し、テスト環境で十分に検証してください。

まとめ

Win32 APIを使うと VBA 標準機能の限界(精度・OS機能へのアクセス)を突破できます。64bit 対応は #If VBA7 + PtrSafe + LongPtr の3点セットが定石です。

次の章では…

PART 14 では PowerShellとの連携 を解説します。WScript.Shell でVBAからPowerShellコマンドを呼び出すパターンを紹介します。

→ PART 14 — PowerShellとの連携へ