Vba 循环以检查单元格值是否满足条件
请原谅这个新手的Vba 循环以检查单元格值是否满足条件,vba,excel-2013,Vba,Excel 2013,请原谅这个新手的loop问题,它已经被贴了很多次了,但是我似乎不知道什么应该是简单的逻辑。下面概述了我试图完成的步骤: 循环遍历范围AllScores中的所有单元格 查看左侧(wsRR.范围(“H32”),1)是否为“P”或“G” 如果AllScore范围内的任何单元格的值介于1和4之间,且上述#2为真,则Label143和RR#u Score=“可接受06”的标题为真 如果AllScores范围内所有单元格的值均大于等于5,则Label143和RR#u Scores的标题=范围wsRR的值。(
loop
问题,它已经被贴了很多次了,但是我似乎不知道什么应该是简单的逻辑。下面概述了我试图完成的步骤:
左侧(wsRR.范围(“H32”),1)
是否为“P”或“G”我怀疑这会解决你的问题,但这太长了,无法发表评论 我按照当前的状态重新构建了代码,并删除了冗余/不需要的行。 在你的1-8圈中有一些古怪的事情。你可能需要退一步,重新思考一下这里的逻辑
如果您只想知道该范围的值是否低于某个阈值,您可以使用
Min
函数这样做,并像这样舍弃循环
If Application.WorksheetFunction.Min(aScores) <= 4 Then
a = 0
Else
a = 1
End If
这是我能得到的最接近的结果,因为我很确定我没有遵循你的逻辑:
Sub ScoringUpdateAmounts()
Dim aScores As Range, wb As Workbook, wsRR As Worksheet
Dim a As Long, wspGen As Worksheet, cell As Range
Dim i As Long, v, numL As Long, numH As Long, rating, capt
Set wb = ThisWorkbook
Set wsRR = wb.Sheets("RiskRating")
Set wspGen = wb.Sheets("pGeneralInfo")
Set aScores = wsRR.Range("AllScores")
For Each cell In aScores
v = cell.Value
If IsNumeric(v) And Len(v) > 0 Then
If v > 0 And v <= 4 Then
numL = numL + 1
ElseIf v > 4 And v <= 8 Then
numH = numH + 1
End If
End If
Next cell
rating = UCase(wsRR.Range("H32").Value)
If rating Like "GOOD*" Or rating Like "PRIME*" Then
If numL > 0 Then
capt = "ACCEPTABLE 06"
ElseIf numL = 0 And numH > 0 Then
capt = rating
End If
End If
If Len(capt) > 0 Then
RiskCalc.RR_Score.Caption = capt
RisKRating.Label143.Caption = capt
wspGen.Range("genRR") = capt
wspGen.Range("genJHARiskRating") = capt
End If
End Sub
Sub-ScoringUpdateAmounts()
作为范围,wb作为工作簿,wsRR作为工作表
将一个尺寸标注为长,将wspGen标注为工作表,将单元格标注为范围
尺寸i等于长,v等于长,numL等于长,numH等于长,额定值,船长
设置wb=ThisWorkbook
设置wsRR=wb.Sheets(“风险评级”)
设置wspGen=wb.Sheets(“pGeneralInfo”)
设置aScores=wsRR.Range(“所有分数”)
对于aScores中的每个单元格
v=单元值
如果IsNumeric(v)和Len(v)>0,则
如果v>0,v4和v0,则
capt=“可接受06”
如果numL=0且numH>0,则
机长=额定功率
如果结束
如果结束
如果Len(capt)>0,则
RiskCalc.RR_Score.Caption=capt
RisKRating.Label143.Caption=船长
wspGen.Range(“GENR”)=机长
wspGen.Range(“genJHARiskRating”)=船长
如果结束
端接头
我喜欢不在整个范围内循环的解决方案,只使用Min
函数,我也喜欢@TimWilliams使用评级变量的方式,因此我将两个单独的解决方案与一些标签格式编辑结合在一起,效果非常好。下面是我最终使用的代码。感谢你们的耐心和帮助。很抱歉,我无法检查您作为解决方案提供的两个答案
Sub LessThanFour()
Dim aScores As Range
Dim a As Long
Dim i As Long, rating, capt
Set wb = Application.ThisWorkbook
Set wsRR = wb.Sheets("RiskRating")
Set wspGen = wb.Sheets("pGeneralInfo")
Set aScores = wsRR.Range("AllScores")
If Application.WorksheetFunction.Min(aScores) <= 4 Then
a = 0
Else
a = 1
End If
rating = UCase(wsRR.Range("H32").Value)
If rating Like "GOOD*" Or rating Like "PRIME*" Then
If a = 0 Then
capt = "ACCEPTABLE 06"
Else
capt = rating
End If
End If
If Len(capt) > 0 Then
RiskCalc.RR_Score.Caption = capt
RisKRating.Label143.Caption = capt
wspGen.Range("genRR") = capt
wspGen.Range("genJHARiskRating") = capt
End If
With RiskCalc.RR_Score
.Visible = True
Select Case Right(capt, 1)
Case 1 To 3: .BackColor = vbRed
Case 4 To 5: .BackColor = vbYellow
Case 6 To 7: .BackColor = vbGreen
Case Is >= 8
.BackColor = RGB(0, 153, 255)
.ForeColor = vbWhite
End Select
.Font.Size = 20
.Font.Bold = True
.TextAlign = fmTextAlignCenter
.BorderStyle = fmBorderStyleSingle
End With
With RisKRating.Label143
.Visible = True
Select Case Right(capt, 1)
Case 1 To 3: .BackColor = vbRed
Case 4 To 5: .BackColor = vbYellow
Case 6 To 7: .BackColor = vbGreen
Case Is >= 8
.BackColor = RGB(0, 153, 255)
.ForeColor = vbWhite
End Select
.Font.Size = 16
.Font.Bold = True
.TextAlign = fmTextAlignCenter
.BorderStyle = fmBorderStyleSingle
End With
End Sub
Sub-LessThanFour()
作为射程
暗淡如长
长、额定值、上尉的尺寸i
设置wb=Application.ThisWorkbook
设置wsRR=wb.Sheets(“风险评级”)
设置wspGen=wb.Sheets(“pGeneralInfo”)
设置aScores=wsRR.Range(“所有分数”)
如果Application.WorksheetFunction.Min(aScores)为0,则
RiskCalc.RR_Score.Caption=capt
RisKRating.Label143.Caption=船长
wspGen.Range(“GENR”)=机长
wspGen.Range(“genJHARiskRating”)=船长
如果结束
使用RiskCalc.RR_分数
.Visible=True
选择案例右侧(机长,1)
案例1到3:。背景色=vbRed
案例4至5:。背景色=vbYellow
案例6至7:。背景色=vbGreen
案例>=8
.BackColor=RGB(0、153、255)
.ForeColor=vbWhite
结束选择
.Font.Size=20
.Font.Bold=True
.TextAlign=fmTextAlignCenter
.BorderStyle=fmBorderStyleSingle
以
具有风险评级。标签143
.Visible=True
选择案例右侧(机长,1)
案例1到3:。背景色=vbRed
案例4至5:。背景色=vbYellow
案例6至7:。背景色=vbGreen
案例>=8
.BackColor=RGB(0、153、255)
.ForeColor=vbWhite
结束选择
.Font.Size=16
.Font.Bold=True
.TextAlign=fmTextAlignCenter
.BorderStyle=fmBorderStyleSingle
以
端接头
i=1到4的和i=5到8的循环的目的是什么?对于aScores
中的最后一个单元格,您将只得到a
的值。什么范围对应于aScores
?如果范围aScores
中的任何单元格是@TimWilliamsDim wb As工作簿Dim wsRR As worket aScores=wsRR.range(“AllScores”)
是,这从代码中可以明显看出,但是AllScores
的范围是什么?除了第一行之外,末尾的两个大区块基本上是相同的……我注意到了趋势,但底部的一个只指range(“H32”)
,所以不清楚它们是否需要分开。主要是等待OP承认这一点,因为这不是一个解决方案,谢谢你们两位。当我今天早上回到办公室时,我将测试这两种解决方案,并让您知道其进展情况。
Sub ScoringUpdateAmounts()
Dim aScores As Range, wb As Workbook, wsRR As Worksheet
Dim a As Long, wspGen As Worksheet, cell As Range
Dim i As Long, v, numL As Long, numH As Long, rating, capt
Set wb = ThisWorkbook
Set wsRR = wb.Sheets("RiskRating")
Set wspGen = wb.Sheets("pGeneralInfo")
Set aScores = wsRR.Range("AllScores")
For Each cell In aScores
v = cell.Value
If IsNumeric(v) And Len(v) > 0 Then
If v > 0 And v <= 4 Then
numL = numL + 1
ElseIf v > 4 And v <= 8 Then
numH = numH + 1
End If
End If
Next cell
rating = UCase(wsRR.Range("H32").Value)
If rating Like "GOOD*" Or rating Like "PRIME*" Then
If numL > 0 Then
capt = "ACCEPTABLE 06"
ElseIf numL = 0 And numH > 0 Then
capt = rating
End If
End If
If Len(capt) > 0 Then
RiskCalc.RR_Score.Caption = capt
RisKRating.Label143.Caption = capt
wspGen.Range("genRR") = capt
wspGen.Range("genJHARiskRating") = capt
End If
End Sub
Sub LessThanFour()
Dim aScores As Range
Dim a As Long
Dim i As Long, rating, capt
Set wb = Application.ThisWorkbook
Set wsRR = wb.Sheets("RiskRating")
Set wspGen = wb.Sheets("pGeneralInfo")
Set aScores = wsRR.Range("AllScores")
If Application.WorksheetFunction.Min(aScores) <= 4 Then
a = 0
Else
a = 1
End If
rating = UCase(wsRR.Range("H32").Value)
If rating Like "GOOD*" Or rating Like "PRIME*" Then
If a = 0 Then
capt = "ACCEPTABLE 06"
Else
capt = rating
End If
End If
If Len(capt) > 0 Then
RiskCalc.RR_Score.Caption = capt
RisKRating.Label143.Caption = capt
wspGen.Range("genRR") = capt
wspGen.Range("genJHARiskRating") = capt
End If
With RiskCalc.RR_Score
.Visible = True
Select Case Right(capt, 1)
Case 1 To 3: .BackColor = vbRed
Case 4 To 5: .BackColor = vbYellow
Case 6 To 7: .BackColor = vbGreen
Case Is >= 8
.BackColor = RGB(0, 153, 255)
.ForeColor = vbWhite
End Select
.Font.Size = 20
.Font.Bold = True
.TextAlign = fmTextAlignCenter
.BorderStyle = fmBorderStyleSingle
End With
With RisKRating.Label143
.Visible = True
Select Case Right(capt, 1)
Case 1 To 3: .BackColor = vbRed
Case 4 To 5: .BackColor = vbYellow
Case 6 To 7: .BackColor = vbGreen
Case Is >= 8
.BackColor = RGB(0, 153, 255)
.ForeColor = vbWhite
End Select
.Font.Size = 16
.Font.Bold = True
.TextAlign = fmTextAlignCenter
.BorderStyle = fmBorderStyleSingle
End With
End Sub