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没有过滤掉: