Cómo hacer para que una macro funcione en office de 32 y 64 bits?

En un Excel le he puesto una macro que me registrar la fecha y el usuario logeado de Windows en las celdas de las columnas S y T.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column < 2 Then
    Cells(Target.Row, 19).Value = Now
   Cells(Target.Row, 20).Value = ObtenerNombreUsuario()
End If
End Sub

Aclaro que la macro para obtener el usuario de Windows la he conseguido de un ejemplo publicado y la adapte a lo que necesito.

El problema que tengo es que el Excel lo tengo en una carpeta en red donde lo utilizan varios compañeros donde existen computadoras con office de 32 y 64 bits.

El siguiente código es el que me encontré, si pongo el PtrSafe me funciona en 64 bits y no en 32bits y si borro el PtrSafe me funciona en 32 y no en 64bits:

¿Existe alguna forma de que se pueda usar en ambas versiones?

Public Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Function ObtenerNombreUsuario() As String
 Dim rtn As Long
 Dim sBuffer As String
 Dim lSize As Long
 sBuffer = String$(260, Chr$(0))
 lSize = Len(sBuffer) - 1
 rtn = GetUserName(sBuffer, lSize)
 If rtn Then
 sBuffer = Left$(sBuffer, lSize)
 If InStr(sBuffer, Chr$(0)) Then
 sBuffer = Left$(sBuffer, InStr(sBuffer, Chr$(0)) - 1)
 End If
 ObtenerNombreUsuario = sBuffer
 Else
 'error!
 ObtenerNombreUsuario = ""
 End If
End Function
Respuesta
2

[Hola

Para que funcione en ambas versiones, colócalo así:

#If VBA7 Then
    Public Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#Else
        Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#End If

Por si acaso en los Excel de 64 bits una parte se verá de color rojo, pero tranquilo, el "#If" evitará que lo detecte como error al activar los proceso.

Saludos]

Abraham Valencia

2 respuestas más de otros expertos

Respuesta
1

Esta pregunta me sale sugerida y en programación de Excel poca experiencia tengo, pero imagino que en éste caso la solución es la misma que para Access.

Abraham ya te indica un camino correcto (un saludo Abraham), pero yo lo completaría con un doble sondeo. Además de la versión del Editor, con la versión de Office.

Para no repetir lo que ya está escrito, mira éste enlace de Microsoft >>

https://msdn.microsoft.com/es-es/vba/language-reference-vba/articles/64-bit-visual-basic-for-applications-overview 

Casi al final donde cita >> "Escritura de código que funciona en Microsoft Office 2010 (32 bits o 64 bits) y versiones anteriores de Office" Mis saludos >> Jacinto

Respuesta

Usa esto, ponlo al principio de un modulo

#If VBA7 And Win64 Then
'Si es de 64 bits
Public 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
Public Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Public Declare PtrSafe Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
Public Declare PtrSafe Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Public Declare PtrSafe Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As LongPtr
Public Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey As LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As LongPtr
#Else
'Si es de 32 bits
Public 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
Public Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As Long
Public Declare Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
#End If

Fijate en uno de estos ejemplos que usa lo mencionado

https://youtu.be/AXsRKV8lb4A

https://youtu.be/vsHT4NQkoJM

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas