【问题标题】:Ignore row if all 4 cells are 0; get name if any of the 4 cells is greater than 0如果所有 4 个单元格都为 0,则忽略行;如果 4 个单元格中的任何一个大于 0,则获取名称
【发布时间】:2020-07-10 08:02:28
【问题描述】:

我有一个名称列表(A 列),B 到 F 列中的数字是公式的结果。我正在尝试创建一个 FOR LOOP 代码来检查 B 到 F 列,如果 B 到 F 中的所有单元格都为零,那么代码应该忽略当前行并跳到下一行;如果 B 到 F 列中的任何单元格大于 0,则代码应在 A 列中获取相应的名称。

示例: 如果 B2、C2、D2 和 E2 中的任何一个单元格大于 1,那么我应该得到 A2 的名称/值。如果 B2、C2 中的所有单元格。 D2 和 E2 都为零,然后继续检查下一行并做同样的事情。

这是我用来尝试获取任何 4 列单元格值大于 1 的名称的代码

     For i = 2 To LastCalcAnalystRowIndex '//wsCalculations.Cells(Rows.Count, "CP").End(xlUp).Row

    '//Get Component from cell in column "BP"
        Analyst = wsCalculations.Cells(i, "CP").Value
        Component = wsCalculations.Cells(i, "CN").Value
        weeknumber = wsCalculations.Range("BR2").Value + 3

            If wsCalculations.Cells(i, "B").Value = 0 And wsCalculations.Cells(, "C").Value = 0 _
            And wsCalculations.Cells(i, "D").Value = 0 And wsCalculations.Cells(i, "E").Value = 0 _
            And wsCalculations.Cells(i, "F").Value = 0 Then
            Exit For
            Else
            wsCalculations.Cells(i, "A").Value = wsCalculations.Cells(i, "CP").Value
            End If
            Next

使用上面的代码,我尝试获取所有 4 列值都不等于零的名称,但我得到的结果只是原始列表的副本。我突出显示了我希望我的代码跳过的行。我还包括了我得到的结果和我想要得到的结果。 下面是一个示例数据。我的原始数据有 54 行。 。 谁能告诉我我哪里出错了?

【问题讨论】:

    标签: excel vba loops for-loop if-statement


    【解决方案1】:

    不是解决方案,但可以缩短您的初始代码

    为什么不创建一个隐藏列* 对整行进行 =SUM 运算

    然后从中获取值

    而不是使用代码来获取每 5 个单元格的值然后将其相加。

    编辑:将“隐藏单元格”更改为“隐藏列”:P

    【讨论】:

      【解决方案2】:

      试试

      Sub test()
          Dim rngDB As Range
          Dim rng As Range, rngSum As Range
          Dim wsCalculations As Worksheet
          Dim vR() As Variant
          Dim n As Long
      
          Set wsCalculations = ActiveSheet
      
          With wsCalculations
              Set rngDB = .Range("a2", .Range("a" & Rows.Count).End(xlUp))
          End With
      
          For Each rng In rngDB
              Set rngSum = rng.Offset(, 1).Resize(1, 5)
              If WorksheetFunction.Sum(rngSum) > 0 Then
                  n = n + 1
                  ReDim Preserve vR(1 To n)
                  vR(n) = rng
              End If
          Next rng
      
          With wsCalculations
              If n Then
                  .Range("h2").Resize(n) = WorksheetFunction.Transpose(vR)
              End If
          End With
      
      
      End Sub
      

      【讨论】:

        【解决方案3】:

        没有真正需要 VBA。

        请注意,我使用了带有结构化引用的表。如果您愿意,可以将其更改为具有正常引用的范围。

        如果您有 O365,则可以使用辅助列和公式。

        添加一个辅助列,其中SUM 是每行中的单元格(如果需要,您可以隐藏该列)。

        eg:  G2:  =SUM(Table3[@[Column2]:[Column6]])
        

        然后,假设数据位于名为Table3 的表 中,使用公式:

        =INDEX(FILTER(Table3,Table3[sumRow]>0),0,1)
        

        如果您有早期版本的 Excel,您可以使用:

        I2: =IFERROR(INDEX(Table3[Column1],AGGREGATE(15,6,1/(Table3[sumRow]>0)*ROW(Table3)-ROW(Table3[#Headers]),ROWS($1:1))),"")
        

        并填写表格的长度。

        【讨论】:

          【解决方案4】:

          谁能告诉我我哪里出错了?

          实际上您显示的代码与您的措辞不一致,因此不可能说出所有错误

          但可以肯定的是,Exit For 是一个逻辑错误,因为当它第一次遇到五个零时,它实际上会让你脱离循环

          因此,就这个逻辑错误而言,您应该将那段 fo 代码更改为以下内容:

          With wsCalculations
              For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
          
                  If WorksheetFunction.CountIf(.Cells(i, 2).Resize(, 5), 0) < 5 Then ' when a row is eligible for math
          
                      ' do your math
          
                  End If
          
              Next
          End With
          

          我在这里使用了WorksheetFunction.CountIf() 函数,它使您能够处理不同的条件,因为您的措辞也不清楚这个项目(“大于 0”,“所有单元格...为零", "大于 1")

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多