Использование циклов for в VBA для идентификации строк - PullRequest
0 голосов
/ 27 июня 2019

Я обычно пишу код с помощью R, и я впервые пишу обо всем, что связано с VB, поэтому я извиняюсь за этот новый вопрос.Заранее я попытался найти решение здесь , здесь и здесь , но без особого успеха.

Я пытаюсьвыделите строку на основе содержимого строки ячейки в первом столбце.Например, если ячейка в первом столбце содержит строку «Всего», то я бы хотел выделить весь ряд более темным цветом.

Вот что у меня есть:

Sub tryrow()
    Dim Years
    Dim rownum As String

    Years = Array("2007", "2008", "2009") ' short example 
    For i = 0 To UBound(Years)
        Set rownum = Range("A:A").Find(Years(i) & " Total", LookIn:=xlValues).Address
        Range(rownum, Range(rownum).End(xlToRight)).Interior.ColorIndex = 1
    Next i
End Sub

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю это сообщение об ошибке при попытке запустить sub:

Ошибка компиляции: требуется объект

Редактор макросов выделяет rownum =, как если бы этот объект не был инициализирован с Dim rownum As String.Кто-нибудь знает, что я могу делать не так?Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

У вас здесь есть пара проблем, указанных ниже вместе с исправлением:

Sub tryrow()
    Dim Years() As String 'Best practice is to dim all variables with types. This makes catching errors early much easier
    Dim rownum As Range 'Find function returns a range, not a string

    Years = Array("2007", "2008", "2009") ' short example
    For i = 0 To UBound(Years)
        Set rownum = Range("A:A").Find(Years(i) & " Total", LookIn:=xlValues) 'Return the actual range, not just the address of the range (which is a string)
        If Not rownum Is Nothing Then 'Make sure an actual value was found
            rownum.EntireRow.Interior.ColorIndex = 15 'Instead of trying to build row range, just use the built-in EntireRow function. Also, ColorIndex for gray is 15 (1 is black, which makes it unreadable)
        End If
    Next i
End Sub
0 голосов
/ 27 июня 2019

Вы можете избежать зацикливания, используя автофильтр, который будет работать намного быстрее.Код предполагает, что таблица начинается с ячейки A1:

Sub HighlightRows()

    Dim rng As Range, rngData As Range, rngVisible As Range
    '//All table
    Set rng = Range("A1").CurrentRegion
    '//Table without header
    With rng
        Set rngData = .Offset(1).Resize(.Rows.Count - 1)
    End With
    rng.AutoFilter Field:=1, Criteria1:="*Total*"
    '// Need error handling 'cause if there are no values, error will occur
    On Error Resume Next
    Set rngVisible = rngData.SpecialCells(xlCellTypeVisible)
    If Err = 0 Then
        rngVisible.EntireRow.Interior.ColorIndex = 1
    End If
    On Error GoTo 0

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...