Страницы: 1
RSS
Удаление строк VBA
 
Здравствуйте!  
Хочу удалить строк не пустых ячеек столбце C, или не так делаю удаляет на половину...  
 
Sub d()  
Dim d&  
With Sheets("Недостача")  
   For d = 2 To .Cells(Rows.Count, 1).End(xlUp).Row  
       If .Cells(d, 3).Value <> "" Then  
           .Rows(d).EntireRow.Delete  
       End If  
   Next  
End With  
End Sub
Excel 2007
 
при удалении строки сдвигаются, поэтому цикл лучше писать так:  
 
For .Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1  
...  
Next
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
удалять строки нужно снизу вверх
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
ikki, LightZ Спасибо!
Excel 2007
 
вот такой вариант  
 
Sub io()  
Sheets("Недостача").UsedRange.Offset(1).Columns("C").SpecialCells(xlBlanks).Rows.Delete  
End Sub  
 
правде если пустых ячеек не будет, появиться ошибка. тогда можно добавить обработчик ошибок.
 
AKSENOV 048 Спасибо тоже пригодиться
Excel 2007
 
ох. только заметил, что надо НЕ пустые ячейки удалять) простите.  
SpecialCells(xlConstants, 1)
 
ABC, если Вы будете удалять строки на большом объеме данных, то эти оба варианта не подойдут.  
Лучше с помощью двух массивов, на 20к строк - скорость 00:00 сек, а выполнение вышеуказанных кодов так и не дождался :(  
Сделал для одного столбца. Или Вам нужно на несколько? Просто примера нет.  
 
Dim elem  
Dim arr()  
Dim i As Long  
 
   With Sheets(1).Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row)  
       ReDim arr(1 To .Cells.Count, 1 To 1)  
       For Each elem In .Value  
           If elem <> "" Then  
               i = i + 1  
               arr(i, 1) = elem  
           End If  
       Next  
       .ClearContents  
       .Parent.Range("C1").Resize(i) = arr()  
   End With
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
разные способы - для разных целей.  
использование Delete медленно в т.ч. потому, что Ex корректирует все формулы, форматы и прочие свойства ячеек - примечания, УФ, ...  
вариант с массивом действительно много быстрее, но с формулами и форматами придется распрощаться. а уж если на этот диапазон или отдельнве его ячейки были ссылки - то результат может быть катастрофическим :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Богдан, это с одним массивом:-)
Я сам - дурнее всякого примера! ...
 
KukLP  
а да, точно, с одним  
вместо For Next использовал For Еach Next, так бы было бы 2 массива :)  
 
ikki  
Исходил из скорости выполнения макроса, т.к. примера нет и не ясно какие у ТС данные в ячейках :)
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
т.е. пример есть, но скорее всего не оригинал, для которого делается макрос :)
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
вот так будет лучше, учитывая все данные, с двумя массивами:  
 
Dim arr1()  
Dim arr2()  
Dim j As Long  
Dim i As Long  
Dim ii As Long  
Dim iColumns As Integer  
   
With Sheets(1).Range("A2").CurrentRegion  
iColumns = .Columns.Count  
ReDim arr2(1 To .Rows.Count, 1 To iColumns)  
arr1 = .Value  
   For j = 1 To .Rows.Count  
       If arr1(j, 3) <> "" Then  
           i = i + 1  
               For ii = 1 To iColumns  
                   arr2(i, ii) = arr1(j, ii)  
               Next  
       End If  
   Next  
   Sheets(1).Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents  
   Sheets(1).Range("A2").Resize(i, iColumns).Value = arr2  
 End With
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
{quote}{login=LightZ}{date=25.03.2012 01:46}{thema=}{post}вместо For Next использовал For Еach Next, так бы было бы 2 массива :){/post}{/quote}Да хоть Do loop. Там в любом случае один массив:-) Вот если бы ты сначала диапазон взял в массив, а потом работал бы только с массивом(и это было бы еще быстрей), тогда да.
Я сам - дурнее всякого примера! ...
 
Теперь, да. Только и для этого достаточно одного массива, в к-ром просто перекладывать строки к верху. Так экономней.
Я сам - дурнее всякого примера! ...
 
LightZ Ваш последний код массивный замечателен, но чуть исправил  
 
Dim arr1()  
Dim arr2()  
Dim j As Long  
Dim i As Long  
Dim ii As Long  
Dim iColumns As Integer  
 
With Sheets("Недостача").Range("A2").CurrentRegion  
iColumns = .Columns.Count  
ReDim arr2(1 To .Rows.Count, 1 To iColumns)  
arr1 = .Value  
For j = 2 To .Rows.Count  
If arr1(j, 3) = "" Then  
i = i + 1  
For ii = 1 To iColumns  
arr2(i, ii) = arr1(j, ii)  
Next  
End If  
Next  
Sheets("Недостача").Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents  
Sheets("Недостача").Range("A2").Resize(i, iColumns).Value = arr2  
End With  
 
но, если в столбце 3 все ячейки не пустые тогда удаляет и ругается на строку (Ошибка 1004)  
->Sheets("Недостача").Range("A2").Resize(i, iColumns).Value = arr2  
 
спасибо Вам ну туда добавлю Error вроде будет нормально
Excel 2007
 
Задача удалить пустые строки или не пустые?  
Во вложении два готовых варианта
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
LightZ охо прекрасно спасибо Вам!
Excel 2007
Страницы: 1
Читают тему
Наверх