Vba 如何缩短具有多个大小写的条件格式表达式
我已经编写了一个宏,它根据另一个工作表中指定的限值为实验室报告中的污染物值着色。然而,由于有27种不同的污染物,每种污染物都有五个不同的限值(污染等级),因此我必须编写27个(相当长的)表达式来为每种情况应用格式。因此,整个宏变得难以管理 实验室报告采用转置表格格式,案例以行而不是列的形式出现,第一个案例从第7行开始。 宏的结构如下所示:Vba 如何缩短具有多个大小写的条件格式表达式,vba,excel,conditional-formatting,Vba,Excel,Conditional Formatting,我已经编写了一个宏,它根据另一个工作表中指定的限值为实验室报告中的污染物值着色。然而,由于有27种不同的污染物,每种污染物都有五个不同的限值(污染等级),因此我必须编写27个(相当长的)表达式来为每种情况应用格式。因此,整个宏变得难以管理 实验室报告采用转置表格格式,案例以行而不是列的形式出现,第一个案例从第7行开始。 宏的结构如下所示: 识别特定案例的行标题,例如砷 Set rngHeaderAs = Range("A7").CurrentRegion.Find("As*Arsen*", Lo
Set rngHeaderAs = Range("A7").CurrentRegion.Find("As*Arsen*", LookAt:=xlPart)
Set rngAs = Range(rngHeaderAs, rngHeaderAs.End(xlToRight))
AsAddress = rngAs.Address(False, False)
Dim Ul1As As Double
Ul1As = Worksheets("Grenseverdier_jord").Cells(2, "B").Value
Dim Ul2As As Double
Ul2As = Worksheets("Grenseverdier_jord").Cells(2, "C").Value
Dim Ul3As As Double
Ul3As = Worksheets("Grenseverdier_jord").Cells(2, "D").Value
Dim Ul4As As Double
Ul4As = Worksheets("Grenseverdier_jord").Cells(2, "E").Value
Dim Ul5As As Double
Ul5As = Worksheets("Grenseverdier_jord").Cells(2, "F").Value
With rngAs
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(" & AsAddress & ");" & AsAddress & "<" & Ul1As & ")"
.FormatConditions(1).Interior.ColorIndex = 33
.FormatConditions(1).Borders.LineStyle = xlContinuous
.FormatConditions(1).Borders.Weight = xlThin
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(" & AsAddress & ");" & AsAddress & ">=" & Ul1As & ";" & AsAddress & "<" & Ul2As & ")"
.FormatConditions(2).Interior.ColorIndex = 4
.FormatConditions(2).Borders.LineStyle = xlContinuous
.FormatConditions(2).Borders.Weight = xlThin
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(" & AsAddress & ");" & AsAddress & ">=" & Ul2As & ";" & AsAddress & "<" & Ul3As & ")"
.FormatConditions(3).Interior.ColorIndex = 6
.FormatConditions(3).Borders.LineStyle = xlContinuous
.FormatConditions(3).Borders.Weight = xlThin
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(" & AsAddress & ");" & AsAddress & ">=" & Ul3As & ";" & AsAddress & "<" & Ul4As & ")"
.FormatConditions(4).Interior.ColorIndex = 45
.FormatConditions(4).Borders.LineStyle = xlContinuous
.FormatConditions(4).Borders.Weight = xlThin
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(" & AsAddress & ");" & AsAddress & ">=" & Ul4As & ";" & AsAddress & "<" & Ul5As & ")"
.FormatConditions(5).Interior.ColorIndex = 3
.FormatConditions(5).Borders.LineStyle = xlContinuous
.FormatConditions(5).Borders.Weight = xlThin
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(" & AsAddress & ");" & AsAddress & ">=" & Ul5As & ")"
.FormatConditions(6).Interior.ColorIndex = 7
.FormatConditions(6).Borders.LineStyle = xlContinuous
.FormatConditions(6).Borders.Weight = xlThin
.FormatConditions.Add xlExpression, Formula1:="=LEFT(" & AsAddress & ";1)=""<"""
.FormatConditions(7).Interior.ColorIndex = 33
.FormatConditions(7).Borders.LineStyle = xlContinuous
.FormatConditions(7).Borders.Weight = xlThin
.FormatConditions.Add xlExpression, Formula1:="=(" & AsAddress & ") = ""n.d."""
.FormatConditions(8).Interior.ColorIndex = 33
.FormatConditions(8).Borders.LineStyle = xlContinuous
.FormatConditions(8).Borders.Weight = xlThin
End With
带有rngAs的
.FormatConditions.Add Xexpression,Formula1:=“=和(ISNUMBER(“&AsAddress&”)”&AsAddress&“=”&Ul1As&“;”&AsAddress&“=”&Ul2As&“;”&AsAddress&“=”&Ul3As&“;&AsAddress&“=”&Ul4As&“;&AsAddress&“&Ul5As&”)
.FormatConditions(6).Interior.ColorIndex=7
.FormatConditions(6).Borders.LineStyle=xlContinuous
.FormatConditions(6).Borders.Weight=xlThin
.FormatConditions.Add Xexpression,公式1:=“=左(“&AsAddress&“1”)=”“使用find函数并将分析文件中的污染物名称与包含限值的工作表中的污染物名称进行比较,我只需定义一次限值和条件格式。这就像一个符咒,对限值工作表a列中定义的所有污染物应用条件格式:
Dim FndStr As String
Dim FndRng As Range
Dim Ul1 As Double, Ul2 As Double, Ul3 As Double, Ul4 As Double, Ul5 As Double
Dim ws As Worksheet: Set ws = ActiveSheet 'declare and set your worksheet, amend as required
Lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row 'get the last row with data on Column A
For I = 1 To Lastrow
FndStr = ws.Range("A" & I).Value
Set FndVal = Worksheets("Grenseverdier_jord").Columns("A:A").Find(what:=FndStr, Lookat:=xlWhole)
If Not FndVal Is Nothing Then
Ul1 = FndVal.Offset(0, 1)
Ul2 = FndVal.Offset(0, 2)
Ul3 = FndVal.Offset(0, 3)
Ul4 = FndVal.Offset(0, 4)
Ul5 = FndVal.Offset(0, 5)
Set FndRng = Range(Cells(I, 2), Cells(I, Cells(I, Columns.Count).End(xlToLeft).Column))
With ActiveSheet
With FndRng
.NumberFormat = "General"
'Upper Limit 1
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & "<" & Ul1 & ")"
.FormatConditions(1).Interior.ColorIndex = 33
.FormatConditions(1).Borders.LineStyle = xlContinuous
.FormatConditions(1).Borders.Weight = xlThin
'Upper Limit 2
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul1 & ";B" & I & "<" & Ul2 & ")"
.FormatConditions(2).Interior.ColorIndex = 4
.FormatConditions(2).Borders.LineStyle = xlContinuous
.FormatConditions(2).Borders.Weight = xlThin
'Upper Limit 3
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul2 & ";B" & I & "<" & Ul3 & ")"
.FormatConditions(3).Interior.ColorIndex = 6
.FormatConditions(3).Borders.LineStyle = xlContinuous
.FormatConditions(3).Borders.Weight = xlThin
'Upper Limit 4
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul3 & ";B" & I & "<" & Ul4 & ")"
.FormatConditions(4).Interior.ColorIndex = 45
.FormatConditions(4).Borders.LineStyle = xlContinuous
.FormatConditions(4).Borders.Weight = xlThin
'Upper Limit 5
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul4 & ";B" & I & "<" & Ul5 & ")"
.FormatConditions(5).Borders.LineStyle = xlContinuous
.FormatConditions(5).Borders.Weight = xlThin
.FormatConditions(5).Interior.ColorIndex = 3
'Over Upper Limit 5
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul5 & ")"
.FormatConditions(6).Interior.ColorIndex = 7
.FormatConditions(6).Borders.LineStyle = xlContinuous
.FormatConditions(6).Borders.Weight = xlThin
'n.d.
.FormatConditions.Add xlExpression, Formula1:="=(B" & I & ") = ""n.d."""
.FormatConditions(9).Interior.ColorIndex = 33
.FormatConditions(9).Borders.LineStyle = xlContinuous
.FormatConditions(9).Borders.Weight = xlThin
End With
End With
End If
Next I
Dim FndStr作为字符串
变暗FndRng As范围
尺寸Ul1为双精度,Ul2为双精度,Ul3为双精度,Ul4为双精度,Ul5为双精度
将ws设置为工作表:设置ws=ActiveSheet'声明并设置工作表,根据需要进行修改
Lastrow=ws.Cells(ws.Rows.Count,“A”).End(xlUp).row'获取最后一行,其中包含列A上的数据
对于I=1到最后一行
FndStr=ws.Range(“A”&I).Value
设置FndVal=工作表(“Grenseverdier_jord”)。列(“A:A”)。查找(what:=FndStr,Lookat:=xlWhole)
如果不是FndVal什么都不是
Ul1=FndVal.偏移量(0,1)
Ul2=FndVal.偏移量(0,2)
Ul3=FndVal.偏移量(0,3)
Ul4=FndVal.偏移量(0,4)
Ul5=FndVal.偏移量(0,5)
设置FndRng=范围(单元格(I,2),单元格(I,单元格(I,Columns.Count).End(xlToLeft.Column))
使用ActiveSheet
使用FndRng
.NumberFormat=“一般”
'上限1
.FormatConditions.Add Xexpression,公式1:=“=和(ISNUMBER(B”&I&“;B”&I&“=”&Ul1&“B”&I&“=”&Ul2&“B”&I&“=”&Ul3&“B”&I&“&Ul4&“B”&I&“&Ul5&”)
.FormatConditions(6).Interior.ColorIndex=7
.FormatConditions(6).Borders.LineStyle=xlContinuous
.FormatConditions(6).Borders.Weight=xlThin
”“没有。
.FormatConditions.Add xlExpression,公式1:=“(B&I&”)n.d.“
.FormatConditions(9).Interior.ColorIndex=33
.FormatConditions(9).Borders.LineStyle=xlContinuous
.FormatConditions(9).Borders.Weight=xlThin
以
以
如果结束
接下来我
我希望其他人也会发现这种方法很有用。使用VBA而不是条件格式界面背后的原因是什么?为了将过程自动化为一个按钮操作,每次都执行相同的操作。您希望格式条件根据特定单元格的值而变化,对吗?是,并且每一行和每一列的格式设置标准都会有所不同。也就是说,每一行将根据一组标准进行评估。我还认为一两条规则就可以了。我已经记不清我在这里看到过多少复杂的VBA问题,其中包含了不必要的代码,但我不知道条件格式能够实现什么,基本上是试图重新编写已经内置的功能。单个[正确创建的]规则可以影响任意数量的行/列,每个行/列基于工作簿或其他地方的不同公式或值。这里有一些很棒的教程。
Dim FndStr As String
Dim FndRng As Range
Dim Ul1 As Double, Ul2 As Double, Ul3 As Double, Ul4 As Double, Ul5 As Double
Dim ws As Worksheet: Set ws = ActiveSheet 'declare and set your worksheet, amend as required
Lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row 'get the last row with data on Column A
For I = 1 To Lastrow
FndStr = ws.Range("A" & I).Value
Set FndVal = Worksheets("Grenseverdier_jord").Columns("A:A").Find(what:=FndStr, Lookat:=xlWhole)
If Not FndVal Is Nothing Then
Ul1 = FndVal.Offset(0, 1)
Ul2 = FndVal.Offset(0, 2)
Ul3 = FndVal.Offset(0, 3)
Ul4 = FndVal.Offset(0, 4)
Ul5 = FndVal.Offset(0, 5)
Set FndRng = Range(Cells(I, 2), Cells(I, Cells(I, Columns.Count).End(xlToLeft).Column))
With ActiveSheet
With FndRng
.NumberFormat = "General"
'Upper Limit 1
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & "<" & Ul1 & ")"
.FormatConditions(1).Interior.ColorIndex = 33
.FormatConditions(1).Borders.LineStyle = xlContinuous
.FormatConditions(1).Borders.Weight = xlThin
'Upper Limit 2
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul1 & ";B" & I & "<" & Ul2 & ")"
.FormatConditions(2).Interior.ColorIndex = 4
.FormatConditions(2).Borders.LineStyle = xlContinuous
.FormatConditions(2).Borders.Weight = xlThin
'Upper Limit 3
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul2 & ";B" & I & "<" & Ul3 & ")"
.FormatConditions(3).Interior.ColorIndex = 6
.FormatConditions(3).Borders.LineStyle = xlContinuous
.FormatConditions(3).Borders.Weight = xlThin
'Upper Limit 4
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul3 & ";B" & I & "<" & Ul4 & ")"
.FormatConditions(4).Interior.ColorIndex = 45
.FormatConditions(4).Borders.LineStyle = xlContinuous
.FormatConditions(4).Borders.Weight = xlThin
'Upper Limit 5
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul4 & ";B" & I & "<" & Ul5 & ")"
.FormatConditions(5).Borders.LineStyle = xlContinuous
.FormatConditions(5).Borders.Weight = xlThin
.FormatConditions(5).Interior.ColorIndex = 3
'Over Upper Limit 5
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & ");B" & I & ">=" & Ul5 & ")"
.FormatConditions(6).Interior.ColorIndex = 7
.FormatConditions(6).Borders.LineStyle = xlContinuous
.FormatConditions(6).Borders.Weight = xlThin
'n.d.
.FormatConditions.Add xlExpression, Formula1:="=(B" & I & ") = ""n.d."""
.FormatConditions(9).Interior.ColorIndex = 33
.FormatConditions(9).Borders.LineStyle = xlContinuous
.FormatConditions(9).Borders.Weight = xlThin
End With
End With
End If
Next I