【问题标题】:If Statement not meeting Condition for Specific Condition Value [VBA]如果语句不满足特定条件值的条件 [VBA]
【发布时间】:2018-08-08 13:40:57
【问题描述】:

我的代码有一个循环,用于查找数据透视表中给定列的值是否是该行的最小值/最大值。需要注意的是,某些行有重复的特征条目,因此我有一组 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 并且没有四舍五入,我已经更改了条件的顺序,并且我首先添加了一个虚拟条件,一切都无济于事。我不确定为什么这个特定案例不起作用。

【问题讨论】:

  • 您确定代码中没有拼写错误或包含“奇数”字符吗?您是否尝试过复制/粘贴有效的行,然后替换该值? (旁注:您没有使用 Select Case 而不是所有这些 ElseIf 的任何特殊原因?)
  • 声明wfr = wfr + CStr(i + 5)的想法是什么? wfr 是什么数据类型和初始值(在你进入循环之前)?
  • @FunThomas: wfr 是一个包含列值的单字母字符串,所以 wfr + CStr(i+5) 是一个特定的单元格(例如 F5)
  • @Cindy Meister:我没有使用 Select Case,因为我自学了 VBA,而且我不知道很多功能,包括 Select Case
  • 您是否尝试将其转换为整数,如果它在舍入范围内,这将强制该值为 7? If CInt(Sheets("ET Pivot").Range(wfr).Value) = 7

标签: excel vba for-loop if-statement


【解决方案1】:

感谢@Jaberwocky,我解决了这个问题。

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

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

感谢大家的意见。

【讨论】:

    【解决方案2】:

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

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

      一个。对于第一组ifs,这意味着我们可以摆脱你的LoopExit,因为它不再有任何用途

      b.对于第二组ifs,它让我们取出一大块重复代码

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

      一个。这个改动让我摆脱了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
    

    【讨论】:

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