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.
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.
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
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.
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 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