将共享文件夹path转换为UNCpath

我试图通过操作与计算机名称的当前path当前共享文件夹path转换为uncpath。 但是会导致编译错误:在公共函数UNCpath()中的行“elem = UBound(CurrentPathA)”上的预期数组。 你们可以告诉我什么似乎是造成这个问题的问题? 也许有更好的想法来获得uncpath?

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 Public Function UNCpath() As String Dim CompName As String, CurrentPath As String, CurrentPathA As String CompName = GetComputerName() CurrentPath = ThisWorkbook.Path CurrentPathA = Split(CurrentPath, "\") elem = UBound(CurrentPathA) CurrentPath = CurrentPathA(elem) UNCpath = "\\" & CompName & "\" & CurrentPath End Function 

或使用文件系统对象:

 Function GetUNCLateBound(strMappedDrive As String) As String Dim objFso As Object Set objFso = CreateObject("Scripting.FileSystemObject") Dim strDrive As String Dim strShare As String 'Separate the mapped letter from 'any following sub-folders strDrive = objFso.GetDriveName(strMappedDrive) 'find the UNC share name from the mapped letter strShare = objFso.Drives(strDrive & "\").ShareName 'The Replace function allows for sub-folders 'of the mapped drive GetUNCLateBound = Replace(strMappedDrive, strDrive, strShare) Set objFso = Nothing 'Destroy the object End Function 

我刚刚find并修改了信用证到期的这一点,

http://pagecommunication.co.uk/2014/07/vba-to-convert-a-mapped-drive-letter-to-unc-path/

我很惊讶,这行不会引发错配错误:

 CurrentPathA = Split(CurrentPath, "\") 

Split函数将string转换为数组。 所以,试图将Split的结果赋给一个stringvariables应该会引发一个错误。

在任何情况下, Ubound函数都需要一个数组。 因此,当你做Ubound(_string_)而不是UBound(_array_)

Dim CurrentPathA As Variant