逻辑操作循环 - 有复杂性

时间:2016-05-03 02:41:13

标签: excel-vba logical-operators vba excel

使用one of my previous questions的智慧,我写的是:

  • 对于每个有效Flt检查AC是否在给定数字之间
  • 对于每个AC号码范围,请检查Bkd是否超过给定数量
  • 如果符合条件,请更改字体/单元格颜色,否则跳过

请注意

  • AC是F栏; Bkd是H列; Flt是G列
  • 每个组都匹配
  • ACBkd,如下面If的每一行所示

目前,这会生成错误91,“未设置块”或“类型不匹配”错误。我已经回顾了我之前的问题,并从功能完备的代码中获取了大部分内容,但似乎无法使其正常工作。建议?

LastRow = Range("G" & Rows.Count).End(xlUp).Row
AC = Range("F9:F" & LastRow)
Bkd = Range("H9:H" & LastRow)

With ActiveSheet.Columns("G").SpecialCells(xlCellTypeConstants, xlNumbers)
    If (AC > "199" And AC < "500" And Bkd > "145") Or _
        (AC > "499" And AC < "600" And Bkd > "130") Or _
         (AC > "599" And AC < "700" And Bkd > "100") Or _
          (AC > "699" And AC < "800" And Bkd > "115") Then
        .Font.Color = vbWhite
        .Interior.Color = vbBlack
    End If
End With

这是我在下面的评论中引用的另一个尝试的代码块。

Dim AC, Bkd, Flt As Range

LastRow = Range("G" & Rows.Count).End(xlUp).Row
AC = Range("F9:F" & LastRow)
Bkd = Range("H9:H" & LastRow)

For Each Flt In ActiveSheet.Columns("G").SpecialCells(xlCellTypeConstants, xlNumbers)
    With Flt
        If (AC > "199" And AC < "500" And Bkd > "145") Or _
            (AC > "499" And AC < "600" And Bkd > "130") Or _
             (AC > "599" And AC < "700" And Bkd > "100") Or _
              (AC > "699" And AC < "800" And Bkd > "115") Then
            .Font.Color = vbWhite
            .Interior.Color = vbBlack
        End If
    End With
Next Flt

2 个答案:

答案 0 :(得分:0)

如果你告诉错误出现在哪一行会更容易。

使用此代码定义范围:

Set LastRow = Range("G" & Rows.Count).End(xlUp).Row
Set AC = Range("F9:F" & LastRow)
Set Bkd = Range("H9:H" & LastRow)

答案 1 :(得分:0)

我在你的代码中看到了几个“红旗”。

  1. 您对AC和Bkd的声明并未将其声明为范围。这可能会导致意外行为。
  2. 您不在工作表的定义中包含工作表。这意味着,如果活动工作表与运行宏时包含数据的工作表不同,则会得到意外结果。
  3. 您正在与"199"而不是199进行比较。我假设单元格将包含数字199,而不是文本字符串“199”。如果它确实是文本字符串,那么在下面的代码中,您应该更改,例如Flt > 199CLng(Flt) > 199
  4. 您的代码编写就像您假设您可以评估/比较大范围的值,就像您可以评估/比较单个值一样。 VBA不是这种情况 - 因此您必须有一个循环来评估每个单独的单元格。
  5. 使用.SpecialCells(xlCellTypeConstants, xlNumbers)最终会影响整个工作表。它应该被淘汰。
  6. 您尚未提供具有预期结果的特定测试数据。我取得了这些成果......

    enter image description here

    ...来自此代码,解决上述问题......

    Sub test()
    Dim AC As Range, Bkd As Range, ClrRng As Range
    Dim Flt As Range
    Dim mySht As Worksheet
    Dim LastRow As Long
    
    Set mySht = Worksheets("Sheet1") ' <- change this to the sheet you want to use
    LastRow = mySht.Range("G" & mySht.Rows.Count).End(xlUp).Row
    Set AC = mySht.Range("F9:F" & LastRow)
    Set Bkd = mySht.Range("H9:H" & LastRow)
    Set ClrRng = mySht.Range("G9:G" & LastRow)
    
    For Each Flt In AC
        If (Flt > 199 And Flt < 500 And Bkd(Flt.Row - 8, 1) > 145) Or _
           (Flt > 499 And Flt < 600 And Bkd(Flt.Row - 8, 1) > 130) Or _
           (Flt > 599 And Flt < 700 And Bkd(Flt.Row - 8, 1) > 100) Or _
           (Flt > 699 And Flt < 800 And Bkd(Flt.Row - 8, 1) > 115) Then
    
            With ClrRng(Flt.Row - 8, 1)
                .Font.Color = vbWhite
                .Interior.Color = vbBlack
            End With
    
        End If
    Next Flt
    
    End Sub