【问题标题】:First part of IF statement is being ignoredIF 语句的第一部分被忽略
【发布时间】:2016-01-16 22:25:38
【问题描述】:

我在 VBA 中有以下 IF 语句,但语句的“删除”部分或 ElseIf 之前的位被完全忽略:

    For i = 3 To (customerNum + 3)
    If Sheets("Reports").Range("L" & i).Value = "A" Then
        Sheets("Reports").Range("G" & i & ":M" & i).Select
        Selection.Delete Shift:=xlUp
    ElseIf Sheets("Reports").Range("L" & i).Value <> "A" Then
        Sheets("Reports").Range("J" & i).Value = form1_1 & i & form1_2
        Sheets("Reports").Range("J" & i).NumberFormat = "d-mmm-yy"
        Sheets("Reports").Range("M" & i).Value = form2_1 & i & form2_2 & i
        Sheets("Reports").Range("M" & i).NumberFormat = "_-[$£-809]* #,##0.00_-;-[$£-809]* #,##0.00_-;_-[$£-809]* ""-""??_-;_-@_-"
    End If
Next i

其余的运行顺利。没有崩溃或错误。

有什么想法吗?

【问题讨论】:

  • “完全忽略”是什么意思?你能看到代码在调试模式下进入 If 块(Select + Delete 所在的位置)吗?
  • 附言。你的是一个非常基本的“如果”块,如果单元格 L & i 的值等于“A”,则输入删除部分,或者输入其他部分。所以你的陈述“删除部分被完全忽略,其余部分运行顺利”让我觉得单元格“L&i”永远不等于A。
  • 可能Sheets("Reports").Range("G" &amp; i &amp; ":M" &amp; i).Select 行没有选择任何内容。
  • @MatteoNNZ 感谢您的输入,但这是我检查的第一件事。这不是问题,因为“A”确实出现在目标块中。

标签: excel loops if-statement vba


【解决方案1】:

这不是(!)应该是一个额外的答案。然而,我想添加这个“答案”,因为(偶尔)我在一张 Excel 工作表中遇到了各种不同的“A”或“C”(等等)的问题。在大公司工作时,我的同事一次使用多个不同的字符集(他们的本地字符集和英文字符集)。请注意,西里尔字母“A”looks 类似于拉丁字母“A”。然而,即使使用Option Compare Text,两者也是不同的。以下代码将显示字符的 unicode,并且可能是检查是否已在特定单元格中输入“A”的更好方法:

Public Sub CheckUnicode()
Dim lngRowNumber As Long

Debug.Print AscW("A")
With Sheets("Reports")
    For lngRowNumber = 1 To 100000
        If Trim(.Range("L" & lngRowNumber).Value2) = vbNullString Then Exit For
        Debug.Print AscW(Left(.Range("L" & lngRowNumber).Value2, 1))
    Next lngRowNumber
    ' The following will append a cyrillic a to the bottom of the sheet in Column "A"
    .Range("A" & lngRowNumber + 1).Value2 = ChrW(1072)
End With

End Sub

我只是为可能遇到类似问题的其他人添加这个“解决方案”。如前所述,有几个角色看起来相似但不相似。另请注意,这只是西里尔字母。那里可能还有其他看起来很相似的角色集。

【讨论】:

    【解决方案2】:

    也许你需要从底部开始,然后向上。

    Sub Button1_Click()
        Dim sh As Worksheet
        Dim Rws As Long, rng As Range, nwrw As Long
    
        Set sh = Sheets("Reports")
    
        With sh
    
            Rws = .Cells(.Rows.Count, "L").End(xlUp).Row
    
            For i = Rws To 3 Step -1
    
                If .Cells(i, "L") = "A" Then .Range(.Cells(i, "G"), .Cells(i, "M")).Delete Shift:=xlUp
    
                If .Cells(i, "L") <> "A" Then
    
                    .Cells(i, "J") = "something" & i & "something else"
                    .Cells(i, "M") = "something" & i & "something else"
    
                End If
    
            Next i
    
        End With
    
    End Sub
    

    【讨论】:

    • 大功告成!请问我的语句不起作用以及您的“with”方法背后的逻辑是什么?
    • with sh 只是为了表明您所指的工作表,而不是在每一行上写 Sheets("Reports")。我相信主要问题是如果你在 L4 和 L5 上找到“A”,首先你删除 L4 中的“A”并向上移动,L5 现在已经向上移动并变成 L4,所以当你循环到 L5 时你错过了一个“ A”,因为它现在在 L4 中。当您删除和移动单元格时,最好从底部开始,这样您就不会错过任何向上的单元格。我还经常使用过滤器来一次删除单元格,而不是一次删除一个。
    • 这听起来像是一种更好的方法。请问是怎么做的?
    • Rws = .Cells(.Rows.Count, "L").End(xlUp).Row then For i = Rws To 3 Step -1 计算行数,然后从Rws to 3 开始循环,step -1 告诉代码后退,在这种情况下它会上升一行。如果有 100 行,则循环中的下一行将是 99。
    猜你喜欢
    • 2015-08-13
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多