iT邦幫忙

DAY 19
0

Excel VBA 的眉眉角角系列 第 19

Excel VBA 的眉眉角角Day19:判斷檔案是否已開啟

很多時候,我們必需要嘗試由外部檔案匯入資料,但是該如何判斷該檔案是否已被鎖定開啟中?尤其在多人使用的環境下,若能夠事先判斷,將可減少資料不同步的問題發生。以下我們為各位進行介紹。

子程式:

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蠻方便的。


上一篇
Excel VBA 的眉眉角角Day18: 讀取UTF8檔案後,利用Split功能切割以及Resize與Application.Transpose的介紹
下一篇
Excel VBA 的眉眉角角Day20:關於日期的相關問題
系列文
Excel VBA 的眉眉角角30

尚未有邦友留言

立即登入留言