Hacer macros compatibles con Excel de 32 y 64 bits

Al momento de crear nuestras macros deberemos tener presente si éstas se correrán sobre Excel de 32 bits o 64 bits.

Hay que tener presente que si tenemos Excel de 32 bits, éste correra perfectamente sobre Windows de 32 y 64 bits, pero si nuestro Excel es de 64 bits, sólo podrá ser instalado en Windows de 64 bits.

Para determinar si tenemos Windows de 32 o 64 bits deberemos ir nuestro Panel de Control y buscamos Sistema. O para más rápido presionamos la combinación de teclas Windows + Pausa.

Esta sección de Windows te dirá si tu equipo es capaz de soportar Windows de 64 bits y qué versión tienes instalada.

Determinar la versión de Excel (Office)

Para saber qué versión de Excel si fuera Excel 2007 o 2010 se elige la opción Ayuda de la pestaña Archivo o botón de Office en 2007 y mostrará algo similar a la Figura 1.

image

Figura 1. En la opción Ayuda vemos que versión de Excel tenemos instalado.

En Excel 2013 nos vamos a la oción Cuenta de la pestaña Archivo y presionamos el botón que dice Acerca de Excel. Como se muestra en la Figura 2.

image

Figura 2. En la opción Cuenta en Excel 2013 vemos la versión de Office.

Macro para saber la versión de Excel (Office) instalada

Con los pasos anteriores podemos saber la versión de Office de nuestro Sistema, pero si eres de lo que quieren más, también podemos validarlo mediante una macro. Como tal no hay una propiedad que nos digas cuál es la versión que tenemos instalada, pero la siguiente macro cumple con el propósito.

Sub EsOffice64Bits()
'
#If VBA7 And Win64 Then
    Office64 = True
#Else
    Office4 = False
#End If
'
If Office64 Then
    MsgBox "Tienes instalado Office de 64 bits.", vbInformation, "EXCELeINFO"
Else
    MsgBox "Tienes instalado Office de 32 bits.", vbInformation, "EXCELeINFO"
End If
'
End Sub

Nota: es importante usar el caracter # tal como se muestra.

Macros compatibles con Excel de 32 y 64 bits

Un archivo de Excel creado en la versión de 64 bits puede funcionar perfectamente en la versión de 64 bits y vicerversa.

El tema lo tenemos cuando programamos macros. Si nuestras macros hacen llamadas a funciones de Windows debemos hacer modificaciones al momento de declararlas.

Por ejemplo, en EXCELeINFO add-in, en la sección Ejecutar, mandamos llamar aplicaciones de Windows como Bloc de Notas o la Calculadora. La función de Windows que mando llamar es ShellExecute.

Para hacerla compatible con Excel de 32 y 64 bits, primero le indico a la macro que detecte la versión de Excel para posteriormente hacer la declaración correcta de la función. Tal como se muestra en el siguiente código.

'Validamos la versión de Office
#If VBA7 And Win64 Then
    'Si es de 64 bits
    Private 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
    'Si es de 32 bits
    Private 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

Para ver una lista sobre las diferentes funciones y cómo declarlas les recomiendo visitar el sitio de Jan Karel Pieterse, JKP.

Ejemplo de formulario de Excel vba con botones de maximizar y minimizar

Para ejemplicar este tema, vamos a repasar los siguiente artículos:

Ya antes había publicado una macro para poner los botones de minimizar y maximizar en un formulario, pero sólo era compatible con Excel de 32 bits. Ahora, tomando de refencia el mismo código, lo adecuamos para que sea compatible con Excel de 64 bits.

Al momento de ejecutar el formulario veremos los botones antes mencionados, además de mostrarse una leyenda informativa sobre nuestra versión de Office.

image

Figura 3. Macros de Excel compatibles con versiones de 32 y 64 bits.

Código de la macro

Para ejecutar el formulario usamos:

Private Sub CommandButton1_Click()
UserForm1.Show
End Sub

En el código del formulario hacemos la declaración de variables.

Option Explicit
'
'Declaramos funciones
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function FindWindow Lib "USER32" _
    Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function FindWindow Lib "USER32" _
    Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
'
'
#If VBA7 And Win64 Then
    #If VBA7 Then
        #If Win64 Then
            Private Declare PtrSafe Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongPtrA" _
            (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #Else
            Private Declare Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongA" _
            (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #End If
    #Else
        Private Declare Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongA" _
        (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    #End If
#Else
    Private Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#End If
'
'
#If VBA7 And Win64 Then
    #If VBA7 Then
        #If Win64 Then
            Private Declare PtrSafe Function GetWindowLongPtr Lib "USER32" _
            Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
        #Else
            Private Declare PtrSafe Function GetWindowLongPtr Lib "USER32" _
            Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
        #End If
    #Else
        Private Declare Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongA" _
        (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    #End If
#Else
    Private Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
#End If
'
'
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As LongPtr
#Else
    Private Declare Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As Long
#End If
'
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const GWL_STYLE As Long = (-16)

Al momento de iniciar el formulario, ejecutamos esta macro:

Private Sub UserForm_Initialize()
Dim Windows64 As Boolean
'
'Validamos la versión de Office
#If VBA7 And Win64 Then
    Dim lngMyHandle As LongPtr, lngCurrentStyle As LongPtr, lngNewStyle As LongPtr
#Else
    Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
#End If
'
If Application.Version < 9 Then
    lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
Else
    lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
End If
'
#If VBA7 And Win64 Then
    lngCurrentStyle = GetWindowLongPtr(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLongPtr lngMyHandle, GWL_STYLE, lngNewStyle
    '
#Else
    lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
#End If
'
#If Win64 Then
    Windows64 = True
#Else
    Windows64 = False
#End If
'
If Windows64 Then
    Me.Label1.Caption = "Office 64 bits"
Else
    Me.Label1.Caption = "Office 32 bits"
End If
End Sub

Anexos

:: Descargar el ejemplo Macros compatibles con Excel de 32 y 64 bits.rar

You may also like...

5 Responses

  1. manuel says:

    Hola Yo tengo un problema con ListBox1_DblClick y TextBox1_Change, originalmente se utilizaba en una maquina de 32bit con office 2010 32 bits, pero al renovarse el equipo la maquina nueva es de 64 bits y el office sigue siendo de 32 bits pero ya no funciona el codigo, lo volvi a probar en una maquina 32 bits y si funciona el problema es cuando se usa en una pc de 64 bits aun teniendo instalado el office de 32 bits como se puede corregir eso?

  2. JoaoM says:

    La macro que está en Macros compatibles con Excel de 32 y 64 bits

    ‘Validamos la versión de Office
    #If VBA7 And Win64 Then
    ‘Si es de 64 bits
    Private 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
    ‘Si es de 32 bits
    Private 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

    ¿Es suficiente para correr una macro x86 en x64? y en donde se coloca? ¿Modulo? Codigo del formulario?

  3. Luis Fernando says:

    hay un error que no logro controlar al hacer macros con este codigo que señalas, al guardar la macro en un maquina con office de 64 señala el error que esas declaraciones (las que aplican para 32) están incorrectas… como haces tu para que no te salga ese error que a la vez resalta en rojo las declaraciones para 32?

  4. JoaoM says:

    Podrias dfecirnos (comentar la macro) cual la parte(funciones) que valida Excel (si es de 32 o 64)

  5. JoaoM says:

    No he recibido respuesta para SOLO las APIs para que las macros funcionen en x64 y x86 de office

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: