Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 循环以检查单元格值是否满足条件_Vba_Excel 2013 - Fatal编程技术网

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
问题,它已经被贴了很多次了,但是我似乎不知道什么应该是简单的逻辑。下面概述了我试图完成的步骤:

  • 循环遍历范围AllScores中的所有单元格
  • 查看
    左侧(wsRR.范围(“H32”),1)
    是否为“P”或“G”
  • 如果AllScore范围内的任何单元格的值介于1和4之间,且上述#2为真,则Label143和RR#u Score=“可接受06”的标题为真
  • 如果AllScores范围内所有单元格的值均大于等于5,则Label143和RR#u Scores的标题=范围wsRR的值。(“H32”),或者如果AllScores范围内每个单元格的值均大于等于5且上面的#2为真或假,则标签RR#u Scores和Label143=wsRR的标题均为真或假。(“H32”)

    端接头


  • 我怀疑这会解决你的问题,但这太长了,无法发表评论

    我按照当前的状态重新构建了代码,并删除了冗余/不需要的行。 在你的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
    中的任何单元格是@TimWilliams
    Dim 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