2016-01-20 2 views
3

Я использую макрос, в котором перечислены все имена файлов в любом каталоге, который я выбираю. Я пишу код, который разбивает имя файла на куски, которые я могу использовать позже. Список имен файлов начинается в ячейке F6 и проходит по столбцу. Вот код, который я написал до сих пор:Для цикла для удаления строк

Dim ContractNum As String 
Dim InvNum As String 
Dim FileRng As Range 
Dim FileLastRow As Long 
Dim File As Range 

FileLastRow = Sheet1.Range("F" & Rows.Count).End(xlUp).Row 

Set FileRng = Sheet1.Range("F6:F" & FileLastRow).SpecialCells(xlCellTypeConstants, 23) 

For Each File In FileRng 
If File = "Invoice.zip" Or File = "Thumbs.db" Then 
    File.EntireRow.Delete 
End If 
Next File 


For Each File In FileRng 
    ContractNum = Left(File, 4) 
    InvNum = Mid(File, 8, 6) 
    File.Offset(0, -5) = ContractNum 
    File.Offset(0, -4) = InvNum 
Next File 

Пока у меня эта часть работает нормально. Проблема, с которой я сталкиваюсь, заключается в том, что во всех каталогах плохо использовать этот макрос, есть нежелательные файлы, такие как «Thumbs.db» или «Invoice.zip». Код У меня возникли проблемы с ниже:

For Each File In FileRng 
If File = "Invoice.zip" Or File = "Thumbs.db" Then 
    File.EntireRow.Delete 
End If 
Next File 

Что я хотел это сделать, это отсканировать весь список имен файлов, и если он встречает имя файла «Thumbs.db» или «Счет-фактура .zip ", удалите всю строку. Пока это работает ... любопытно. Например, если в моем списке есть два файла с именем «Thumbs.db» и «Invoice.zip», я должен дважды запустить макрос, чтобы удалить оба. Очевидно, я хотел бы уничтожить их всех одним махом.

+2

Запуск регулярного цикла для обратного хода 'for I = filelastrow до 6 шагов -1' –

ответ

5

В соответствии с моими комментариями, изменить цикл для этого:

For i = filelastrow to 6 step -1 
    If Sheet1.Cells(i,6) = "Invoice.zip" Or Sheet1.Cells(i,6) = "Thumbs.db" Then 
     Sheet1.row(i).Delete 
    End If 
Next File 

Вопрос заключается в том, что, когда строка будет удалена ниже один становится, что строка и цикл затем пропускает его, как он перемещается к следующему , Затем он также будет перемещаться по пустым строкам на конце.

Обращаясь назад, эта проблема устранена.

+0

Спасибо большое Скотт! после некоторых мастеринга это сработало отлично! –

3

Отличный вопрос! Ответ @Scott Craner делает трюк красиво (поддержанный кстати), и вы заканчиваете с читаемым, эффективным срезом VBA. Хорошая вещь!

Существует еще один способ быстро удалить строки, которые, я думаю, заслуживают встряхивания: стратегия Range.Autofilter! Проверьте это, со стратегией Автофильтр начиная с комментариями ниже:

Public Sub DeleteRowsWithAutofilter() 

    Dim ContractNum As String 
    Dim InvNum As String 
    Dim FileRng As Range 
    Dim FileLastRow As Long 
    Dim File As Range 
    Dim t As Single 
    t = Timer 

    FileLastRow = Sheet2.Range("F" & Rows.Count).End(xlUp).Row 

    'Identify the total range of filenames, including the header 
    Set FileRng = Sheet2.Range("F5:F" & FileLastRow) 

    'Use the .Autofilter method to crush those 
    'annoying 'Thumbs.db' or 'Invoice.zip' rows 
    Application.DisplayAlerts = False 
    With FileRng 
     .AutoFilter Field:=1, Criteria1:="Thumbs.db", _ 
           Operator:=xlOr, _ 
           Criteria2:="Invoice.zip" 
     .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows.Delete 
    End With 
    Application.DisplayAlerts = True 

    'Turn off the autofilter safely 
    With Sheet2 
     .AutoFilterMode = False 
     If .FilterMode = True Then 
      .ShowAllData 
     End If 
    End With 

    MsgBox "Damn son! 'Autofilter' strategy completed in " & Timer - t & " seconds." 

End Sub 

я записал короткий скринкаст, который демонстрирует оба метода (For петли и Range.Autofilter) здесь:

https://www.youtube.com/watch?v=1U7Ay5voVOE

Надежда, что помогает, когда вы продолжаете развивать свой скрипт!

+0

Большое спасибо! я буду иметь это в виду для будущих проектов. Я тяжело рассмеялся в части Message lol. –

+0

Мне понравился короткий скринкаст. Определенно стоит посмотреть. – Jeeped

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