如何指出excel中哪个单元格为空?

时间:2013-09-13 10:10:29

标签: excel vba excel-vba if-statement

我有这个宏

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

此时此刻

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

宏给我一个MsgBox,错误指示我“在单元格中插入值或者是否为”,其中i是行。问题是,如果其中一个被正确编译(例如F列),则消息总是相同的。我需要,如果只有一个例如是空的,它会让我得到错误,只有那个是不正确的。例如; F和G是正确的但是H是空的。错误将是“在单元格中插入值”。我要改变什么?

1 个答案:

答案 0 :(得分:1)

通过分析每个特定范围来创建给定字符串(sMsg)(逻辑上,将“OR”替换为“AND”)。示例代码:

Dim curEmpty As String
Dim col1 As String, col2 As String, col3 As String
col1 = "Column F"
col2 = "Column G"
col3 = "Column H"       
If (Len(Trim(.Range("F" & i).Value)) = 0) Then curEmpty = col1

If (Len(Trim(.Range("G" & i).Value)) = 0) Then
   If (curEmpty <> "") Then curEmpty = curEmpty & " AND "
   curEmpty = curEmpty & col2
End If

If (Len(Trim(.Range("H" & i).Value)) = 0) Then
   If (curEmpty <> "") Then curEmpty = curEmpty & " AND "
   curEmpty = curEmpty & col3
End If

If sMsg = "" Then
   sMsg = curEmpty
Else
   sMsg = sMsg & " AND " & curEmpty
End If