英文:
Conditional formatting also applied to spreadsheets not in range
问题
I'm here to help with the translation. Please let me know which specific parts you'd like translated.
英文:
Introduction of what it should do:
I would like conditional formatting of value E in a spreadsheet if 2 conditions are met.
Term 1: The name of the worksheet gives the spreadsheet a classification which can be found in spreadsheet "macro" in Range C11-F100:
If the spreadsheet name is not in the table that no formatting should be performed on that spreadsheet.
If the spreadsheet name is in the table than is should look in which column it is for the class (A, B, C or D)
Than it should loop through the rows in that spreadsheet (starting row 2). If column G is "settle_plate", "active_plate" or "rodac_plate" is should check if value of column E is higher then Alert of Action limit in the row that corresponds with it spreadsheets classication fo term 1. If it is it should turn either orange or red.
Problem:
I only put in "settle_plate" so far (not "active_plate" and "rodac_plate") to see if it works so far. It applies the conditional formatting in the right way on the spreadsheets where it should do it. The only problem is that is also applies the conditional formatting on all other spreadsheets where it shouldn't do any condition formatting at all.
I now vloopup probably works better, but I am not familiar with that
Dim rowNum As Long
Dim macroSheet As Worksheet
Dim macroRange As Range
Dim macroCell As Range
Dim useC5D5 As Boolean
Dim useC6D6 As Boolean
Dim useC7D7 As Boolean
Set macroSheet = ThisWorkbook.Sheets("macro")
Set macroRange = macroSheet.Range("C11:C100")
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "macro" And ws.Name <> "blad1" Then
' Clear existing conditional formatting rules
ws.Cells.FormatConditions.Delete
' Check if the worksheet name matches the range C11:C100 in "macro" sheet
useC5D5 = False
For Each macroCell In macroRange
If ws.Name = macroCell.Value Then
useC5D5 = True
Exit For
End If
Next macroCell
' If no match is found in C11:C100, check D11:D100
If Not useC5D5 Then
Set macroRange = macroSheet.Range("D11:D100")
useC6D6 = False
For Each macroCell In macroRange
If ws.Name = macroCell.Value Then
useC6D6 = True
Exit For
End If
Next macroCell
' If no match is found in D11:D100, check E11:E100
If Not useC6D6 Then
Set macroRange = macroSheet.Range("E11:E100")
useC7D7 = False
For Each macroCell In macroRange
If ws.Name = macroCell.Value Then
useC7D7 = True
Exit For
End If
Next macroCell
End If
End If
' Find the last used row in column G
lastRow = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row
' Loop through each row in column G
For rowNum = 2 To lastRow
' Settle_plate = True and Column E >= C4 each row (case-insensitive) - Orange color
If LCase(ws.Cells(rowNum, "G").Value) = LCase("settle_plate") Then
If useC5D5 Then
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C4").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
ElseIf useC6D6 Then ' Settle_plate = True and Column E >= C5 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C5").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
ElseIf useC7D7 Then ' Settle_plate = True and Column E >= C6 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C6").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
Else ' Settle_plate = True and Column E >= C7 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C7").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
End If
End If
If useC5D5 Then ' Settle_plate = True and Column E > D4 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D4").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
ElseIf useC6D6 Then ' Settle_plate = True and Column E > D5 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D5").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
ElseIf useC7D7 Then ' Settle_plate = True and Column E > D6 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D6").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
Else ' Settle_plate = True and Column E > D7 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D7").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
End If
Next rowNum
End If
Next ws
End Sub
答案1
得分: 2
我认为问题在于你在代码中留下了较早版本的部分。
在For rowNum = 2 To lastRow
之后,有一个分支:If LCase(ws.Cells(rowNum, "G").Value) = LCase("settle_plate") Then
,其中包含一个以If useC5D5 Then
开头的部分。现在这部分在End If
之后(循环内最外层的End If
)几乎完全重复了一次:If useC5D5 Then ' Settle_plate = True and Column E >= D4 each row (case-insensitive) - Red color
。
它们之间有一个区别:第一个使用>=
,第二个使用>
。
问题在于第二个部分会独立于工作表的名称而运行,并且由于所有的替代方案都包含一些格式化(涂成红色),因此总是会执行其中一个格式化命令。
或者你可能希望两个部分都存在,一个用于将事物涂成橙色,另一个用于将事物涂成红色。在这种情况下,将第二部分移到外部的if内部:
' Loop through each row in column G
For rowNum = 2 To lastRow
' Settle_plate = True and Column E >= C4 each row (case-insensitive) - Orange color
If LCase(ws.Cells(rowNum, "G").Value) = LCase("settle_plate") Then
If useC5D5 Then
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C4").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
ElseIf useC6D6 Then ' Settle_plate = True and Column E >= C5 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C5").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
ElseIf useC7D7 Then ' Settle_plate = True and Column E >= C6 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C6").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
Else ' Settle_plate = True and Column E >= C7 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C7").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
End If
If useC5D5 Then ' Settle_plate = True and Column E > D4 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D4").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
ElseIf useC6D6 Then ' Settle_plate = True and Column E > D5 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D5").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
ElseIf useC7D7 Then ' Settle_plate = True and Column E > D6 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D6").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
Else ' Settle_plate = True and Column E > D7 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D7").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
End If
End If
Next rowNum
英文:
I think the problem is that you left parts of an earlier version in your code.
After For rowNum = 2 To lastRow
there is an branch: If LCase(ws.Cells(rowNum, "G").Value) = LCase("settle_plate") Then
which contains a part starting with If useC5D5 Then
. Now this part is (almost exactly repeated after the End If
(the outermost one inside the loop): If useC5D5 Then ' Settle_plate = True and Column E > D4 each row (case-insensitive) - Red color
.
There is a difference between them: the first one uses >=
, the second one >
.
The problem is that the second one is run for each worksheet independent of its name, and one of the formatting commands is always executed since all alternatives contain some formatting (painting to red).
Or maybe you want both parts, one for coloring things orange and the other one for coloring things red. In this case, move the second part inside the outer if:
' Loop through each row in column G
For rowNum = 2 To lastRow
' Settle_plate = True and Column E >= C4 each row (case-insensitive) - Orange color
If LCase(ws.Cells(rowNum, "G").Value) = LCase("settle_plate") Then
If useC5D5 Then
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C4").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
ElseIf useC6D6 Then ' Settle_plate = True and Column E >= C5 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C5").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
ElseIf useC7D7 Then ' Settle_plate = True and Column E >= C6 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C6").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
Else ' Settle_plate = True and Column E >= C7 each row (case-insensitive) - Orange color
If ws.Cells(rowNum, "E").Value >= macroSheet.Range("C7").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 165, 0) ' Orange color
End If
End If
If useC5D5 Then ' Settle_plate = True and Column E > D4 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D4").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
ElseIf useC6D6 Then ' Settle_plate = True and Column E > D5 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D5").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
ElseIf useC7D7 Then ' Settle_plate = True and Column E > D6 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D6").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
Else ' Settle_plate = True and Column E > D7 each row (case-insensitive) - Red color
If ws.Cells(rowNum, "E").Value > macroSheet.Range("D7").Value Then
ws.Cells(rowNum, "E").Interior.Color = RGB(255, 0, 0) ' Red color
End If
End If
End If
Next rowNum
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论