設為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 4170|回復: 5
打印 上一主題 下一主題

文件管理與超鏈接——從“To be, or not to be ”談起

[復制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2018-9-19 15:37:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
       前兩天,版友adouleonshaw在Excel VBA專區(qū)發(fā)帖,按需求來看,大約是希望能夠按要求搜索到文件,如果有則想辦法打開,如果不存在則表示不存在。說到這里,忽然想起《哈姆雷特》里的一句經(jīng)典語句:To be, or not to be , that is the question .國內(nèi)一般翻譯為“存在還是毀滅,這是個問題!

       這句話用在這里實在是太對了。這個文件,存在還是不存在,判斷起來,確實是個問題啊。搜索文件,VBA不是不可以,只是處理起來有些繁瑣,需要先在目錄下搜索(如果根目錄下存在其他文件的話),然后再根目錄下各個子文件夾搜索……如果多級文件夾,就更不用說了。幸虧這個例子相對簡單,沒出現(xiàn)上述的麻煩,只需要在根目錄下各個子文件夾搜索即可。
       搜索比較簡單,用FileSystemObject各種GetFold和GetFile就好了。那么怎么處理打開文件的操作呢?我一開始是用超鏈接的思路來實現(xiàn)的。事實上,這應該也是相對簡單的操作,如果非要在原先的文件名所在的單元格上處理,則需要寫兩部分代碼。一部分返回“是否存在文件”,另一部分則在指定單元格上增加selection_change事件或者click事件(后者可能需要使用With Event語句)。
       思路理清之后,剩下的就是寫腳本了?紤]到需要返回值,所以就寫成了自定義函數(shù),返回字符串。不過后來版友adouleonshaw發(fā)覺,用函數(shù)執(zhí)行起來很卡。也難怪,500行,每行需要嵌套循環(huán),每次打開都會運算。于是再稍稍改了下,用VBA轉(zhuǎn)為值。這樣只需執(zhí)行一次即可。

      主函數(shù)如下:
  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. '請自行根據(jù)需要改動單元格位置。
  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
復制代碼

      調(diào)用函數(shù)如下:
  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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱

點擊這里給我發(fā)消息

2#
發(fā)表于 2018-9-19 15:55:54 | 只看該作者
妙用超鏈接,好思路

點擊這里給我發(fā)消息

3#
發(fā)表于 2018-9-20 16:14:31 | 只看該作者
點贊!
回復

使用道具 舉報

點擊這里給我發(fā)消息

4#
發(fā)表于 2018-9-27 10:04:43 | 只看該作者
謝謝,老師
回復

使用道具 舉報

5#
發(fā)表于 2022-3-15 10:25:28 | 只看該作者
十分感謝,正在處理文件管理這部分,怎么都搞不來
6#
發(fā)表于 2023-11-13 21:18:31 | 只看該作者
感謝分享,非常不錯
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-17 00:43 , Processed in 0.083045 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表