Archive for 4月 19th, 2012

  1. Hello, Win32 API(VBA) World!

    Posted on 4月 19th, 2012 by cx20

    Win32 API(VBA)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は VBA(Microsoft Visual Basic for Applications)からの呼出し例である。

    ソースコード(Excel VBA / 32bit版)

    Declare Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
        ByVal hWnd As Long, _
        ByVal lpText As String, _
        ByVal lpCaption As String, _
        ByVal uType As Long _
    ) As Integer
     
    Sub Main()
        MessageBox 0, "Hello, Win32 API(VBA) World!", "Hello, World!", vbOKOnly
    End Sub

    64bit 版 VBA では Win32 API 使用時に PtrSafe を指定する必要がある。

    ソースコード(Excel VBA / 64bit版)

    Declare PtrSafe Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
        ByVal hWnd As Long, _
        ByVal lpText As String, _
        ByVal lpCaption As String, _
        ByVal uType As Long _
    ) As Integer
     
    Sub Main()
        MessageBox 0, "Hello, Win32 API(VBA) World!", "Hello, World!", vbOKOnly
    End Sub

    なお、PtrSfae 属性は Office 2010 からの機能である為、下位互換の為に以下の条件付きコンパイル属性を指定することが推奨されている。

    ソースコード(Excel VBA / 互換性を考慮した記述)

    #If VBA7 And Win64 Then
        Declare PtrSafe Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
            ByVal hWnd As Long, _
            ByVal lpText As String, _
            ByVal lpCaption As String, _
            ByVal uType As Long _
        ) As Integer
    #else
        Declare Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
            ByVal hWnd As Long, _
            ByVal lpText As String, _
            ByVal lpCaption As String, _
            ByVal uType As Long _
        ) As Integer
    #end if
     
    Sub Main()
        MessageBox 0, "Hello, Win32 API(VBA) World!", "Hello, World!", vbOKOnly
    End Sub

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API(VBA) World!
    ---------------------------
    OK   
    ---------------------------