设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3403|回复: 5
打印 上一主题 下一主题

文件管理与超链接——从“To be, or not to be ”谈起

[复制链接]
跳转到指定楼层
1#
发表于 2018-9-19 15:37:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       前两天,版友adouleonshaw在Excel VBA专区发帖,按需求来看,大约是希望能够按要求搜索到文件,如果有则想办法打开,如果不存在则表示不存在。说到这里,忽然想起《哈姆雷特》里的一句经典语句:To be, or not to be , that is the question .国内一般翻译为“存在还是毁灭,这是个问题。”

       这句话用在这里实在是太对了。这个文件,存在还是不存在,判断起来,确实是个问题啊。搜索文件,VBA不是不可以,只是处理起来有些繁琐,需要先在目录下搜索(如果根目录下存在其他文件的话),然后再根目录下各个子文件夹搜索……如果多级文件夹,就更不用说了。幸亏这个例子相对简单,没出现上述的麻烦,只需要在根目录下各个子文件夹搜索即可。
       搜索比较简单,用FileSystemObject各种GetFold和GetFile就好了。那么怎么处理打开文件的操作呢?我一开始是用超链接的思路来实现的。事实上,这应该也是相对简单的操作,如果非要在原先的文件名所在的单元格上处理,则需要写两部分代码。一部分返回“是否存在文件”,另一部分则在指定单元格上增加selection_change事件或者click事件(后者可能需要使用With Event语句)。
       思路理清之后,剩下的就是写脚本了。考虑到需要返回值,所以就写成了自定义函数,返回字符串。不过后来版友adouleonshaw发觉,用函数执行起来很卡。也难怪,500行,每行需要嵌套循环,每次打开都会运算。于是再稍稍改了下,用VBA转为值。这样只需执行一次即可。

      主函数如下:
  1. Sub 按钮1_Click()
  2.     Dim rng As Range
  3.     Dim i As Long
  4.     Dim strPath As String
  5.     For i = 1 To 10
  6. '请自行根据需要改动单元格位置。
  7.         strPath = isExists(Sheet1.Range("B1").Offset(i, 0))
  8. '使用公式的话可以用这一句,if部分注释掉即可。
  9.         'Sheet1.Range("E1").Offset(i, 0).Formula = "=if(len(""" & strPath & """)>0,HYPERLINK(""" & strPath & """,""有""),""无"")"
  10.         If Len(strPath) > 0 Then

  11.             Sheet1.Range("E1").Offset(i, 0) = "无"
  12.         Else
  13.             Sheet1.Hyperlinks.Add anchor:=Sheet1.Range("E1").Offset(i, 0), Address:="""" & strPath & """", TextToDisplay:="有"
  14.         End If
  15.     Next
  16. End Sub
复制代码

      调用函数如下:
  1. Function isExists(ByVal rng As Range, Optional ByVal strExtName As String = ".pdf") As String
  2.     Dim fso As New FileSystemObject
  3.     Dim fd As Folder
  4.     Dim fl As File
  5.     Dim strFileName As String
  6.     Dim strExists As String
  7.     strExists = ""
  8.     For Each fd In fso.GetFolder(ThisWorkbook.Path).SubFolders
  9.         For Each fl In fd.Files
  10.             strFileName = Mid(fl, InStrRev(fl, "") + 1, Len(fl) - InStrRev(fl, "") - Len(strExtName))
  11.             If rng.Value = strFileName Then
  12.                 strExists = fl
  13.                 Exit For
  14.             End If
  15.             
  16.         Next
  17.     Next
  18.     isExists = strExists
  19. End Function
复制代码
     剩下的见附件吧。      最后还是那一句,注意文件夹管理。太多文件夹的话,无论怎么处理,都不会快到哪里去

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2018-9-19 15:55:54 | 只看该作者
妙用超链接,好思路

点击这里给我发消息

3#
发表于 2018-9-20 16:14:31 | 只看该作者
点赞!
回复

使用道具 举报

点击这里给我发消息

4#
发表于 2018-9-27 10:04:43 | 只看该作者
谢谢,老师
回复

使用道具 举报

5#
发表于 2022-3-15 10:25:28 | 只看该作者
十分感谢,正在处理文件管理这部分,怎么都搞不来
6#
发表于 2023-11-13 21:18:31 | 只看该作者
感谢分享,非常不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-25 23:32 , Processed in 0.106047 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表