【问题标题】:Detect if range is empty检测范围是否为空
【发布时间】:2012-06-04 09:12:05
【问题描述】:

我想检查 Excel 中的某个区域是否为空。

如何用 VBA 代码编写:

If Range("A38":"P38") is empty

【问题讨论】:

标签: excel vba range


【解决方案1】:

从我得到的 cmets 中找到了解决方案。

Sub TestIsEmpty()
    If WorksheetFunction.CountA(Range("A38:P38")) = 0 Then
        MsgBox "Empty"
    Else
        MsgBox "Not Empty"
    End If
End Sub

【讨论】:

  • 注意:"Empty()" 不是有效的过程名称。 @darren-bartrup-cook,我提议的编辑没有偏离帖子的初衷并保持其目标。
  • 如果范围可能包含空字符串值(常量)或可以返回空字符串值的公式,并且具有空字符串值的单元格必须被视为“空”,则改用这个表达式: WorksheetFunction.CountBlank(Range("A38:P38")) = Range("A38:P38").Cells.Count (并且可能使用With语句来清理它。)
【解决方案2】:

如果您发现自己无法使用CountA,那么首先将您的范围存储为数组并循环数组数据要比循环范围/单元格数据快得多。

Function IsRangeEmpty(ByVal rng As Range) As Boolean
    'Converts a range to an array and returns true if a value is found in said array
    
    Dim area As Range
    For Each area In rng.Areas
        
        If area.Cells.Count > 1 Then
        
            'save range as array
            Dim arr As Variant
            arr = area.value
            
            'loop through array
            Dim cel As Variant
            For Each cel In arr
            
                'if cell is not empty then
                If Len(Trim(cel)) > 0 Then
                    IsRangeEmpty = False
                    Exit Function
                End If

            Next cel
            
        Else    'cannot loop on array with one value
            
            'if cell is not empty then
            If Len(Trim(area.Value2)) > 0 Then
                IsRangeEmpty = False
                Exit Function
            End If
            
        End If

    Next area

    IsRangeEmpty = True

End Function

使用示例:

Sub Test()
    Debug.Print IsRangeEmpty(Range("A38:P38"))
End Sub

如果Range("A38:P38") 为空,它将在即时窗口中打印True;否则它会打印False

【讨论】:

  • 处理范围只有一个单元格的情况,可以使用“If rng.Cells.Count
  • @LePatay 感谢您的提醒,我没有只用一个单元进行测试!现在应该修好了。
  • 这绝对是一个函数!完美,谢谢:)
  • 我对上面卡诺帖子的评论中的示例是解决此问题的更简单方法。
  • @pstraton 看起来与 DJK 的解决方案相匹配
【解决方案3】:

如果变量未初始化或显式设置为 Empty,则 IsEmpty 返回 True;否则,它返回 False。如果表达式包含多个变量,则始终返回 False。 IsEmpty 仅返回对变体有意义的信息。 (https://msdn.microsoft.com/en-us/library/office/gg264227.aspx)。因此,您必须分别检查范围内的每个单元格:

    Dim thisColumn as Byte, thisRow as Byte

    For thisColumn = 1 To 5
        For ThisRow = 1 To 6
             If IsEmpty(Cells(thisRow, thisColumn)) = False Then
                 GoTo RangeIsNotEmpty
             End If
        Next thisRow
    Next thisColumn
    ...........
    RangeIsNotEmpty: 

当然,这里的代码比使用 CountA 函数计算非空单元格的解决方案要多,但是如果找到至少一个非空单元格,GoTo 可以中断循环,并且可以更快地执行代码,尤其是在范围很大并且需要检测的情况下这个案例。此外,与不是 VBA 函数的 Excel CountA 函数相比,这段代码对我来说更容易理解它在做什么。

【讨论】:

  • Excel 宏代码(不知道是否可以编译)当您有大量迭代时需要一段时间。如果您已经确定范围中的某个单元格不为空并且您想要处理它,则需要您的解决方案,但是确定范围是否为空的检查(即,如果您的代码甚至是必要的)应该更快,也许使用公认的答案(CountA)要快得多。对执行相同操作的 VB 循环使用单个“本机”函数往往会导致更快的运行时间。
  • 这并不总是有效。例如,如果您在选择之后有一个不是连续选择的范围(假设您的范围选择跳过 1 个单元格,然后跳过 5 个单元格,返回到 1 个单元格等),那么这将出错。
【解决方案4】:
Dim M As Range

    Set M = Selection

If application.CountIf(M, "<>0") < 2 Then
    MsgBox "Nothing selected, please select first BOM or Next BOM"
Else

'Your code here

End If

根据我刚刚了解到的经验,你可以做到:

If Selection.Rows.Count < 2 
Then End If`

稍后提供说明(现在我正在工作)

【讨论】:

  • 感谢您的回答,您能否进一步说明比较对未来访问者的真正作用?编辑:理解您的编辑如何与原始示例相匹配也有点棘手。
  • @Thor 当您在 Google 上搜索该问题的解决方案时,您会看到此页面。但是这个页面没有回答这个问题,这就是我回答这个问题的原因。我相信这里的人们不只是对事情投赞成票。我可以看到这已经帮助了一些人。
  • @Jean-FrançoisCorbett 很遗憾,是的,我清醒生活的每一个小时......看,这对寻求的人有帮助。我知道当我试图弄清楚这一点时,我在谷歌搜索中一遍又一遍地遇到了这个页面。这正是我正在寻找的解决方案,所以我试图帮助其他人并发布它。即使不是 100% 的直接帮助,也是 1000% 的间接帮助。
【解决方案5】:
Dim cel As Range, hasNoData As Boolean

    hasNoData = True
    For Each cel In Selection
        hasNoData = hasNoData And IsEmpty(cel)
    Next

如果Selection 中没有单元格包含任何数据,这将返回True。对于特定范围,只需将 RANGE(...) 替换为 Selection

【讨论】:

    【解决方案6】:

    另一种可能的解决方案。计算空单元格并从单元格总数中减去该值

    Sub Emptys()
    
    Dim r As range
    Dim totalCells As Integer
    
    'My range To check'
    Set r = ActiveSheet.range("A1:B5")
    
    'Check for filled cells'
    totalCells = r.Count- WorksheetFunction.CountBlank(r)
    
    
    If totalCells = 0 Then
        MsgBox "Range is empty"
    Else
        MsgBox "Range is not empty"
    End If
    
    End Sub
    

    【讨论】:

      【解决方案7】:

      这只是对@TomM'sanswer/的一个小补充 如果您选择的单元格为空

      Public Function CheckIfSelectionIsEmpty() As Boolean
         Dim emptySelection As Boolean:emptySelection=True
         Dim cell As Range
         For Each cell In Selection
             emptySelection = emptySelection And isEmpty(cell)
             If emptySelection = False Then
                Exit For
             End If
         Next
         CheckIfSelectionIsEmpty = emptySelection
      End Function
      

      【讨论】:

        【解决方案8】:

        恕我直言,这一行效果更好:

        Application.Evaluate("SUMPRODUCT(--(E10:E14<>""""))=0")
        

        在这种情况下,它会评估范围 E10:E14 是否为空。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-15
          • 2017-02-28
          相关资源
          最近更新 更多