使用VBA加载宏小心 Workbook.FullName 属性

2021-03-18 17:50:13 浏览数 (1)

Workbook.FullName在VBA中是一个非常常用的属性,返回的是工作簿的全路径,首先查看一下帮助文件:

返回对象的名称(以字符串表示),包括其磁盘路径。String 型,只读。

先看一个简单的代码:

代码语言:javascript复制
Sub TestFullName()    Dim filename As String    filename = "C:UsersAdministratorDesktopTESTTest.xlsx"    Dim wk As Workbook    Set wk = Workbooks.Open(filename)        Debug.Print wk.FullName, wk.FullName = filename        wk.Close False    Set wk = NothingEnd Sub

一眼看去,应该会认为输出True,可实际情况是:

再仔细一看,会发现我故意将一些字母大小写替换了,文件能正确打开,但FullName返回的字符串和原始字符串有差异了。

可以看到路径中故意修改的字符被保存在了FullName中,但是文件名被还原回了磁盘上正确的名称。

看到这里,联系平时使用Windows系统经验,应该能想到,这是因为Windows系统在查找文件的时候,是忽略大小写的,所以虽然手动修改了一些字母的大小写,Workbooks.Open仍然可以正确的打开文件,并把FullName属性设置为修改后的名称(文件名为什么被修正了?)。

当然,实际写代码过程中,一般不会这样故意去修改文件的路径。但是,存在这样一种场景:

对经常使用VBA的人来说,会写一些常用的功能制作为加载宏使用,使用过加载宏的应该知道,一旦加载宏被移动了位置,会出现如下提示:

说明加载宏在设置加载的时候,路径就被保存起来了,在这种情况下,如果路径中仅仅是修改了字母的大小写(测试文件名修改没有影响),加载宏打开时不会出问题的,但是,路径其实已经被修改了。

我个人有这样一个使用习惯,由于需要使用的VBA功能较多,我将一些功能分类编写了不同的宏文件,这些文件存放在同一个文件夹里,只设置加载一个加载宏。这个加载宏里设置了一个Ribbon的动态菜单,单击的时候自动遍历所在路径下的宏文件,并添加button菜单,这个时候显然需要过滤掉本身,使用的代码就是:

代码语言:javascript复制
Sub dymOpenAddins_getContent(control As IRibbonControl, ByRef content)    Dim RetDirs() As String, RetFiles() As String        '查找遍历所有文件    If ScanDir(ThisWorkbook.Path & "", RetDirs, RetFiles) = -1 Then        Exit Sub    End If        Dim i As Long    Dim icount As Long    Dim fn As String    For i = 0 To UBound(RetFiles)        '过滤本身        If RetFiles(i) <> ThisWorkbook.FullName Then            '只显示有VBA的宏文件            If RetFiles(i) Like "*.xlam" Or RetFiles(i) Like "*.xlsm" Then                '过滤Excel的临时文件                If VBA.InStr(RetFiles(i), "~$") = 0 Then                    '取出文件名称                    fn = VBA.Mid$(RetFiles(i), VBA.InStrRev(RetFiles(i), "")   1)                    RetFiles(icount) = VBA.Left$(fn, Len(fn) - 5)                    '生成Ribbon的xml代码                    RetFiles(icount) = "      <button id=""" & RetFiles(icount) & """ label=""" & RetFiles(icount) & """ onAction=""rbOpenMacroFile"" imageMso=""FileSaveAsExcelXlsxMacro"" tag=""" & RetFiles(i) & """/>"                    icount = icount   1                End If            End If        End If    Next        If icount Then        ReDim Preserve RetFiles(icount - 1) As String        '通过回调函数的参数返回xml代码        content = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">" & vbNewLine & VBA.Join(RetFiles, vbNewLine) & vbNewLine & "</menu>"    End IfEnd Sub

如果存在上面说的只修改了加载宏路径中字母的大小写,就造成过滤不掉了!

如下图所示,修改了路径中的字母大小写,加载宏myVBA.xlam没有过滤掉:

0 人点赞