2016-02-16 2 views
0

Я пытаюсь скомпоновать код, чтобы сделать мой макрос корректным. Этот подход хорошо послужил мне в прошлом, но я не могу правильно адаптировать код.Условное удаление в VBA

Я нашел следующее

Sub way() 

Dim Cell As Range 
For Each Cell In Range("A1").CurrentRegion 
    If Len(Cell) < 2 Then Cell.EntireRow.Delete 
Next Cell 

End Sub 

можно адаптировать If Len (Cell) критерии к моей душе. Например = 10

Я не знаю, как адаптировать код, чтобы он выполнял поиск по всем ячейкам в столбце A и удалял соответствующие строки. Приведенный выше код делает это только для A1.

В идеале я хотел бы удалить все строки с ячейками в столбце A, длина которых должна быть 10 символов. Или, альтернативно, с совершенно другим набором кода удалите все остальные строки, которые не содержат ячейки в столбце A, длина которых не превышает 10 символов.

ответ

3

При удалении строк лучше всего цикла назад:

Sub way() 
Dim ws As Worksheet 
Dim i As Long 
Dim lastrow As Long 


Set ws = ActiveSheet 
lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row 
For i = lastrow To 1 Step -1 
    If Len(ws.Cells(i, 1)) < 2 Then ws.Rows(i).Delete 
Next i 

End Sub 
-2

Я не проверял синтаксис, но что-то, как это должно работать:

dim idx as integer 
idx = 1 
while Range("A" + cstr(idx)).value <> "" 
    'insert your delete logic here... 
idx = idx + 1 
wend 
3

По сути, ваш цикл проходит каждая ячейка в Range.CurrentRegion property излучает из A1. Ваше повествование выражает, что вы хотите только изучить столбец A, но удалить Range.EntireRow property.

The For .. Следующий цикл, отступающий назад, предложенный Scott Craner, скорее всего, ваш лучший выбор, но если вам более комфортно с For ... Each In loop, то ваш можно настроить.

Sub way() 
    Dim cl As Range, dels As Range 

    With Worksheets("Sheet1") 
     For Each cl In .Range("A1").CurrentRegion.Columns(1).Cells 
      If Len(cl.Value2) = 10 Then 
       If Not dels Is Nothing Then 
        Set dels = Union(dels, cl) 
       Else 
        Set dels = cl 
       End If 
      End If 
     Next cl 
    End With 

    If Not dels Is Nothing Then _ 
     dels.EntireRow.Delete 

End Sub 

Логика для удаления строк, которые не имеют значения в столбце А, что было 10 знаков, символов или цифр длиной будет If Len(cl.Value2) <> 10 Then.

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