2017-03-02 501 views
4

我試圖運行宏代碼,但由於我使用的是64位Excel 2016,因此此代碼無法工作。請幫我解決這個問題。如何將32位VBA代碼轉換爲64位VBA代碼

Private Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" _ 
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _ 
ByVal lpsz2 As String) As Long 

Private Declare Function IIDFromString Lib "ole32" _ 
(ByVal lpsz As Long, ByRef lpiid As GUID) As Long 

Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _ 
(ByVal hWnd As Long, ByVal dwId As Long, ByRef riid As GUID, _ 
ByRef ppvObject As Object) As Long 

回答

4

如果你需要運行兩個你可以使用下面的#If VBA7

#If VBA7 Then 
    '64 bit declares here 
#Else 
    '32 bit declares here 
#End If 

一個很好的資源,PTRSAFE Win32 API的聲明,這些應該在64位工作的Excel

Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ 
    (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, _ 
    ByVal lpsz2 As String) As LongPtr 

Private Declare PtrSafe Function IIDFromString Lib "ole32" _ 
    (ByVal lpsz As LongPtr, ByRef lpiid As GUID) As LongPtr 

Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" _ 
    (ByVal Hwnd As LongPtr, ByVal dwId As LongPtr, ByRef riid As GUID, _ 
    ByRef ppvObject As Object) As LongPtr 

可以在這裏找到:Win32API_PtrSafe.txt


我對IIDFromStringAccessibleObjectFromWindow不太確定,但我認爲他們應該是subs而不是functionslpsz應該是String,如下所示。也許有人可以證實這一點?

Private Declare PtrSafe Sub IIDFromString Lib "ole32" (_ 
    ByVal lpsz As String, ByRef lpiid As GUID) 

Private Declare PtrSafe Sub AccessibleObjectFromWindow Lib "oleacc" _ 
    (ByVal Hwnd As LongPtr, ByVal dwId As LongPtr, ByRef riid As GUID, _ 
    ByRef ppvObject As Object) 
+0

謝謝大家..這是非常有用的,它的工作。 – April