我正在使用MS Excel 2010并尝试使用以下代码获取当前目录
path = ActiveWorkbook.Path
但ActiveWorkbook.Path返回空白。
答案 0 :(得分:83)
我测试了这个:
当我打开Excel文档时D:\db\tmp\test1.xlsm
:
CurDir()
返回C:\Users\[username]\Documents
ActiveWorkbook.Path
返回D:\db\tmp
因此CurDir()
具有系统默认值,可以更改。
ActiveWorkbook.Path
不会更改。
例如,当您执行“文件/另存为”命令时,CurDir()
会更改,并在“文件/目录选择”对话框中选择一个随机目录。然后单击“取消”以跳过保存。但CurDir()
已更改为上次选择的目录。
答案 1 :(得分:8)
根据您的需求,您有多种选择。
Workbook.Path
返回已保存工作簿的路径。 Application.Path
返回Excel可执行文件的路径。 CurDir
返回当前工作路径,这可能默认为“我的文档”文件夹或类似文件。
您还可以使用windows脚本shell对象的.CurrentDirectory属性。
Set wshell = CreateObject("WScript.Shell")
Debug.Print wshell.CurrentDirectory
但是这应该得到与
相同的结果Debug.Print CurDir
答案 2 :(得分:7)
似乎ActiveWorkbook可能尚未保存......
请尝试CurDir()
。
答案 3 :(得分:4)
您的代码:path = ActiveWorkbook.Path
返回空白,因为您尚未保存工作簿。
要解决您的问题,请返回Excel工作表,保存工作表,然后重新运行代码。
这次它不显示空白,但会显示它所在的路径(当前文件夹)
我希望有所帮助。
答案 4 :(得分:1)
仅将Application.ActiveWorkbook.Path
用于路径本身(不包含工作簿名称)或Application.ActiveWorkbook.FullName
用于包含工作簿名称的路径。
答案 5 :(得分:0)
这是我用来在 Explorer 窗口中打开当前路径的VBA:
Shell Environ("windir") & "\explorer.exe """ & CurDir() & "",vbNormalFocus
Microsoft文档:
答案 6 :(得分:0)
如果您的意思是纯粹的工作目录,那么它应该适合您。
解决方案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
答案 7 :(得分:-2)
以下简单示例:
Sub openPath()
Dim path As String
path = Application.ActivePresentation.path
Shell Environ("windir") & "\explorer.exe """ & path & "", vbNormalFocus
End Sub
答案 8 :(得分:-3)
使用这些代码并享受它。
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