首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逻辑操作回路-有并发症

逻辑操作回路-有并发症
EN

Stack Overflow用户
提问于 2016-05-03 02:41:13
回答 2查看 40关注 0票数 0

使用one of my previous questions的智慧,我正在写一篇声明:

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

备注

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

目前,这会产生错误91,"With块未设置“或"Type失配”错误。我已经回顾了我以前的问题,并从功能齐全的代码中学到了很多,但似乎无法使它工作。有什么建议吗?

代码语言:javascript
复制
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

这是在下面的注释中引用的另一个尝试代码块。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-03 05:32:09

我在你的代码中看到了一些“危险信号”。

  1. 你方关于AC和Bkd的声明不宣布它们为恒河。这会导致意想不到的行为。
  2. 在范围的定义中不包括工作表。这意味着,如果在运行宏时,活动工作表与具有数据的工作表不同,则会得到意想不到的结果。
  3. 例如,您比较的是"199"而不是199。我假设单元格将包含数字199,而不是文本字符串"199“。如果它确实是一个文本字符串,那么,在下面的代码中,您应该将Flt > 199更改为CLng(Flt) > 199
  4. 编写代码时,假设可以计算/比较大量的值,就像可以计算/比较单个值一样。VBA的情况并非如此,因此您必须有一个循环来评估每个单元格。
  5. .SpecialCells(xlCellTypeConstants, xlNumbers)的使用将最终影响整个工作表。它应该被消除。

您还没有提供带有预期结果的特定测试数据。我取得了这些成果..。

..。从这段代码中,解决上述问题.

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2016-05-03 03:28:12

如果你知道你的错误出现在哪一行,那就更容易了。

使用此代码定义范围:

代码语言:javascript
复制
Set LastRow = Range("G" & Rows.Count).End(xlUp).Row
Set AC = Range("F9:F" & LastRow)
Set Bkd = Range("H9:H" & LastRow)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36994713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档