2016-06-02 2 views
2

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

В моем макросе, я систематически генерировать диапазон строк, используя союз между хребтом и новой строки в цикле:

Set DesiredRange = Union(DesiredRange, ActiveSheet.Cells(Val(ParsedText(Count)), 1).EntireRow) 

Однако, для того, чтобы этот союз работать, я должен сначала установить DesiredRange, равный некоторому диапазону, чтобы Союз не выходил из системы.

Проблема, с которой я столкнулась, состоит в том, что мне нужно выделить некоторые номера строк, но строки выбираются из текстового поля userform, которое позволяет пользователю вводить все, что они хотят (я закодирован в управлении ошибками, чтобы пройденные значения действительны), поэтому они могут гипотетически сделать первое значение (и, тем самым, то, что я использую для инициализации диапазона), - это строка, в которую включена строка.

Я надеюсь, что у кого-то здесь может быть решение, позволяющее мне выполнить все операции, а затем удалить эту первую добавленную строку из диапазона, если она находится в пределах категории (от 1 до 7). Если нет, я думаю, что у меня, возможно, есть работа (но часть меня задает этот вопрос больше для образования, чем решение проблемы)

Спасибо!

+0

Сразу после этой публикации , Я нашел работу с использованием маленькой петли и другого счетчика, но я все еще надеюсь, что кто-то может просветить меня, как с любыми методами, которые могли бы выполнить то, что я изначально запросил у – RGA

+0

Ключ находится в разделе «If rngTarget Is Nothing Then» в ответе Робин - вы просто не назначаете случайный диапазон, чтобы начать с! – Rory

ответ

3

Я думаю, что вам нужна функция, например Range.Except, для дополнения Range.Intersect и Range.Union, но AFAIK не встраивается в VBA, и вам придется ее самостоятельно закодировать. Что-то вроде следующего выполнит то, что вы хотите, и автоматически исключите нежелательные строки из Union. Переменная strRowsToExclude, вероятно, будет передан в метод из вашей формы:

Sub Test() 

    Dim rngTarget As Range 
    Dim strRowsToExclude As String 
    Dim varRowsToExclude As Variant 
    Dim intCounter1 As Integer 
    Dim intCounter2 As Integer 
    Dim blnDoNotAdd As Boolean 

    Set rngTarget = Nothing 
    strRowsToExclude = "1,4,45,87,88,99" 
    varRowsToExclude = Split(strRowsToExclude, ",") 

    For intCounter1 = 1 To 100 
     blnDoNotAdd = False 
     For intCounter2 = 0 To UBound(varRowsToExclude) 
      If intCounter1 = Val(varRowsToExclude(intCounter2)) Then 
       blnDoNotAdd = True 
      End If 
     Next intCounter2 
     If blnDoNotAdd = False Then 
      If rngTarget Is Nothing Then 
       Set rngTarget = Sheet1.Cells(intCounter1, 1).EntireRow 
      Else 
       Set rngTarget = Union(rngTarget, Sheet1.Cells(intCounter1, 1).EntireRow) 
      End If 
     End If 
    Next intCounter1 

    rngTarget.Select 

End Sub 
+0

Думаю, я должен был включить полный код для справки. У меня уже было все исключения, и мне нужно было только учитывать добавленную первую строку. Построенный нахальный обходной путь с использованием короткого цикла для запуска первых значений до тех пор, пока не будет найдено подходящее первое значение. Мне было просто любопытно, было ли более простое решение для удаления раздела из диапазона после его добавления. Я не могу найти документацию по методу «Range.Except», на который вы ссылаетесь, хотя – RGA

+0

По-прежнему правильность вашего ответа правильна, так как она довольно быстро разрешила проблему, даже если мне это не нужно. Я должен отметить, что верхнее значение лучше было бы установить на количество элементов в данной входной строке в случае очень больших наборов данных. – RGA

+0

RGA - спасибо. Не существует метода «Range.Except», но это было бы очень полезно в этом обстоятельстве и многих других. Они называют это «Subtract» по этой ссылке: http://dailydoseofexcel.com/archives/2007/08/17/two-new-range-functions-union-and-subtract/ –

0

вы могли бы сделать, как следует:

Option Explicit 

Sub main() 
    Dim desiredRng As Range, forbiddenRows As Range, cell As Range 
    Dim rowsStrng As String 
    Dim i As Long 

    With ActiveSheet 
     Set forbiddenRows = .Range("1:1, 3:5, 7:7, 9:11") '<~~ set forbidden rows, you can use multiple rows sintax    
     For i = 1 To 10 '<~~ this is your "Union" loop, 
      ' do stuff to get to following line 
      Set cell = .Cells(Val(ParsedText(Count)), 1) 
      If Intersect(cell, forbiddenRows) Is Nothing Then rowsStrng = rowsStrng & cell.Row & ":" & cell.Row & "," '<~~ add row index only if not forbidden 
     Next i 
     If rowsStrng <> "" Then Set desiredRng = .Range(Left(rowsStrng, Len(rowsStrng) - 1)) 
    End With 
End Sub 
+0

@ RGA вы попробовали это? он должен быть короче (кодировать и тем самым поддерживать!) и быстрее (для выполнения, поскольку он избегает цикла через список индексов запрещенных строк для каждой строки) – user3598756

0

Чтобы развернуть на комментарий Рори:

Dim DesiredRange As Range, rng As Range 

'...in your loop 
Set rng = ActiveSheet.Cells(Val(ParsedText(Count)), 1).EntireRow 
If DesiredRange Is Nothing Then 
    Set DesiredRange = rng 
Else 
    Set DesiredRange = Application.Union(DesiredRange, rng) 
End If