如果语句不满足特定条件值的条件[VBA]

时间:2018-08-08 13:40:58

标签: excel vba for-loop if-statement

我的代码有一个循环,用于查找数据透视表中给定列的值是否为该行的最小值/最大值。需要注意的是,某些行具有重复的特征条目,因此我具有一组If ElseIf条件,以跳过这些条目的复制过程。代码如下:

    For i = 0 To 339
    wfr = wfr + CStr(i + 5)
    Sheets("ET Pivot").Select
    If Sheets("ET Pivot").Range(wfr).Value = 7 Then
        GoTo LoopExit
    ElseIf Sheets("ET Pivot").Range(wfr).Value = 9 Then
        GoTo LoopExit
    ElseIf Sheets("ET Pivot").Range(wfr).Value = 99999.99 Then
        GoTo LoopExit
    ElseIf Sheets("ET Pivot").Range(wfr).Value = 1 Then
        GoTo LoopExit
    End If
    If Sheets("ET Pivot").Range(wfr).Value = Sheets("ET Pivot").Range("AB" + CStr(i + 5)).Value Then
       Sheets("ET Pivot").Select
       Sheets("ET Pivot").Rows(i + 5 & ":" & i + 5).Select
       Selection.Copy
       Sheets("ET Outliers").Select
       Sheets("ET Outliers").Range("A" + CStr(ic)).Select
       ActiveSheet.Paste
       Application.CutCopyMode = False
       ic = ic + 1
   ElseIf Sheets("ET Pivot").Range(wfr).Value = Sheets("ET Pivot").Range("AC" + CStr(i + 5)).Value Then
       Sheets("ET Pivot").Select
       Sheets("ET Pivot").Rows(i + 5 & ":" & i + 5).Select
       Selection.Copy
       Sheets("ET Outliers").Select
       Sheets("ET Outliers").Range("A" + CStr(ic)).Select
       ActiveSheet.Paste
       ic = ic + 1
   End If
LoopExit:
   wfr = wfrc
Next i

前四个If语句是跳过条件。条件9、99999.99和1按计划工作。由于某些原因,7条件不会触发If语句。我确保单元格值实际上是7,并且没有四舍五入,我已经更改了条件的顺序,并且我先添加了一个虚拟条件,但无济于事。我不确定为什么这种特殊情况不起作用。

2 个答案:

答案 0 :(得分:0)

好的,所以这里有一些要解压的东西。这是我更改的内容:

  1. 通过明确说明每个范围要访问的图纸来减少对.Select的依赖。
  2. 结合了您的if语句-这使代码更易于阅读和编辑

    a。对于第一批if,这意味着我们可以摆脱您的LoopExit,因为它已不再有用

    b。对于第二组if,它让我们取出了大量重复代码

  3. 将访问值的方式从连接字符串更改为使用.Cells(row,col)

    a。此更改使我摆脱了wfr,而仅用"A"

  4. 在循环中调整了i的值,因为您一直在说i + 5

  5. paste方法更改为Range().copy destination:=Range()

希望这会有所帮助!

Dim i As Long
Dim ic As Long
Dim current As Double

For i = 5 To 334

    current = Sheets("ET Pivot").Cells(i, "A").Value2

    If current <> 1 And current <> 7 And current <> 9 And current <> 99999.99 Then

        If current = Sheets("ET Pivot").Cells(i, "AB").Value2 Or current = Sheets("ET Pivot").Cells(i, "AC").Value2 Then

            Sheets("ET Pivot").Rows(i & ":" & i).copy _
                Destination:=Sheets("ET Outliers").Cells(ic, "A")

            ic = ic + 1

        End If

    End If

Next i

答案 1 :(得分:0)

所以我感谢@Jaberwocky解决了它。

我没有按照他的建议将其转换为整数,而是四舍五入到小数点后三位并检查它是否等于7。这种差异的原因是转换为整数将无意中从6.51过滤掉最大/最小值到7.5,可能在数据集中的其他位置。

即使显示30个小数位时也没有显示出偏差,看来我试图过滤掉的“ 7”数字实际上并不是整数7。

感谢大家的投入。