2015-12-13 2 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, и это просто еще один способ сделать это. Не самый быстрый, но он избегает другого цикла и работает с использованием большей части исходного кода. Cheers –

+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 массивов temp, если один из немногих заданных имен файлов соответствует. Кроме того, я ожидал бы, что после открытия одного из файлов, которые нужны, код больше не будет тестировать на это имя (что не так). Вместо этого я предлагаю взглянуть на проблему с другой стороны:

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

Смежные вопросы