|
前兩天,版友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ù)如下:
- Sub 按鈕1_Click()
- Dim rng As Range
- Dim i As Long
- Dim strPath As String
- For i = 1 To 10
- '請自行根據(jù)需要改動單元格位置。
- strPath = isExists(Sheet1.Range("B1").Offset(i, 0))
- '使用公式的話可以用這一句,if部分注釋掉即可。
- 'Sheet1.Range("E1").Offset(i, 0).Formula = "=if(len(""" & strPath & """)>0,HYPERLINK(""" & strPath & """,""有""),""無"")"
- If Len(strPath) > 0 Then
- Sheet1.Range("E1").Offset(i, 0) = "無"
- Else
- Sheet1.Hyperlinks.Add anchor:=Sheet1.Range("E1").Offset(i, 0), Address:="""" & strPath & """", TextToDisplay:="有"
- End If
- Next
- End Sub
復制代碼
調(diào)用函數(shù)如下:
- Function isExists(ByVal rng As Range, Optional ByVal strExtName As String = ".pdf") As String
- Dim fso As New FileSystemObject
- Dim fd As Folder
- Dim fl As File
- Dim strFileName As String
- Dim strExists As String
- strExists = ""
- For Each fd In fso.GetFolder(ThisWorkbook.Path).SubFolders
- For Each fl In fd.Files
- strFileName = Mid(fl, InStrRev(fl, "") + 1, Len(fl) - InStrRev(fl, "") - Len(strExtName))
- If rng.Value = strFileName Then
- strExists = fl
- Exit For
- End If
-
- Next
- Next
- isExists = strExists
- End Function
復制代碼 剩下的見附件吧。 最后還是那一句,注意文件夾管理。太多文件夾的話,無論怎么處理,都不會快到哪里去
|
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號?注冊
x
|