很多時候,我們必需要嘗試由外部檔案匯入資料,但是該如何判斷該檔案是否已被鎖定開啟中?尤其在多人使用的環境下,若能夠事先判斷,將可減少資料不同步的問題發生。以下我們為各位進行介紹。
子程式:
Function IsFileOpen(strFile As String) As Boolean
Dim iFile As Integer
Dim iErr As Integer
On Error Resume Next
iFile = FreeFile()
Open strFile For Input Lock Read As #iFile '以鎖定方式開啟,開啟指定檔案後直接關閉檔案
Close iFile
iErr = Err '將錯誤號碼帶入iErr變數中,然後依照數字即可得知檔案狀態
On Error GoTo 0
Select Case iErr
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case 53
MsgBox "找不到檔案,請再確認!"
IsFileOpen = False
Case 76
MsgBox "找不到路徑,請再確認!"
IsFileOpen = False
End Select
End Function
該程式會回傳一個布林值,但其實狀況不只檔案是否被鎖定開啟,而是還有是否不存在的狀況,因此以下主程式的部份,我介紹另一種偵測機制:
Sub Day19()
Dim strPath As String
strPath = "D:\test.xls"
'一、直接透過IsFileOpen自訂函數來判斷檔案狀態
MsgBox "檔案" & strPath & IIf(IsFileOpen(strPath), "已開啟", "未開啟")
'二、先利用Len與Dir的組合,判斷由dir產生的名稱,在用len檢查字串長度
' 若dir錯誤,找不到該檔案,len的長度就為0
If Len(Dir(strPath)) = 0 Then
MsgBox "無此檔案: " & strPath
Else
MsgBox "檔案" & strPath & IIf(IsFileOpen(strPath), "已開啟", "未開啟")
End If
End Sub
以上第二點的偵錯方式,我個人覺得比較符合自動化流程,若檔案不存在,就執行其他程式,避免繼續執行下。另外,IIf函數可以減少If..else的撰寫長度,若僅是要呈現個文字,IIf蠻方便的。