32位Excel宏不能与64位一起使用

时间:2013-05-13 14:36:52

标签: excel excel-vba vba

尝试将此32位宏用于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

1 个答案:

答案 0 :(得分:3)

错误信息非常清楚。您必须使用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