VBA:在继续

时间:2015-09-02 18:50:40

标签: vba validation

我在一个工作表(rng1,rng2,rng3)中有三个范围,我需要确保在继续使用宏之前rng2和rng3不包含空格。

我已经尝试了几种我能找到的方法,但却无法使它们起作用。如果有人有建议,愿意尝试不同的方法。

这是我尝试使用specialcells(xlCellTypeBLanks)计算空白单元格但是当两个范围都不为空时,某些内容无法处理我的错误:

Dim wrk As Workbook
Dim sht As Worksheet
Dim twb As Workbook
Dim tws As Worksheet
Dim lrow As Long
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Dim finprod As Variant
Dim subprod As Variant

Application.ScreenUpdating = False
Set wrk = ActiveWorkbook
Set sht = wrk.Worksheets(1)

For Each sht In wrk.Worksheets
lrow = sht.Range("A" & Rows.Count).End(xlUp).Row
Set rng1 = sht.Range("A2:A" & lrow)
Set rng2 = sht.Range("F2:F" & lrow)
Set rng3 = sht.Range("E2:E" & lrow)
On Error GoTo Err1
If rng3.SpecialCells(xlCellTypeBlanks).Count > 0 Then
MsgBox ("Invalid item number.")
Exit Sub
End If

Err1:
    On Error GoTo Err2
    If rng2.SpecialCells(xlCellTypeBlanks).Count > 0 Then
    MsgBox ("Missing quantity.")
    Exit Sub
    End If
Err2:
    On Error GoTo 0

    Exit For
    Next sht

2 个答案:

答案 0 :(得分:2)

我尽量避免以这种方式使用goto - 当代码变大时会使代码混乱。以下是我提出的建议:

Sub check_blank()

Dim sht As Worksheet
Dim twb As Workbook
Dim tws As Worksheet
Dim lrow As Long
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Dim finprod As Variant
Dim subprod As Variant

Application.ScreenUpdating = False
Set wrk = ActiveWorkbook
Set sht = wrk.Worksheets(1)

For Each sht In wrk.Worksheets


    lrow = sht.Range("A" & Rows.Count).End(xlUp).Row
    Set rng1 = sht.Range("A2:A" & lrow)
    Set rng2 = sht.Range("F2:F" & lrow)
    Set rng3 = sht.Range("E2:E" & lrow)


    If Application.CountIf(rng3, "") > 0 Then
        MsgBox ("Invalid item number.")
    Exit Sub
    End If

    If Application.CountIf(rng2, "") > 0 Then
        MsgBox ("Missing quantity.")
    Exit Sub
    End If


Next sht

End Sub

答案 1 :(得分:0)

Range.SpecialCells method Nothing 当没有xlCellTypeBlanks个单元格可用且没有任何计数时;甚至没有计数零。

您可以使用On Error Resume Next或选择非破坏性方法来确定是否有空白单元格。

if cbool(application.countblank(rng2)) then
    'there are zero-length string and/or blank cells
    'do something
end if

上述问题是工作表的COUNTBLANK function会将公式返回的零长度字符串(例如"")计为空白时的空白。

要仅捕获真正空白的单元格,以下内容为True - CBool(rng2.Count - application.Countif(rng2, "<>"))。只计算真正空白的单元格,任何非零计数都为真。这样可以避免在无法找到任何内容时使用On Error Resume Next来破坏环境。