Ошибка при форматировании условий с использованием VBA

#excel #vba

#excel #vba

Вопрос:

Я работаю над проектом, в котором я сравниваю столбец D со столбцом C листа («Серверная часть»), и разница показана в столбце E (в %). Я хотел бы выделить % разницы (столбец E) КРАСНЫМ цветом, где разница меньше -10,00% и больше 10,00%. Затем хотелось бы скопировать эти элементы из столбца B, соответствующего каждой выделенной ячейке, и вставить их в лист («СРЕДСТВО ОБНОВЛЕНИЯ») под ячейкой A7.

Прилагается скриншот для справки

введите описание изображения здесь

 Sub check_date()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim wsData As Worksheet, Datasht As Worksheet, lRow As Integer


Set wsData = Sheets("UPDATER")
Set Datasht = Sheets("Backend")
lRow = Datasht.Cells(Rows.Count, 13).End(xlUp).Row


wsData.Range("M8:M" amp; lRow).Interior.ColorIndex = xlNone
wsData.Range("M8:M" amp; lRow).FormatConditions.Add Type:=xlExpression, Formula1:="=AND(M8>=EOMONTH(TODAY(),-2) 1,M8<EOMONTH(TODAY(),-1))"
wsData.Range("M8:M" amp; lRow).FormatConditions(wsData.Range("M8:M" amp; lRow).FormatConditions.Count).SetFirstPriority
 With wsData.Range("M8:M" amp; lRow).FormatConditions(1).Interior
 .Color = RGB(255, 255, 0)
 .TintAndShade = 0
 End With
 wsData.Range("M8:M" amp; lRow).FormatConditions(1).StopIfTrue = False
 Range("M8").Select

End Sub
  

Комментарии:

1. «ошибка получения» — это не очень полезное описание конкретной проблемы, с которой вы столкнулись? Если появляется сообщение об ошибке, что это такое и какая строка выделяется при нажатии «Debug»?

2. 1) Datasht. Диапазон («E» и lRow). FormatConditions. Добавьте тип:=xlCellValue, Оператор:=XLL, Formula1:=»=-0.1″ 2) Datasht. Диапазон («E» и lRow). FormatConditions. Добавить тип:=xlCellValue, Operator:=xlGreater, Formula1:=»= 0.1″ эти две строки на самом деле мало что делают, ни одна ячейка в столбце E не выделяется в соответствии с определенным условием, поэтому ни одна строка не фильтруется в соответствии с цветовым фильтром и не копируется на другой лист.

3. Я не эксперт, но похоже, что все, что вы делаете, относится только к последней строке в столбце E. Должно быть больше похоже на Range("E1:E" amp; lRow) и т.д. Но я бы использовал For цикл, идущий от начала до конца, проверяя, превышает ли он 10% и меньше -10%. Затем просто используйте стандартное условное форматирование, чтобы изменить цвет текста, если вы этого хотите. На мой взгляд, цикл For чище, быстрее и проще, чем автофильтр.

4. Я попытался использовать цикл for и получил «ошибку несоответствия типов», я также прикрепил скриншот для вашей справки.

5. Попробовал ваш цикл самостоятельно и работал нормально. Вы не затемнили свою ячейку. Попробуйте Dim cell As Variant

Ответ №1:

Вот что я получил. Это немного радикальное изменение, но я надеюсь, что это действительно то, к чему вы стремитесь.

 Sub formatcondition()
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim wsData As Worksheet, Datasht As Worksheet, lRow As Integer, My_Range As Range, i As Integer, iRow As Integer, cell As Variant, RowNum As Long, lRowUpdater As Long

Set wsData = Sheets("UPDATER")
Set Datasht = Sheets("Backend")
lRow = Datasht.Cells(Rows.Count, 5).End(xlUp).Row
lRowUpdater = wsData.Cells(Rows.Count, 1).End(xlUp).Row
RowNum = 8 'setting the first row in the UPDATER sheet


Datasht.Range("E1:E" amp; lRow).Interior.ColorIndex = xlNone 'Reset the color before running
wsData.Range("A8:D" amp; lRowUpdater   8).ClearContents 'clear your updater sheet. Remove if not needed.

For i = 1 To lRow
    On Error GoTo Continue
    If Datasht.Range("E" amp; i).Value < -0.1 Or Datasht.Range("E" amp; i).Value > 0.1 Then 'If greater than or less than
        Datasht.Range("E" amp; i).Interior.ColorIndex = 6 'Change the color of affected cells if you need that
        wsData.Range(wsData.Cells(RowNum, 1), wsData.Cells(RowNum, 4)).Value = _
        Datasht.Range(Datasht.Cells(i, 2), Datasht.Cells(i, 5)).Value 'straight copy the values from the cells as it loops rather than using copy/paste
        wsData.Range(wsData.Cells(RowNum, 2), wsData.Cells(RowNum, 4)).NumberFormat = "0.00%" 'change the number format of outputted cells to percentages (if needed)
        RowNum = RowNum   1 'move to the next row in the output
    End If
Continue:
Resume Nexti
Nexti:
Next i

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub
  

Редактировать:

Для даты добавления года моя версия будет просто дополнять то, что я указал ранее. Вместо этого мы теперь добавляем AND функцию для хранения OR , затем проверяем, является ли YEAR в ячейке текущий год. Если вам нужен только этот год, мы также можем отказаться от инструкции IF, которая проверяла, что если текущий месяц был январем, он включал бы декабрь. Но если это не нужно, то:

=AND(OR(MONTH(NOW())=MONTH(M8),MONTH(NOW())-1=MONTH(M8)),YEAR(M8)=YEAR(NOW()))

Или

=AND(MONTH(M8)>=MONTH(NOW())-1,MONTH(M8)<MONTH(NOW()) 1,YEAR(M8)=YEAR(NOW()))

Оба имеют одинаковую длину и выполняют одно и то же, только по-разному.

Комментарии:

1. Большое спасибо, Саймон, за вашу помощь, я протестировал код, он работает как шарм, когда я запускаю его с помощью клавиши F8, но когда я использую клавишу F5, он останавливается и выдает сообщение об ошибке НЕСООТВЕТСТВИЯ ТИПА в этой строке кода. Если данные отсутствуют. Диапазон («E» и i). Значение < -0.1 Или Datasht. Диапазон («E» и i). Значение > 0.1, затем ‘Если больше или меньше, чем

2. я думаю, я понял причину, столбец E (серверная часть листа) также может иметь значения #NA, поэтому он показывает ошибку несоответствия типов.

3. для борьбы с этим я использовал =IFERROR(D1-C1),»»), чтобы сделать ячейки #NA пустыми, можем ли мы что-то сделать, чтобы они не копировали значения ячеек #NA / Blank в лист ОБНОВЛЕНИЯ?

4. Ах, я не удалил ошибку на случай, если их было больше. Я проверил только одну ошибку, поэтому не увидел проблемы. В основном ниже Continue: добавьте Resume Nexti затем Nexti: , и это сработает. Resume сообщает Excel продолжить код как есть. Я также обновил ответ.

5. можем ли мы добавить код для выделения дат в столбце M, которые происходят в этом месяце или произошли в предыдущем месяце. я пытался использовать условное форматирование, но это не помогло.