• 解説

    Access 97では2000以降にあるAddressOf演算子が使用できないので関数のアドレスが取得できません。
    このため、EnumWindows APIで使用するコールバック関数やSetWindowLong APIでWindowProcを置き換えるといったことができません。

    しかし、そんなことであきらめる雅ではありません。
    探しに探して海外で見つけました。

    VBA332.DLLに隠しAPIがあるようです。
    (EbGetExecutingProj, TipGetFunctionId, TipGetLpfnOfFunctionId)
    これらのAPIを使用しアドレスを取得します。

    流れは

    1. EbGetExecutingProjでプロジェクトハンドルを取得する
    2. TipGetFunctionIdでファンクションIDを取得する
    3. TipGetLpfnOfFunctionIdでファンクションアドレスを取得する

    といった感じになります。

  • サンプル(雅のコーディングスタイルにアレンジしています)

    標準モジュール

    Option Compare Database
    Option Explicit
    
        Private Declare Function EbGetExecutingProj Lib "vba332.dll" _
                       (ProjectHandle As Long) As Long
        Private Declare Function TipGetFunctionId Lib "vba332.dll" _
                       (ByVal ProjectHandle As Long, _
                        ByVal FunctionName As String, _
                        ByRef FunctionID As String) As Long
        Private Declare Function TipGetLpfnOfFunctionId Lib "vba332.dll" _
                       (ByVal ProjectHandle As Long, _
                        ByVal FunctionID As String, _
                        ByRef FunctionAddress As Long) As Long
    
    Public Function AddressOfValue(ByVal FunctionName As String) As Long
    
        Dim ProjectHandle                               As Long
        Dim FunctionID                                  As String
        Dim ReturnValue                                 As Long
        Dim UnicodeFunctionName                         As String
    
        Const NO_ERROR                                  As Long = 0
    
        EbGetExecutingProj ProjectHandle
    
        If ProjectHandle = 0 Then
            Exit Function
        End If
    
        UnicodeFunctionName = StrConv(FunctionName, vbUnicode)
    
        If TipGetFunctionId(ProjectHandle, UnicodeFunctionName, FunctionID) <> NO_ERROR Then
            Exit Function
        End If
    
        If TipGetLpfnOfFunctionId(ProjectHandle, FunctionID, ReturnValue) = NO_ERROR Then
            AddressOfValue = ReturnValue
        End If
    
    End Function
    

    使用方法は

        AddressValue = AddressOfValue("関数名")
    

    と、なります。

  • その他

    AccessのVBAおよびAPIの知識が必要です。

スポンサードリンク

説明がわからないなどありましたらお問い合わせでお知らせください。

ここに掲載された情報を使用したことによって発生した、いかなる損害に対しても
管理者である雅は一切責任を負いません。

スポンサードリンク