前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用VBA加载宏小心 Workbook.FullName 属性

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

作者头像
xyj
发布2021-03-18 17:50:13
1.5K0
发布2021-03-18 17:50:13
举报
文章被收录于专栏:VBA 学习

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

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

先看一个简单的代码:

代码语言:javascript
复制
Sub TestFullName()    Dim filename As String    filename = "C:\Users\Administrator\Desktop\TEST\Test.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没有过滤掉:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档