2016-09-27 1 views
0

Я создаю макрос, который будет просматривать папку для всех файлов xls определенного типа отчета и перечислить их на листе с целым путем. Затем он оценивает их в порядке возрастания и находит самый последний файл, который открывается, а информация из него копируется в пустой файл как процесс, объединяющий самые последние данные из нескольких видов отчетов.VBA цикл выхода в последнем истинном состоянии

Проблема выхода из цикла после того, как последний файл был найден:

Dim i As Variant 
Dim myarray() As Integer 
Dim myarray2() As Variant 

i = 0 

For Each cell In Range("C1:C" & x) 
    If InStr(1, cell, "proof") Then 
     i = i + 1 
     Debug.Print i & " " & cell.value 
     ReDim myarray(i) 
     ReDim Preserve myarray2(cell) 
    End If 

    Do 
    Loop Until InStr(1, cell, "proof") 
Next cell 

Это пробный код - это выглядит для всех файлов, которые имеют "proof" в имени файла в указанной папке и затем печатает их в ближайшем окне. Динамический массив хранит каждое имя файла до тех пор, пока цикл не закончится, и цикл цикла Do Until должен остановить его при последнем условии, которое проверяет как истинное - это файл, который будет затем открыт и информация будет скопирована. Дело в том, что петля Do Until блокирует всю процедуру, так как первая итерация, которая является истиной, удовлетворит ее, и я не уверен, как ее завершить, где она должна ...

A Do-While цикл просто заканчивается тем, что едет на велосипеде, когда ставится в одно и то же место.

+2

Я не уверен, как вы определяете «последнее условие», но это 'do' цикл не имеет смысла, потому что он перезагружается для каждого' cell' и имеет такое же условие как «если» выше. Код внутри 'if' тоже не имеет смысла. Казалось бы, вы хотите удалить цикл 'do', измените внутренности' if', чтобы фактически сохранить значения в 'myarray2', чтобы' '' закончить нормально, а затем использовать последний элемент 'myarray2'. – GSerg

+1

Проверенная ячейка в вашем 'do ... while' никогда не изменяется. Поэтому, если ячейка не является «доказательством», она будет зацикливаться навсегда. – litelite

+0

@GSerit, это то, что последний «доказательный» файл хранится в myarray2, но на следующей итерации он заменяется файлом, который не соответствует критериям, поскольку макрос проверяет каждый файл в списке. Итак, моя головоломка сохраняет последний файл с «доказательством» в имени файла, в то время как цикл проходит через остальную часть списка. Это было обоснование петли Do-Until ... – quadrature

ответ

2

на самом деле не получите всю вашу цель. но вы могли бы попробовать это для начала

Option Explicit 

Sub main() 
    Dim i As Variant 
    Dim myarray() As String 
    Dim cell As Range 
    Dim firstAddress As String 
    Dim nFound As Long 

    With Range("C1", Cells(Rows.Count, "C").End(xlUp)) '<--| reference column "C" cells from row 1 down to last non empty one 
     nFound = WorksheetFunction.CountIf(.Cells, "*proof*") '<--| count occurrences of wanted substring 
     If nFound = 0 Then Exit Sub '<--| exit if no occurrences 
     ReDim myarray(1 To nFound) '<--| size your array to match occurrences 
     Set cell = .Find(what:="proof", after:=.Cells(.Rows.Count, 1), LookIn:=xlValues, lookat:=xlPart, searchdirection:=xlNext) '<--| find first occurrence 
     firstAddress = cell.Address '<--| store first occurrence address 
     Do 
      i = i + 1 '<-- update array index 
      myarray(i) = cell.Value '<--| update array current index content 
      Set cell = .FindNext(cell) '<--| search for next occurrence 
     Loop While cell.Address <> firstAddress '<--| exit if occurrence wrapped back to the first one 
    End With 
End Sub 
+0

CountIf определенно лучше, чем тестирование частей строки в диапазоне. Очень крутой способ сделать это. Весь цикл работы в режиме «Do-While» делает намного больше смысла, следуя вашему примеру. Спасибо, user3598756! – quadrature

+1

Добро пожаловать. Хорошая кодировка! – user3598756