2015-03-17 4 views
1

У меня есть набор файлов, которые я хочу прокрутить с именами файлов: Бюджет 2015, Бюджет 2016, Бюджет 2017 до 2022. Я прокручиваю их, используя Dir.Вопросы относительно Dir VBA

Dim OpenWb as workbook 
path = Dir("C:\pathtofile\Budget 20??.xlsx") 'Using the ? Dir Wildcard 
filepath = "C:\pathtofile\" 'Since Dir returns file name, not the whole path 
myHeadings = Split("Januari,Februari,Mars,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December", ",") 
j = 0 
Do While Len(path) > 0 
    i = 0 
    If Dir = "Budget 2014.xlsx" Then 
     j=0 
    Else 
     For i = 0 To UBound(myHeadings) 
      Set openWb = Workbooks.Open(filepath & path) 
      MsgBox Len(path) 
      Set openWs = openWb.Sheets(myHeadings(i)) 
      If openWs.Range("C34") = 0 Then 
       currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = "" 
      Else 
       currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = openWs.Range("C34") 
      End If 
     Next i 
    End if 
    path = Dir 
    j= j + 1 
    Loop 

Беда в том, что в FilePath есть также файл под названием Бюджет 2014, который я не хочу перебрать, потому что 1) Это не обязательно, значения вычисляются уже и 2) Поскольку он щурит мой индексы в петле

Обновлен мой код. Но использование msgBox (path) внутри цикла i = 0 ... возвращает «Budget 2014.xlsx», который мне не нужен, и, следовательно, это «беспорядок» с моим j индексом.

+0

Я думаю, что вы будете иметь, чтобы добавить, если условие внутри контура – chancea

ответ

1

Вы можете использовать метод Year. Нечто подобное,

Dim OpenWb as workbook, yearNo As Long, filepath As String 

filepath = "C:\pathtofile\" 
yearNo = Year(Date()) 

path = Dir("C:\pathtofile\Budget " & yearNo & ".xlsx") 

Do While Len(path) > 0 
    set OpenWb = Workbooks.open(filepath & path) ' Since Dir only returns file name 
    'Doing some things 
    yearNo = yearNo + 1 
    path = Dir("C:\pathtofile\Budget " & yearNo & ".xlsx") 
Loop 
+0

Спасибо! Пока не тестировали, но это действительно было творческое решение, которое, как мне кажется, должно работать. У меня есть следующий вопрос, если у вас есть время. Сначала я вычитаю значение в AA70 (см. Обновленный код), где я добавил константу 27 в столбец «достигнуть» AA для начала. Используя Year и мой синтаксис сейчас, это означало бы следующее, когда yearNo = yearNo + 1 будет вычислено, что перезапишет мою ячейку AA70 значениями 2015 года. Есть ли способ обойти это? Без необходимости обновлять код в следующем году, а также, когда Year (Date()) вернется в 2016 году, и у AA70 есть значения 2016? – Cenderze

+1

Возможно, у меня это есть! Мне нужно будет оставить работу сейчас, но я попытаюсь заменить j на Year (Date()) mod 2015 и посмотреть, как это произойдет завтра – Cenderze

+0

Больше похоже на 'yearNo Mod Year (Date());;) – PaulFrancis

1

Вы также можете попробовать это:

Dim OpenWb as workbook 
path = Dir("C:\pathtofile\Budget 20??.xlsx") 'Using the ? Dir Wildcard 
filepath = "C:\pathtofile\" 'Since Dir returns file name, not the whole path 
myHeadings = Split("Januari,Februari,Mars,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December", ",") 
j = 0 
Do While Len(path) > 0 
    i = 0 
'change here: only execute if it's NOT the file you're NOT after 
    If Dir <> "Budget 2014.xlsx" Then 
     For i = 0 To UBound(myHeadings) 
      Set openWb = Workbooks.Open(filepath & path) 
      MsgBox Len(path) 
      Set openWs = openWb.Sheets(myHeadings(i)) 
      If openWs.Range("C34") = 0 Then 
       currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = "" 
      Else 
       currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = openWs.Range("C34") 
      End If 
     Next i 
'Change here: only update path & j if you processed the file 
     path = Dir 
     j= j + 1 
    End if 
    Loop 
+0

Спасибо за ваш ответ! Это решение поможет мне в более позднем цикле, который я здесь не написал. У меня были некоторые проблемы с циклом If Dir <> ...., но теперь я вижу, что это можно сделать гораздо проще, чем я ожидал. – Cenderze

1
Sub M_snb() 
c00 = "C:\pathtofile\" 
sn = Application.GetCustomListContents(4) 

c01 = Dir(c00 & "Budget 20*.xlsx") 
Do While c01 <> "" 
    If c01 <> "Budget 2014.xlsx" Then 
    With GetObject(c00 & c01) 
    For j = 0 To UBound(sn) 
    c02 = c02 & "|" & IIf(.Sheets(sn(j)).Range("C34") = 0, "", .Sheets(sn(j)).Range("C34")) 
    Next 
    .Close 0 
    End With 
    End If 
    c01 = Dir 
Loop 

sp = Split(Mid(c02, 2), "|") 
ThisWorkbook.Sheets("Indata").Cells(70, 51).Resize(, UBound(sp)) = sp 
End Sub 
+0

+1, так как я верю, что это поможет мне избавиться от кучи операторов if, используя c02 = c02 & "|" ... решение. Почему вы включаете «|» там? Что такое sn? Попробовал google GetCustomListContents, но еще не понял. Вы никогда не назначаете sn никакой ценности? Как он «понимает», к чему вы обращаетесь в CustomList? – Cenderze

+0

В Excel есть 4 встроенных «пользовательских» списка (юмор MS!). custonlist ia - одномерный массив, который будет назначен переменной sn. Я включаю «|» для разделения значений в строке, чтобы впоследствии можно было разбить строку на 1-мерный массив (с именем «sp»). Вы можете найти страницу, на которой обсуждаются пользовательские списки на сайте www.snb-vba.eu – snb

+0

Спасибо за ваш ответ! После моей встречи проверит (я напишу вашу?) Веб-страницу. Его приятно видеть некоторые более продвинутые методы для выполнения работы, поэтому еще раз спасибо! – Cenderze

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