【问题标题】:The cycle doesn't enter in second if statement in excel循环不进入excel中的第二个if语句
【发布时间】:2013-09-12 08:25:35
【问题描述】:

好吧,我在一分钟前解决了一个小问题,但现在我的宏上有另一个问题:(

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim S1 As String, S2 As String
    Dim S3 As String, S4 As String
    Dim lRow As Long, i As Long
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    S1 = "Football"
    S2 = "Basket"

    S3 = "Sport1"
    S4 = "Sport2"

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 1 To lRow
            If Len(Trim(.Range("E" & i).Value)) = 0 Then
                Select Case .Range("C" & i).Value
                    Case S1, S2

                        MsgBox "Insert value in the cell " & _
                        .Range("E" & i).Address

                        Cancel = True

                        Exit For
                End Select
            End If

            If (Len(Trim(.Range("F" & i).Value)) = 0) Or _
               (Len(Trim(.Range("G" & i).Value)) = 0) Or _
               (Len(Trim(.Range("H" & i).Value)) = 0) Then
                Select Case .Range("C" & i).Value
                    Case S3, S4

                        MsgBox "Insert value in the cell " & _
                        .Range("F" & i).Address, _
                        .Range("G" & i).Address, _
                        .Range("H" & i).Address

                        Cancel = True

                        Exit For
                End Select
            End If
        Next i
    End With
End Sub

第一个 if 有效,但第二个

If (Len(Trim(.Range("F" & i).Value)) = 0) Or _
               (Len(Trim(.Range("G" & i).Value)) = 0) Or _
               (Len(Trim(.Range("H" & i).Value)) = 0) Then
                Select Case .Range("C" & i).Value
                    Case S3, S4

                        MsgBox "Insert value in the cell " & _
                        .Range("F" & i).Address, _
                        .Range("G" & i).Address, _
                        .Range("H" & i).Address

                        Cancel = True

                        Exit For
                End Select
 End If

不。有什么不对?

如您所见,条件相同,但在不同的列中

【问题讨论】:

  • 我觉得,我浪费了我的时间为你的previous question提供详细的答案:)
  • 这个任务我在你回答我之前就打开了:(你的回答在另一个任务中很完美。
  • 如果您将这些建议应用于此代码并更新您的问题,我愿意为您提供帮助。
  • 我已经编辑了我的任务..我之前错了..我有不同的专栏。但条件是一样的。我不知道现在出了什么问题。

标签: excel if-statement excel-2010 vba


【解决方案1】:

如果第一个 IF 有效,那么第二个将不会,因为我们正在退出 FOR 循环。

这是您正在尝试的(未测试)吗?

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim S1 As String, S2 As String
    Dim S3 As String, S4 As String, sMsg As String
    Dim lRow As Long, i As Long
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    S1 = "Football": S2 = "Basket": S3 = "Sport1": S4 = "Sport2"

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 1 To lRow
            If Len(Trim(.Range("E" & i).Value)) = 0 Then
                Select Case .Range("C" & i).Value
                    Case S1, S2
                        sMsg = .Range("E" & i).Address
                End Select
            End If

            If (Len(Trim(.Range("F" & i).Value)) = 0) Or _
               (Len(Trim(.Range("G" & i).Value)) = 0) Or _
               (Len(Trim(.Range("H" & i).Value)) = 0) Then
                Select Case .Range("C" & i).Value
                    Case S3, S4
                        If sMsg = "" Then
                            sMsg = .Range("F" & i).Address & " OR " & _
                                   .Range("G" & i).Address & " OR " & _
                                   .Range("H" & i).Address
                        Else
                            sMsg = sMsg & " OR " & _
                                   .Range("F" & i).Address & " OR " & _
                                   .Range("G" & i).Address & " OR " & _
                                   .Range("H" & i).Address
                        End If
                End Select
            End If

            If sMsg <> "" Then
                MsgBox "One or all these cells are empty. " & _
                       "Please insert value in the cell(s) " & _
                        sMsg
                Cancel = True
                Exit For
            End If
        Next i
    End With
End Sub

跟进(来自 cmets)

未经测试

这会将相关单元格存储在一个范围内,然后在激活相关工作表后简单地选择它。但是我不推荐这种方法。或者,您可以为单元格着色...通过代码或通过条件格式...

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim S1 As String, S2 As String
    Dim S3 As String, S4 As String, sMsg As String
    Dim lRow As Long, i As Long
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("Sheet1")

    S1 = "Football": S2 = "Basket": S3 = "Sport1": S4 = "Sport2"

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 1 To lRow
            If Len(Trim(.Range("E" & i).Value)) = 0 Then
                Select Case .Range("C" & i).Value
                    Case S1, S2
                        sMsg = .Range("E" & i).Address
                        Set rng = .Range("E" & i)
                End Select
            End If

            If (Len(Trim(.Range("F" & i).Value)) = 0) Or _
               (Len(Trim(.Range("G" & i).Value)) = 0) Or _
               (Len(Trim(.Range("H" & i).Value)) = 0) Then
                Select Case .Range("C" & i).Value
                    Case S3, S4
                        If sMsg = "" Then
                            sMsg = .Range("F" & i).Address & " OR " & _
                                   .Range("G" & i).Address & " OR " & _
                                   .Range("H" & i).Address
                        Else
                            sMsg = sMsg & " OR " & _
                                   .Range("F" & i).Address & " OR " & _
                                   .Range("G" & i).Address & " OR " & _
                                   .Range("H" & i).Address
                        End If

                        If rng Is Nothing Then
                            Set rng = .Range("F" & i & ":H" & i)
                        Else
                            Set rng = Union(rng, .Range("F" & i & ":H" & i))
                        End If
                End Select
            End If

            If sMsg <> "" Then
                MsgBox "One or all these cells are empty. " & _
                       "Please insert value in the cell(s) " & _
                        sMsg

                If Not rng Is Nothing Then
                    .Activate
                    rng.Select
                End If

                Cancel = True
                Exit For
            End If
        Next i
    End With
End Sub

【讨论】:

  • 有没有办法在空单元格中做焦点?我的意思是,例如,我得到 MsgBox One or all these cells are empty 和单元格的“坐标”。当我点击Ok 时,有没有办法直接将我“带入”牢房?我不知道你有没有关注我:)
  • 是的。虽然我不推荐它。将所有地址存储在一个范围对象中,然后执行Rng.Select
  • 你能告诉我吗?抱歉,这是我第一次使用 vba。为什么不推荐呢?
  • THIS 是我不推荐它的原因。让我看看我是否可以修改上面的代码以显示如何选择单元格...
  • 更新了上面的帖子
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多