Tengo una aplicación de VBA desarrollado en Excel 2007, y contiene el siguiente código para permitir el acceso a la función ShellExecute
de Shell32.dll
:¿Cómo debo hacer que mi código VBA sea compatible con Windows de 64 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
originalmente me dijeron:
Al parecer, la aplicación no se compilar en una versión de 64 bits de Windows (aún usando Office 2007 de 32 bits). I supone que esto se debe a que la declaración
Declare
necesita actualización.He leído que Office 2010 introdujo un nuevo tiempo de ejecución de VBA (VB7), y que este tiene algunas nuevas palabras clave que se pueden utilizar en la declaración
Declare
para permitir que funcione correctamente en Windows de 64 bits . VB7 también tiene nuevo compilador predefinido constantes para apoyar condicional compilación donde cualquiera va a utilizar la vieja o nueva declaración , dependiendo de si la aplicación se está ejecutando en 32 o 64 bits de Windows.Sin embargo, como estoy atascado con Office 2007, necesito una solución alternativa. ¿Cuáles son mis opciones? (Me gustaría realmente prefiero no tener que liberar 2 versiones separadas de mi aplicación si es posible).
Sin embargo, según la respuesta de David a continuación, me equivoqué acerca de las circunstancias en las que mi declaración Declare
no funcionará. Las únicas circunstancias en las que no funcionará son Office 2010 de 64 bits en Windows de 64 bits. Entonces, Office 2007 no es un problema.
Si el problema es la oficina de 64 bits, entonces VBA7 no es la respuesta. Necesitas la constante de compilación win64. VBA7 seguirá funcionando en Office 2010 de 32 bits. –
@AnonymousType Estas instrucciones vienen precisamente de la documentación de MSDN en declaraciones VB7 y PtrSafe: http://msdn.microsoft.com/en-us/library/ee691831.aspx La necesidad de utilizar PtrSafe proviene del uso de VB7, no del uso de Office en un sistema de 64 bits. Es meramente una coincidencia que 64 sistemas solo admitan VB7, por lo que esto está matando a dos pájaros de un tiro. – Alain
'#if Win64' solo se necesita en situaciones extrañas en las que realmente necesita cargar dos dlls diferentes o usar funciones con diferentes firmas en sistemas de 32 y 64 bits. Simplemente por hacer que las hojas de cálculo heredadas funcionen en máquinas de 64 bits que fuerzan a VB7, no es necesario. Office 2010 de 32 bits es intencionalmente compatible con todas las hojas de cálculo VB6 heredadas sin modificaciones (según la documentación). – Alain