Compatibilidad entre versiones de 32 y 64 bits de Office 2010

Resumen: para clientes que trabajan con 2 GB o más de datos, Microsoft Office 2010 ahora se encuentra disponible en una versión de 64 bits. En este artículo se tratan problemas sobre la compatibilidad de la versión de 32 bits con la nueva versión de 64 bits y aplicaciones heredadas de Office de 32 bits y sus soluciones (7 páginas impresas).

Última modificación: viernes, 24 de abril de 2015

Hace referencia a: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Visual Basic for Applications 7.0 (VBA 7.0) | Word 2010

En este artículo
Introducción a las versiones de 32 y 64 bits de Microsoft Office 2010
Comparación de los sistemas de 32 bits con los de 64 bits
Introducción a la base de código VBA 7
Compatibilidad de controles ActiveX y complementos COM
Compatibilidad de la interfaz de programación de aplicaciones
Uso de atributos de compilación condicional
Preguntas más frecuentes
Conclusión
Recursos adicionales

Applies to:   Microsoft Office 2010

Publicado:   marzo de 2010

Proporcionado por: Microsoft Corporation

Contenido

  • Introducción a las versiones de 32 y 64 bits de Microsoft Office 2010

  • Comparación de los sistemas de 32 bits con los de 64 bits

  • Introducción a la base de código VBA 7

  • Compatibilidad de controles ActiveX y complementos COM

  • Compatibilidad de la interfaz de programación de aplicaciones

  • Uso de atributos de compilación condicional

  • Preguntas más frecuentes

  • Conclusión

  • Recursos adicionales

Introducción a las versiones de 32 y 64 bits de Microsoft Office 2010

Microsoft Office 2010 se encuentra disponible en versiones tanto de 32 como de 64 bits. La versión de 64 bits permite trabajar con conjuntos de datos mucho mayores. Esto cobra especial relevancia cuando se trabaja con números grandes en Microsoft Excel 2010.

Con la introducción de la nueva versión de 64 bits de Microsoft Office 2010, se lanza una nueva versión de Microsoft Visual Basic para Aplicaciones (VBA), conocida como Microsoft Visual Basic para Aplicaciones 7.0 (VBA 7), para que funcione tanto con aplicaciones de 32 como de 64 bits. Resulta importante destacar que los cambios que se tratan en este artículo se aplican solo a la versión de 64 bits de Microsoft Office 2010. Con la versión de 32 bits de Office 2010, es posible usar soluciones incorporadas en versiones anteriores de Microsoft Office sin modificaciones.

Nota

En una instalación predeterminada de Office 2010, se instala la versión de 32 bits, incluso en sistemas de 64 bits. Debe seleccionar explícitamente la opción de instalación de la versión de 64 bits de Office 2010.

En VBA 7, debe actualizar las instrucciones existentes de la interfaz de programación de aplicaciones (API) de Windows (instrucciones Declare) para que funcionen con la versión de 64 bits. Además, debe actualizar los punteros de dirección y los identificadores de ventana en tipos definidos por el usuario que se usan en estas instrucciones. Esto se analiza en mayor detalle en este artículo, al igual que los problemas de compatibilidad entre las versiones de 32 y 64 bits de Office 2010 y las soluciones sugeridas.

Comparación de los sistemas de 32 bits con los de 64 bits

Las aplicaciones incorporadas con la versión de 64 bits de Office 2010 pueden hacer referencia a espacios de direcciones más grandes y, por lo tanto, ofrecen la oportunidad de usar más memoria física que antes, lo que reduce potencialmente la sobrecarga al guardar y extraer datos en la memoria física.

Además de hacer referencia a ubicaciones específicas (también conocidas como punteros) en la memoria física que usa una aplicación para almacenar datos o almacenar instrucciones de programación, también se pueden usar direcciones para hacer referencia a identificadores de ventana (conocidos como identificadores). El uso de un sistema de 32 ó 64 bits es lo que determina el tamaño (en bytes) del puntero o identificador.

Existen dos problemas fundamentales cuando se ejecutan soluciones existentes con la versión de 64 bits de Office 2010:

  • Los procesos de 64 bits nativos en Office 2010 no pueden cargar archivos binarios de 32 bits. Este será un problema habitual cuando se tengan ya controles Microsoft ActiveX y complementos.

  • Anteriormente, VBA no tenía un tipo de datos de puntero y, debido a esto, los desarrolladores usaban variables de 32 bits para almacenar punteros e identificadores. Estas variables ahora truncan los valores de 64 bits que devuelven las llamadas de API cuando usan instrucciones Declare.

