Выбор строк каждой ячейки в объекте диапазона (VBA)

Я пытаюсь скопировать диапазон данных с одного рабочего листа на другой. Диапазон определяется значением в столбце A, соответствующим заданному значению. Я смог добавить каждую из ячеек с указанным значением в объект диапазона, но теперь мне нужно выбрать все данные в строках ячеек, которые находятся в моем объекте диапазона, чтобы скопировать их на другой лист. Любой совет?

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

Dim allAsNum As Range
Dim currAsNum As Range
Dim asnum
Dim j

Sheets("Full Log").Select
asnum = "searchingvalue"
    For j = 2 To CInt(Cells(Rows.Count, "A").End(xlUp).Row)
    If Range(Sheets("Full Log").Cells.Address).Cells(j, 1).Value = asnum Then
        If allAsNum Is Nothing Then
            Set allAsNum = Range(Sheets("Full Log").Cells.Address).Cells(j, 1)
        Else
            Set allAsNum = Union(allAsNum, Range(Sheets("Full Log").Cells.Address).Cells(j, 1))
        End If
    End If
    Next j
    
    Set currAsNum = allAsNum.Rows 'This is the line that I can't figure out
    currAsNum.Select

person Barrett Tillman    schedule 01.04.2021    source источник
comment
AdvancedFilter — гораздо более эффективный способ копирования данных на основе критериев выбора.   -  person Nicholas Hunter    schedule 01.04.2021


Ответы (1)


Скотт Крэнер прав. Однако некоторые замечания к вашему коду

а) То, что вы новичок, не оправдывает отсутствие отступов в вашем коде. Просто следуйте правилу добавлять 1 к уровню отступа для каждого оператора Sub, If, For и With (этот список неполный, но вы поняли идею). Вычтите 1 из соответствующего оператора End. Используйте <TAB> для каждого отступа.

б) Не используйте выбор. Обязательная ссылка на Как избежать использования Select в Excel VBA

c) Вы используете правильную технику, чтобы получить последний ряд. Однако это уже возвращает значение Long, нет необходимости приводить его с помощью CInt. По причинам отладки лучше записать это в переменную перед ее использованием. Кстати, вам следует объявить свою переменную j как Long (и, возможно, подумать о лучшем имени).

г) Ваша техника чтения ячейки работает, но она излишне сложна. Просто используйте Cells(j, 1)

Код может выглядеть так:

Const asnum = "searchingvalue"
Dim allAsNum As Range
Dim rowCount as long, curRow as long

With ThisWorkbook.Sheets("Full Log")   
    rowCount = .Cells(.Rows.Count, "A").End(xlUp).Row
    For curRow = 2 To rowCount 
        If .Cells(curRow , 1).Value = asnum Then
            If allAsNum Is Nothing Then
                Set allAsNum = .Cells(curRow, 1)
            Else
                Set allAsNum = Union(allAsNum, .Cells(curRow, 1)) 
            End If
        End If
    Next curRow 
End With
' (The destination of the following copy needs to be adapted to your needs)
allAsNum.EntireRow.Copy ThisWorkbook.Sheets("Sheet1").Range("A1")
person FunThomas    schedule 01.04.2021
comment
Одно замечание, которое я не указал. Если вы используете EntireRow, ваша вставка должна быть в столбце A. Строка может измениться, но столбец должен быть первым столбцом, иначе вы получите сообщение об ошибке, так как вы не можете вставить всю строку в часть строки. - person Scott Craner; 01.04.2021