我正在使用 MS Excel 2010 并尝试使用以下代码获取当前目录,
path = ActiveWorkbook.Path
但 ActiveWorkbook.Path 返回空白。
我已经对此进行了测试:
当我打开 Excel 文档时D:\db\tmp\test1.xlsm
:
CurDir()
返回C:\Users\[username]\Documents
ActiveWorkbook.Path
返回D:\db\tmp
所以CurDir()
有一个系统默认值,可以更改。
ActiveWorkbook.Path
对于同一个保存的工作簿不会更改。
例如,CurDir()
当您执行“文件/另存为”命令时发生变化,并在“文件/目录选择”对话框中选择一个随机目录。然后单击取消跳过保存。但CurDir()
已更改为上次选择的目录。
根据您要查找的内容,您有多种选择。
Workbook.Path
返回已保存工作簿的路径。Application.Path
返回 Excel 可执行文件的路径。CurDir
返回当前工作路径,这可能默认为您的 My Documents 文件夹或类似文件夹。
您还可以使用 Windows 脚本外壳对象的 .CurrentDirectory 属性。
Set wshell = CreateObject("WScript.Shell")
Debug.Print wshell.CurrentDirectory
但这应该得到与刚才相同的结果
Debug.Print CurDir
ActiveWorkbook 似乎没有保存...
试试CurDir()
吧。
你的代码:path = ActiveWorkbook.Path
返回空白,因为您尚未保存工作簿。
要解决您的问题,请返回 Excel 工作表,保存工作表,然后再次运行您的代码。
这次它不会显示空白,而是会显示它所在的路径(当前文件夹)
我希望这有帮助。
仅用于Application.ActiveWorkbook.Path
路径本身(不带工作簿名称)或Application.ActiveWorkbook.FullName
用于具有工作簿名称的路径。
如果您真的是指纯粹的工作目录,那么这应该适合您。
解决方案 A:
Dim ParentPath As String: ParentPath = "\"
Dim ThisWorkbookPath As String
Dim ThisWorkbookPathParts, Part As Variant
Dim Count, Parts As Long
ThisWorkbookPath = ThisWorkbook.Path
ThisWorkbookPathParts = Split(ThisWorkbookPath, _
Application.PathSeparator)
Parts = UBound(ThisWorkbookPathParts)
Count = 0
For Each Part In ThisWorkbookPathParts
If Count > 0 Then
ParentPath = ParentPath & Part & "\"
End If
Count = Count + 1
If Count = Parts Then Exit For
Next
MsgBox "File-Drive = " & ThisWorkbookPathParts _
(LBound(ThisWorkbookPathParts))
MsgBox "Parent-Path = " & ParentPath
但如果不这样做,这应该足够了。
解决方案 B:
Dim ThisWorkbookPath As String
ThisWorkbookPath = ThisWorkbook.Path
MsgBox "Working-Directory = " & ThisWorkbookPath
下面的简单示例:
Sub openPath()
Dim path As String
path = Application.ActivePresentation.path
Shell Environ("windir") & "\explorer.exe """ & path & "", vbNormalFocus
End Sub
使用这些代码并享受它。
Public Function GetDirectoryName(ByVal source As String) As String()
Dim fso, oFolder, oSubfolder, oFile, queue As Collection
Set fso = CreateObject("Scripting.FileSystemObject")
Set queue = New Collection
Dim source_file() As String
Dim i As Integer
queue.Add fso.GetFolder(source) 'obviously replace
Do While queue.Count > 0
Set oFolder = queue(1)
queue.Remove 1 'dequeue
'...insert any folder processing code here...
For Each oSubfolder In oFolder.SubFolders
queue.Add oSubfolder 'enqueue
Next oSubfolder
For Each oFile In oFolder.Files
'...insert any file processing code here...
'Debug.Print oFile
i = i + 1
ReDim Preserve source_file(i)
source_file(i) = oFile
Next oFile
Loop
GetDirectoryName = source_file
End Function
在这里你可以调用函数:
Sub test()
Dim s
For Each s In GetDirectoryName("C:\New folder")
Debug.Print s
Next
End Sub