Introducción a la base de código VBA 7

VBA 7 es una nueva base de código, que reemplaza a la versión anterior de VBA. Esta nueva base existe tanto para las versiones de 32 bits como de 64 bits de Office 2010. Proporciona dos constantes de compilación condicional: VBA7 y Win64. La constante VBA7 ayuda a garantizar la compatibilidad con versiones anteriores del código al probar si la aplicación está usando VBA 7 o la versión anterior de VBA. La constante Win64 se usa para probar si el código se está ejecutando como 32 bits o 64 bits. Estas dos constantes de compilación se detallan más adelante en este artículo.

Con ciertas excepciones que se muestran en otras partes de este artículo, las macros en un documento (también incluye libros y presentaciones) que se usaron con la versión de 32 bits de la aplicación funcionará cuando el documento se cargue en la versión de 64 bits de la misma aplicación.

Compatibilidad de controles ActiveX y complementos COM

Los controles ActiveX de 32 bits existentes, tanto de terceros como de Microsoft, no son compatibles con la versión de 64 bits de Office 2010. En el caso de controles ActiveX y objetos COM, existen tres soluciones posibles:

  • Si se dispone del código fuente, puede generar una versión de 64 bits.

  • Puede ponerse en contacto con el proveedor para obtener una versión actualizada.

  • Puede buscar una solución alternativa.

Los procesos de 64 bits nativos de Office 2010 no pueden cargar binarios de 32 bits. Incluye controles comunes de MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) y los controles de MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar). Estos controles se instalaron en versiones anteriores de Microsoft Office y se instalaron con Office 2010 de 32 bits. Se debe encontrar una solución alternativa para las soluciones VBA de Microsoft Office existentes que usan estos controles cuando el código se migra a Office 2010 de 64 bits. Office 2010 de 64 bits no proporciona versiones de 64 bits de los controles comunes.

Compatibilidad de la interfaz de programación de aplicaciones

La combinación de VBA y bibliotecas de tipos le proporciona una gran funcionalidad para crear aplicaciones de Microsoft Office. Sin embargo, a veces, debe comunicarse directamente con el sistema operativo del equipo y otros componentes, como cuando administra memoria o procesos, cuando trabaja con la interfaz de usuario, como ventanas y controles, o cuando modifica el Registro de Windows. En estos casos, la mejor opción es usar una de las funciones externas que están integradas en archivos de biblioteca de vínculos dinámicos (DLL). Para ello, en VBA se realizan llamadas de API mediante el uso de instrucciones Declare.

Nota

Microsoft proporciona un archivo Win32API.txt que contiene 1.500 instrucciones Declarar y una herramienta para cortar y pegar la instrucción Declare que desea incluir en el código. Sin embargo, estas instrucciones son para sistemas de 32 bits y deben convertirse a 64 bits usando la información que se trata más adelante en este artículo. Las instrucciones Declare existentes no se van a compilar en VBA de 64 bits hasta que no sean marcados como seguras para 64 bits por el atributo PtrSafe. Puede encontrar ejemplos de este tipo de conversión en el sitio web del MVP (Profesional más valioso) de Excel Jan Karel Pieterse en: http://www.jkp-ads.com/articles/apideclarations.asp.

El Manual del usuario del Inspector de compatibilidad de códigos de Microsoft Office es una herramienta útil para inspeccionar la sintaxis de instrucciones Declare de API para el atributo PtrSafe, de ser necesario, y el tipo de retorno apropiado.

Las instrucciones Declare se parecen a una de las siguientes, dependiendo de si llama a una subrutina (que no tiene valor devuelto) o a una función (que sí tiene un valor devuelto).

Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type

La función SubName o FunctionName se reemplaza con el nombre real del procedimiento en el archivo DLL y representa el nombre que se usa cuando el procedimiento se llama desde el código VBA. Si lo desea, también puede especificar un argumento AliasName para el nombre del procedimiento. El nombre del archivo DLL que contiene el procedimiento que se va a llamar viene después de la palabra clave Lib. Finalmente, la lista de argumentos contiene los parámetros y los tipos de datos que deben pasarse al procedimiento.

La instrucción Declare siguiente abre una subclave en el Registro de Windows y reemplaza su valor.

Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

La entrada de Windows.h (identificador de ventana) para la función RegOpenKeyA es la siguiente:

LONG RegOpenKeyA ( HKEY hKey, LPCSTR lpSubKey, HKEY *phkResult );

En Microsoft Visual C y Microsoft Visual C++, el ejemplo anterior se compila correctamente para 32 bits y 64 bits. Esto se debe a que HKEY está definido como puntero, cuyo tamaño refleja el tamaño de memoria de la plataforma en la que está compilado el código.

En versiones anteriores de VBA, no había un tipo específico de datos de puntero, de manera que se usaba el tipo de datos Long. Además, debido a que el tipo de datos Long siempre es de 32 bits, este se interrumpe cuando se usa en un sistema con memoria de 64 bits, ya que los 32 bits superiores pueden truncarse o pueden sobrescribir otras direcciones de memoria. Cualquiera de esas situaciones puede dar como resultado un comportamiento impredecible o bloqueos del sistema.

Para resolver esto, VBA ahora contiene un tipo de datos de puntero verdadero: LongPtr. Este nuevo tipo de datos permite escribir la instrucción Declare original correctamente como:

Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long

Este tipo de datos y el nuevo atributo PtrSafe permiten usar esta instrucción Declare en sistemas de 32 o 64 bits. El atributo PtrSafe indica al compilador VBA que la instrucción Declare está dirigida para la versión de 64 bits de Office 2010. Sin este atributo, el uso de la instrucción Declare en un sistema de 64 bits dará como resultado un error de tiempo de compilación. Tenga en cuenta que el atributo PtrSafe es opcional en la versión de 32 bits de Office 2010. Esto hace posible que las instrucciones Declare existentes funcionen como siempre lo han hecho.

La siguiente tabla proporciona más información sobre el nuevo calificador y el tipo de datos que ya se han analizado, así como otro tipo de datos, dos operadores de conversión y tres funciones.

Tipo

Elemento

Descripción

Calificador

PtrSafe

Indica que la instrucción Declare es compatible con 64 bits. Este atributo es obligatorio en sistemas de 64 bits.

Tipo de datos

LongPtr

Un tipo de datos variable que es de 4 bytes en versiones de 32 bits y de 8 bytes en versiones de 64 bits de Office 2010. Esta es la forma recomendada de declarar un puntero o un identificador para un código nuevo, pero también para código heredado si tiene que ejecutarse en la versión de 64 bits de Office 2010. Únicamente se admite en tiempo de ejecución de VBA 7 en 32 bits y 64 bits. Tenga en cuenta que le puede asignar valores numéricos, pero no tipos numéricos.

Tipo de datos

LongLong

Este es un tipo de datos de 8 bytes que se encuentra disponible sólo en versiones de 64 bits de Office 2010. Puede asignar valores numéricos, pero no tipos numéricos (para evitar truncamiento).

Operador de conversión

CLngPtr

Convierte una expresión simple en un tipo de datos LongPtr.

Operador de conversión

CLngLng

Convierte una expresión simple en un tipo de datos LongLong.

Función

VarPtr

Convertidor de datos Variant. Devuelve un tipo de datos LongPtr en versiones de 64 bits y Long en versiones de 32 bits (4 bytes).

Función

ObjPtr

Convertidor de objetos. Devuelve un tipo de datos LongPtr en versiones de 64 bits y Long en versiones de 32 bits (4 bytes).

Función

StrPtr

Convertidor de cadena. Devuelve un tipo de datos LongPtr en versiones de 64 bits y Long en versiones de 32 bits (4 bytes).

El siguiente ejemplo muestra cómo usar algunos de estos elementos en una instrucción Declare.

Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long

Tenga en cuenta que se considera que las instrucciones Declare sin el atributo PtrSafe no son compatibles con la versión de 64 bits de Office 2010.

Como se indicó anteriormente, existen dos nuevas constantes de compilación condicional: VBA7 y Win64. Para garantizar la compatibilidad con versiones anteriores de Microsoft Office, use la constante VBA7 (este es el caso más común) para impedir que el código de 64 bits se use en la versión anterior de Microsoft Office. En el caso de código que es diferente entre la versión de 32 bits y la de 64 bits, como al llamar a una API matemática que usa LongLong para su versión de 64 bits y Long para la de 32 bits, use la constante Win64. El siguiente código muestra el uso de estas dos constantes.

#if Win64 then
   Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong
#else
   Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long
#end if
#if VBA7 then
   Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal N AS Long)
#else
   Declare Sub MessageBeep Lib "User32" (ByVal N AS Long)
#end if

