【问题标题】:VBA: validating no empty cells in ranges before proceedingVBA:在继续之前验证范围内没有空单元格
【发布时间】:2015-09-03 04:02:50
【问题描述】:

我在工作表中有三个范围(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

【问题讨论】:

    标签: vba validation


    【解决方案1】:

    我尽量避免以这种方式使用 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
    

    【讨论】:

      【解决方案2】:

      当没有可用的xlCellTypeBlanks 单元格并且Nothing 没有计数时,Range.SpecialCells methodNothing;连零计数都没有。

      您可以使用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 使环境崩溃。

      【讨论】:

      • 我选择了 Pavel's,因为我确实有返回 "" 的公式。不过感谢您的快速回复!
      • 我很困惑。如果您想将公式返回的零长度字符串计算为空白,则上述方法有效;就像@Pavel_V 提供的解决方案一样。如果您只想计算真正的空白单元格,则需要应用另一种方法。
      • 对不起,我看错了你的帖子。我的一个范围的公式可以返回“”,另一个范围可能有真正的空白,所以我需要一个可以同时捕获两者的解决方案(或每个范围的两个单独的解决方案)。
      • 现在有点争议,但要捕获真正的空白单元格,以下将是 True - CBool(rng2.Count - application.Countif(rng2, "<>"))。只有真正的空白单元格才会被计算在内,任何非零计数都是正确的。这样可以避免在找不到任何东西时使用On Error Resume Next 使环境崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多