32位Excelmacros无法使用64位

尝试使这个32位macros在Office 2010 64位上工作。 我尝试使用PTrSafe,但不能得到它的工作.—新手在此谢谢

Option Explicit Private Declare Function fnGetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long Public Function GetComputerName() Dim strComputerName As String Dim lngPos As Long Const MAX_COMPUTERNAME_LENGTH = 100 Application.ScreenUpdating = False strComputerName = String(MAX_COMPUTERNAME_LENGTH + 1, " ") If fnGetComputerName(strComputerName, MAX_COMPUTERNAME_LENGTH) = 0 Then strComputerName = "ErrorGettingComputerName" Else lngPos = InStr(1, strComputerName, Chr(0)) strComputerName = Left(strComputerName, lngPos - 1) End If GetComputerName = strComputerName Application.Range("Computer_Name") = GetComputerName Application.ScreenUpdating = True End Function 

错误信息非常清楚。 您必须使用PtrSafe

 Option Explicit #If VBA7 Then Private Declare PtrSafe Function fnGetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long #Else Private Declare Function fnGetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long #End If Public Function GetComputerName() As String Const MAX_COMPUTERNAME_LENGTH As Long = 31 Dim buf As String, buf_len As Long buf = String$(MAX_COMPUTERNAME_LENGTH + 1, 0) buf_len = Len(buf) If (fnGetComputerName(buf, buf_len)) = 0 Then GetComputerName = "ErrorGettingComputerName" Else GetComputerName = Left$(buf, buf_len) End If End Function 

更好的是,使用Unicode版本:

 Option Explicit #If VBA7 Then Private Declare PtrSafe Function fnGetComputerName Lib "kernel32" Alias "GetComputerNameW" (ByVal lpBuffer As LongPtr, ByRef nSize As Long) As Long #Else Private Declare Function fnGetComputerName Lib "kernel32" Alias "GetComputerNameW" (ByVal lpBuffer As Long, ByRef nSize As Long) As Long #End If Public Function GetComputerName() As String Const MAX_COMPUTERNAME_LENGTH As Long = 31 Dim buf As String, buf_len As Long buf = String$(MAX_COMPUTERNAME_LENGTH + 1, 0) buf_len = Len(buf) If (fnGetComputerName(StrPtr(buf), buf_len)) = 0 Then GetComputerName = "ErrorGettingComputerName" Else GetComputerName = Left$(buf, buf_len) End If End Function