Excel VBA обновляет заполнение ячеек на основе критериев

Мой код находится в VBA и обновляет значение ячейки на основе двух критериев. Я довольно подробно прокомментировал свой код, поэтому сначала вставлю его ниже. Я изменил комментарии, добавив еще два апострофа, чтобы было немного легче определить разницу между комментариями и кодом на этой платформе.

Sub HighlightValues()

'''Shortcut key: ctrl + w

'''Highlights values of corresponding left-most cell, if two conditions are met:
'''The part is in "L" class and all of the rightmost cells are empty

Dim ws As Worksheet
Dim i As Long, lastrow As Long, lastcolumn As Long, c As Long, d As Long, j As Long, count As Long, k As Long, report As Long
Set ws = Sheets("QAP")

lastrow = ws.Cells(Rows.count, 1).End(xlUp).Row
lastcolumn = ws.Cells(1, ws.Columns.count).End(xlToLeft).Column

'''Searches column titles for "Analysis Task Count"
'''where it will start searching for filled boxes on each row
For i = 1 To lastrow
    If InStr(ws.Cells(1, i), "Analysis Task Count") Then
        '''c is the number of column that Analysis Task Count is in
        c = i - 1
    End If
Next

'''Searches column titles for "Required by RPC"
'''where it will search for whether the part is "L' or not
For d = 1 To lastcolumn
    If InStr(ws.Cells(1, d), "Required by RPC") Then
        '''k is the number of column that Required by RPC is in
        k = d
    End If
Next d

'''For each row that part data is in
For i = 11 To lastrow
    count = 0

    '''If any cells past Analysis Task Count are filled, remember that
    For j = c To lastcolumn
        If Not IsEmpty(ws.Cells(i, j)) Then
            count = 1
        End If
    Next j

    '''If the stage is L and all the cells are empty for that row
    If Cells(i, k).Value = ("L") And count = 0 Then
        '''Highlight the first box in green
        Cells(i, 1).Interior.Color = RGB(102, 255, 102)
    Else
        '''Or if thats not true, then make that box clear
        Cells(i, 1).Interior.Color = xlNone
        report = report + 1
    End If
Next i
MsgBox (report)
End Sub

Чтобы провести вас по коду (за исключением пробелов, некоторое форматирование не было перенесено), код сначала ищет номер столбца двух критических столбцов, а затем в последнем цикле for для каждой строки он ищет два критерии соблюдены. Если критерии соблюдены, ячейка становится зеленой, если нет, она заполняется пустой. Я потратил около часа на подтверждение того, что значения, возвращаемые k и c, являются правильным номером столбца: я не думаю, что это проблема. Кроме того, когда я устанавливаю счетчик, чтобы увидеть, сколько раз код проходит последний цикл for и каждый оператор if, я получаю правильное количество циклов.

Это очень расстраивает, единственная странность в том, что код выполняется почти мгновенно, так что задержки нет вообще. И, конечно же, заполнение ячейки не меняется. Чтобы проверить это, я запустил код, заполняющий ячейки оранжевым цветом, и никаких изменений в ячейках не произошло.

Спасибо за любую помощь, которую я могу получить!


person Gregory Haegele    schedule 14.07.2015    source источник
comment
Я не знаю, что такое проход? Я использую Dim для их инициализации, затем вычисляю их значения, затем использую значения в последнем цикле.   -  person Gregory Haegele    schedule 14.07.2015
comment
Почему вы устанавливаете c в текущий столбец - 1 c = i - 1 . Затем он просматривает столбцы, начиная с c. Не зная ваших данных, мой тест не имеет ничего в c, поэтому он всегда получает значение count = 1 и никогда не переходит в оператор if для окрашивания ячейки.   -  person MatthewD    schedule 14.07.2015
comment
К вашему сведению, вы можете получить последнюю строку и столбец следующим образом. Для i = 1 To ws.UsedRange.Rows.count или Для i = 1 To ws.UsedRange.Columns.count   -  person MatthewD    schedule 14.07.2015


Ответы (2)


Часть, отвечающая за поиск рабочего листа Analysis Task Count, кажется мне неправильной.

For i = 1 To lastrow         '<---- why [lastrow]? should be [lastcolumn]
    If InStr(ws.Cells(1, i), "Analysis Task Count") Then
        '''c is the number of column that Analysis Task Count is in
        c = i - 1            '<---- why subtracting 1?
    End If
Next

Если вы просматриваете заголовки столбцов, почему вы используете счетчик [lastrow] в качестве верхней границы для вашего цикла. Кроме того, я не понимаю, почему вы вычитаете 1 после того, как найдете столбец с таким заголовком.

Из-за этого у вас неправильный индекс столбца и вы сравниваете неверные наборы данных.

person mielk    schedule 14.07.2015

1-й. Изменить: ws.Cells(Rows.count, 1) на: ws.Cells(ws.Rows.count, 1) Это не имеет никакого эффекта, но «более правильно».

  1. Хм

    For i = 1 To lastrow
        If InStr(ws.Cells(1, i), "Analysis Task Count") Then
            c = i - 1
    

Измените lastrow на lastcolumn Измените c = i - 1 на c = i

  1. Зачем начинать с 11, а другие циклы начинаются с 1.

        For i = 11 To lastrow
    
  2. Пожалуйста, используйте более осмысленные полные имена переменных - их трудно читать, например

    "iCol" for a column counter
    "iRow" for a row counter
    instead of "k" use "ColumnNumWithReqByRPVC"
    etc..
    
  3. Вы правильно используете instr? См. здесь

    InStr([start, ]string1, string2[, compare])
    
  4. Изменять

    Cells(i, 1).Interior.Color 
    To
    ws.Cells(i, 1).Interior.Color 
    

Изменение вышеуказанного может заставить его работать? дай мне знать.

person HarveyFrench    schedule 14.07.2015