2013-03-19 5 views
3

Код ниже был записан как часть генератора случайных выборок. Основываясь на общем количестве случаев, он вычисляет размер выборки и уменьшает популяцию до размера выборки. Сейчас я делаю это, удаляя разницу между общим и размером выборки. Я хотел бы посмотреть, есть ли лучший способ обойти это. Я получаю образец каждого значения в определенном пользователем столбце и работаю с большим набором данных, поэтому выборка заканчивается на несколько минут.Delete Row Loop Optimization VBA

Есть ли способ удалить количество строк, которые мне нужны всем сразу, вместо того, чтобы делать их по одному, как показано в цикле ниже, или лучший способ обойти это в целом? Спасибо!

x = (Population - SampleSize) 

    If Population > SampleSize Then 
     Do Until x = 0 
      Workbooks(SourceBook).Sheets(SampleSheet).Columns(StratCol) _ 
      .Find(What:=SubPop, After:=Cells(SampRows, StratCol), LookIn:=xlValues, _ 
       SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
       MatchCase:=False, SearchFormat:=False).EntireRow.Delete 

     x = x - 1 

     Loop 

    End If 
+0

Да, есть, но только путем добавления столбца формулы, как в [Как удалить несколько строк без цикла в Excel VBA] (http: // stackoverflow.com/questions/15431801/how-to-delete-multiple-rows-without-a-loop-in-excel-vba) - см. мой ответ для возможного решения. –

+0

@ForrestA. Пожалуйста, обратитесь к аналогичной теме. http://stackoverflow.com/questions/15375054/vba-macro-to-delete-rows-quickly – 2013-03-19 12:03:58

+0

yes, AUtoFilter/Advanced Filter - еще одна опция ** без цикла **, где SpecialCells не требуется использовать –

ответ

1

Вы можете создать диапазон, содержащий несколько несмежных строк, а затем удалить все из них одновременно. Это, вероятно, ускорит все.

-1

Для этой ситуации нельзя избежать. Попробуйте под кодом.

Dim rng As Range 
    x = (Population - SampleSize) 

    If Population > SampleSize Then 
     Do Until x = 0 

      With Workbooks(SourceBook).Sheets(SampleSheet) 
       Set rng = .Columns(StratCol).Find(What:=SubPop, After:=Cells(SampRows, StratCol)) 
       If Not rng Is Nothing Then 
        rng.EntireRow.Delete 
       End If 
      End With 

      x = x - 1 
     Loop 
    End If 
+0

петли можно избежать, см. Мой ответ –

0

для этого решения петля может избежать.

Просто добавьте дополнительный столбец создает ошибку, которая может быть найдена с помощью SpecialCells, как показано ниже:

Range("IA1:IA" & Range("A65536").End(xlUp).Row).Formula = "=IF(A:A = """ & SubPop & """,NA(),"""") " 

затем вы используете SpecialCells, чтобы определить строки, соответствующие SupPop и удалить всю строку!

Range("IA1:IA" & Range("A65536").end(xlup).row).specialcells(xlCellTypeFormulas, xlErrors).EntireRow.Delete shift:=xlup 

Наконец, очистка/удаление, который мы добавили в начале дополнительную формулу colummn:

Range("IA1:IA" & Range("A65536").end(xlup).row).clear 

Вот правильное объяснение этого метода: How to delete multiple rows without a loop in Excel VBA

Я надеюсь, что помогает получить вы запустили

и вот приведенный выше код все в одном виде с нетерпением запрошен:

Sub deleteRows(ByVal strSubPop As String) 
' pass in the string to match (SubPop) 
' 
    Range("IA1:IA" & Range("A65536").End(xlUp).Row).Formula = "=IF(A:A = """ & strSubPop & """,NA(),"""") " 
'  
    ' for debugging and testing just select the rows where a match is found 
    Range("IA1:IA" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Select 
' 
    ' when ready, UNCOMMENT the below line 
    ' Selection.Delete shift:=xlUp 
    ' 
    ' after testing just use this line to select the rows and delete in one step: 
    ' Range("IA1:IA" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete shift:=xlUp 
    ' 
    ' now clean up Column IA 
    Range("IA1:IA" & Range("A65536").End(xlUp).Row).Clear 
    Range("A1").Select 
' 
End Sub 

так что это за код делает?

Сначала ваше требование, чтобы удалить строки соответствия SubPop

  1. Первая строка добавляет формулу в колонке IA, совпадающей SubPop найден в колонке А
  2. Следующая строка находит все те строки, затем удаляет их
  3. последняя строка очищает

Филипп

+0

Просьба предоставить пример выше кода. Спасибо – 2013-03-19 09:52:34

+0

Я предполагаю, что большинство ppl знают SpecialCells. Пожалуйста, используйте его против ценности и покажите мне, если это сработает. Жду вашего ответа с нетерпением. – 2013-03-19 10:02:57

+0

приведенный выше код использует значение SubPop. Если найдено в столбце A, тогда формула возвращает код ошибки NA # в ячейках в столбце IA. SpecialCells ищет в столбце IA для ошибок (NA #), тогда команда диапазона возвращает всю строку, которая принимает метод Delet! –