Saltar al contenido

Cómo convertir código VBA de 32 bits en código VBA de 64 bits

Solución:

Estos deberían funcionar en Excel de 64 bits

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

Si necesita que se ejecute en ambos, puede usar lo siguiente #If VBA7

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

Puede encontrar un buen recurso para las declaraciones de API de PtrSafe Win32 aquí: Win32API_PtrSafe.txt


No estoy muy seguro de la IIDFromString y AccessibleObjectFromWindow pero creo que deberían ser subs en lugar de functions. Y lpsz debiera ser String como abajo. ¿Quizás alguien pueda confirmar esto?

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)

Necesitamos hacer los siguientes dos cambios de código:

  1. Reemplace el tipo de datos “Long” por “LongPtr”, en todos los lugares del script
  2. Debe cambiar las Declaraciones de función privada como se muestra a continuación

    • ANTIGUO: Función de declaración privada GetTimeZoneInformation Lib “kernel32” (_ lpTimeZoneInformation como TIME_ZONE_INFORMATION) siempre que
    • NUEVO:

Función privada Declare PtrSafe GetTimeZoneInformation Lib “kernel32” (_ lpTimeZoneInformation como TIME_ZONE_INFORMATION) como LongPtr

Esto es trabajo para mí.

Gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *