如何在VBA中获取当前工作表的路径?

180
我编写了一个宏作为插件,需要获取正在执行的工作表的路径。我该如何做?我该如何获取文件路径(仅目录)?
我编写了一个作为插件的宏,需要获取当前正在执行的工作表的路径。我该如何做?如何获取文件路径(只需目录)?

2
你的意思是,给定一个工作表,你想知道父工作簿所保存的文件夹吗? - Mathias
5个回答

341

使用Application.ActiveWorkbook.Path可以获取工作簿的路径(不包含工作簿名称),使用Application.ActiveWorkbook.FullName可以获取工作簿路径名称。


46
Activeworkbook依赖于哪个工作簿是活动的。使用Thisworkbook.path。 - Alwyn Miranda
10
当然,在不同的情况下,两者都是有用的。我理解原问题是指宏保存在一个插件工作簿中(即ThisWorkbook.path),但需要根据用户需要对其他工作簿运行代码(即ActiveWorkbook.path)。 - BradC
4
始终要明确 - 如果是这个工作簿,应该是application.thisworkbook.path。如果是正在打开的工作簿,则应使用set定义名称,然后是application.Variablename.path(或fullpath,具体取决于情况)。 - Selkie
1
如果代码本身打开工作簿,那么可以使用。但是,如果这只是驻留在插件工作簿中并需要在用户调用宏时对用户当前打开的任何工作簿进行操作的辅助宏,则需要使用ActiveWorkbook - BradC
6
如果文件至少保存一次,Excel.ActiveWorkbook.Path 才会起作用。如果文件从未保存过,则 Excel.ActiveWorkbook.FullName 仅返回文件名。建议检查工作簿是否保存过 - ChrisB
请注意,如果工作簿保存在OneDrive上或在OneDrive同步的目录中,此解决方案将返回一个URL,而不是工作簿的本地路径。在这种情况下获取本地路径的解决方案在此答案中提供。 - GWD

41

始终有益:

Dim myPath As String     
Dim folderPath As String 

folderPath = Application.ActiveWorkbook.Path    
myPath = Application.ActiveWorkbook.FullName

36

如果您想获取宏所在工作簿的路径 - 使用

Application.ThisWorkbook.Path

Application.ActiveWorkbook.Path有时会产生意外的结果(例如,如果您的宏在多个工作簿之间切换)。


@avalanche1。完全正确,activeworkbook 带给我很多意料之外的结果。 - Leedo

4

最快的方法

path = ThisWorkbook.Path & "\"

如果你在结尾处添加“\”,那么你的方法就很好了。myPath = ThisWorkbook.Path & "" - Geographos

0
我曾经遇到过同样的问题,并且我已经构建了一个解决方案,现在我要分享给大家。下面是用于Excel的VBA函数GetLocalPath(),它可以获取活动工作簿的本地路径:
Function GetLocalPath() As String
Dim sRowPath    As String
Dim sLocalPath  As String
Dim iFindhttp   As Integer

sRowPath = Application.ActiveWorkbook.Path

If LCase(Left(sRowPath, 4)) = "http" Then
    Dim fso As New FileSystemObject
    sLocalPath = fso.GetAbsolutePathName(sRowPath)
    iFindhttp = InStr(LCase(sLocalPath), "\http")
    sLocalPath = Left(sLocalPath, iFindhttp - 1)
    Set fso = Nothing
Else
    sLocalPath = sRowPath
End If
        
GetLocalPath = sLocalPath

结束函数


1
嗨@JulioGracia,您正在解决的问题是如何将OneDrive Url转换为本地路径。不幸的是,您的函数对于我设置的任何此类函数的测试用例都无法正常工作。如果您对此问题有更好的解决方案感兴趣,请查看此解决方案 - GWD
谢谢您的评论,对我很有用。我确认Julio提供的解决方案在我的情况下不起作用,但是您分享的链接中提到的解决方案目前运行良好。 - JustGreat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接