2015-12-13 52 views
3

我每天運行此代碼將影響目錄中的每個.xlsx工作簿,但如果文件名不在「Okay」數組中,我該如何忽略工作簿?打開指定的工作簿僅

這是我目前的語法:

Option Explicit 
Public Sub OpenExcelInDir() 
Dim MyFolder As String 
Dim MyFile As String 
    MyFolder = "C:\ExcelSheets" 
    MyFile = Dir(MyFolder & "\*.xlsx") 
    Do While MyFile <> "" 
     Workbooks.Open Filename:=MyFolder & "\" & MyFile 
     MyFile = Dir 
     Call UpdateAllSheets 
    Loop 
End Sub 

現在我想改變它,這樣我可以聲明一個字符串數組,僅在陣列像這樣打開的工作簿:

Dim goodWB() As String 
goodWB= Split("ABC123,DEF456,GHI789", ",") 

回答

1

我認爲這會做你所要求的。我添加了一行來測試文件名是否與數組中的文件名匹配。

測試

Option Explicit 
Public Sub OpenExcelInDir() 
Dim goodWB() As String 
goodWB = Split("ABC123.xlsx,DEF456.xlsx,GHI789.xlsx", ",") 
Dim MyFolder As String 
Dim MyFile As String 
MyFolder = "C:\ExcelSheets" 
MyFile = Dir(MyFolder & "\*.xlsx") 
Do While MyFile <> "" 
    If IsInArray(MyFile, goodWB) Then 
     Workbooks.Open Filename:=MyFolder & "\" & MyFile 
     MyFile = Dir 
     Call UpdateAllSheets 
    End If 
    MyFile = Dir 
Loop 
End Sub 

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 
+1

請注意,「Filter」函數搜索部分匹配或用作過濾器的字符串的子集。因此,它的結果不符合OP的要求,因爲在該文件夾包含一個名爲'xABC123.xlsx'的文件的情況下,它將被打開,因爲它與目標文件'ABC123.xlsx'部分匹配' – EEM

+0

@EEM你有好的除了這就是爲什麼我將數組更改爲包含文件擴展名。帶擴展名的文件名將不可能包含在另一個文件名中。試試看,AABC123或ABC1233不會被發現,只有ABC123。所以......我相信這符合OP的要求,只是另一種做法。不是最快的,但它避免了另一個循環,並使用大部分原始代碼。乾杯 –

+0

我試過了,因此我的評論已經閱讀。編程明智的做法不好,當一個程序不可能不會失敗時,它肯定會失敗。這是一個標準和質量問題... – EEM

1
Public Sub OpenExcelInDir() 
Const kExt As String = ".xlsm"  `As extension is fixed it could be defined as a constant to avoid repetition 
Dim aWbks As Variant, vItm As Variant ‘Suggest to define the array in one step choose the form you prefer 
‘aWbks = Array("ABC123", "DEF456", "GHI789") 
aWbks = [{"ABC123", "DEF456", "GHI789"}] 

Dim MyFolder As String 
Dim MyFile As String 
    MyFolder = "C:\ExcelSheets" 
    MyFile = Dir(MyFolder & "\*" & kExt) 

    Do While MyFile <> "" 
     For Each vItm In aWbks 
      If vItm & kExt = MyFile Then 
       Workbooks.Open Filename:=MyFolder & "\" & MyFile 
       Call UpdateAllSheets 
       Exit For 
     End If: Next 
     MyFile = Dir 
    Loop 
End Sub 
2

即使我喜歡IsInArray功能我認爲算法是完全無效率的。如果在該文件夾中有1000個文件,那麼如果少數給定的文件名之一匹配,您將創建1000個臨時數組。此外,我希望在打開一個想要的文件之後,代碼不會再對這個名稱進行測試(事實並非如此)。 相反,我建議看問題從另一端:

Public Sub OpenExcelInDir() 
    Dim goodWB, filename 
    Dim MyFolder As String 
    Dim MyFile As String 

    goodWB = Array("ABC123.xls", "DEF456.xlsx", "GHI789.xlsx") 
    MyFolder = "C:\ExcelSheets" 

    For Each filename In goodWB 
     MyFile = MyFolder & "\" & filename 
     If Len(Dir(MyFile)) > 0 Then 
      Workbooks.Open filename:=MyFile 
      Call UpdateAllSheets 
     End If 
    Next WB 
End Sub 

這裏,Dir()功能用於測試在指定的文件夾有用的文件名是否存在等。作爲額外的優勢,EEM將不會有任何含糊之處,如他/她的評論中提到的那樣。

+0

同意最好使用數組內容而不是對陣列測試每個文件。 – brettdj