En resumen, si escribe un código de 64 bits y pretende usarlo en versiones anteriores de Microsoft Office, se recomienda usar la constante de compilación condicional VBA7. Sin embargo, si escribe código de 32 bits en Office 2010, ese código funciona como en versiones anteriores de Microsoft Office sin necesidad de usar la constante de compilación. Si desea asegurarse de que está usando instrucciones de 32 bits para versiones de 32 bits e instrucciones de 64 bits para versiones de 64 bits, la mejor opción es usar la constante de compilación condicional Win64.

Uso de atributos de compilación condicional

El siguiente código es un ejemplo de código VBA heredado que se debe actualizar. Observe los tipos de datos en el código heredado que se actualizan para usar LongPtr porque se refieren a identificadores o punteros

Código VBA heredado

Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
  
Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type

Nuevo código VBA

#if VBA7 then    ' VBA7 
Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
  hOwner As LongPtr
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As LongPtr
  lParam As LongPtr
  iImage As Long
End Type
 
#else    ' Downlevel when using previous version of VBA7

Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type
 
#end if
Sub TestSHBrowseForFolder ()
    Dim bInfo As BROWSEINFO
    Dim pidList As Long

    bInfo.pidlRoot = 0&
    bInfo.ulFlags = &H1
    pidList = SHBrowseForFolder(bInfo)
End Sub

Preguntas más frecuentes

Las siguientes son preguntas frecuentes relacionadas con las versiones de 32 bits y 64 bits de Microsoft Office.

  • ¿Cuándo conviene usar la versión de 64 bits de Microsoft Office?
    Esto es más una cuestión de la aplicación host (Word, Excel, etc.) que está usando. Por ejemplo, Excel es capaz de controlar hojas de cálculo mucho más grandes con la versión de 64 bits de Microsoft Office.

  • ¿Puedo instalar las versiones de 64 bits y 32 bits de Microsoft Office en paralelo?
    No.

  • ¿Cuándo debo convertir los parámetros Long a LongPtr?
    Debe comprobar la documentación de la API de Windows en la red de desarrolladores de Microsoft para la función que desea llamar. Punteros y controladores deben convertirse a LongPtr. Por ejemplo, la documentación para RegOpenKeyA proporciona la siguiente firma:

    LONG WINAPI RegOpenKeyEx(
      __in        HKEY hKey,
      __in_opt    LPCTSTR lpSubKey,
      __reserved  DWORD ulOptions,
      __in        REGSAM samDesired,
      __out       PHKEY phkResult
    );
    

    Los parámetros se definen como:

    Parámetro

    Descripción

    hKey [in]

    Un controlador para una clave de registro abierta.

    lpSubKey [in, optional]

    El nombre de la subclave de registro que se debe abrir.

    ulOptions

    Este parámetro está reservado y debe ser cero.

    samDesired [in]

    Una máscara que especifica los derechos de acceso deseados a la clave.

    phkResult [out]

    Un puntero para una variable que recibe un controlador a la clave abierta.

    En Win32API_PtrSafe.txt, la instrucción Declare está definida como:

    Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As LongPtr, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As LongPtr) As Long
    
  • ¿Debo convertir punteros y controladores en estructuras?
    Sí. Consulte el tipo MSG en Win32API_PtrSafe.txt:

    Type MSG
        hwnd As LongPtr
        message As Long
        wParam As LongPtr
        lParam As LongPtr
        time As Long
        pt As POINTAPI
    End TypeF
    
  • ¿Cuándo conviene usar strptr, varpt y objptr?
    Debe usar estas funciones para recuperar punteros a cadenas, variables y objetos, respectivamente. En la versión de 64 deMicrosoft Office, estas funciones devuelven un LongPtr de 64 bits, que se puede pasar a las instrucciones Declare. El uso de estas funciones no cambió de las versiones anteriores de VBA. La única diferencia es que ahora devuelven un LongPtr.

Conclusión

La adición de una versión de 64 bits de Office 2010 permite mover más datos para obtener una mayor capacidad. Cuando se escribe código de 32 bits, puede usar la versión de 64 bits de Microsoft Office sin cambios. Sin embargo, cuando escribe código de 64 bits, debe asegurarse de que el código contiene palabras clave específicas y constantes de compilación condicional para garantizar que el código tenga compatibilidad con versiones anteriores de Microsoft Office y que se va a ejecutar el código correcto si combina código de 32 y de 64 bits.

Recursos adicionales

Para obtener más información sobre instrucciones Declare, vea los siguientes recursos: