【问题标题】:Why does `Empty` not work in this VBA code?为什么 `Empty` 在此 VBA 代码中不起作用?
【发布时间】:2015-07-22 15:25:58
【问题描述】:

下面的代码应该检查一个单元格是否为空,如果为空,则将 B26 的内容粘贴到该单元格中。如果单元格不为空,它会继续检查其下方的单元格。我尝试使用IsEmpty,但这不起作用,所以我认为Excel将所有空单元格默认为0。所以我尝试使用Empty(如下面的代码所示),但这也不起作用。

Sub Part1_Component_1_Foam_Color()
'
' Transfers Component 1 Data if Foam or color
'

'
Windows("Transfer Template.xlsm").Activate
Range("B26").Select
Selection.Copy
Windows("Protected_JD_Form.xls").Activate
    If Range("B27:C27") = Empty Then
        Range("B27:C27").Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
            Exit Sub
    ElseIf Range("B28:C28") = Empty Then
        Range("B28:C28").Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
            Exit Sub
    ElseIf Range("B29:C29") = Empty Then
        Range("B29:C29").Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
            Exit Sub
    ElseIf Range("B30:C30") = Empty Then
        Range("B30:C30").Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
            Exit Sub
    End If
Windows("Transfer Template.xlsm").Activate
Range("A1").Select
End Sub

【问题讨论】:

  • B和C的单元格合并了吗?
  • 你试过用""代替空吗?双引号是空的另一种说法。我听说它速度较慢/并不总是那么准确,但它可能适用于您的情况
  • nothing怎么样
  • @Rory 是的,它们已合并。
  • @User30923 双引号是我尝试的第一件事,它也没有用。

标签: vba excel


【解决方案1】:

你可以使用

If Application.WorksheetFunction.CountA(Range("B27:C27")) = 0 Then

而不是

If Range("B27:C27") = Empty Then

顺便说一句,粘贴数据之前不需要选择范围。

这段代码

    Range("B27:C27").Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False

可以替换为

    Range("B27:C27").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False

【讨论】:

  • 我喜欢这种方法。我通常使用IsEmpty() 方法——但是我从来没有机会使用合并的单元格来做到这一点。我今天之前不知道 IsEmpty(MergedCell) 返回 False 即使合并的单元格实际上是空白的——但是这个 CountA 方法处理得很好(尽管在合并的情况下 isEmpty 的实际输出似乎取决于如何你地址范围)。
  • 谢谢!只是出于好奇,除了合并单元格之外还有其他原因导致我的代码无法正常工作吗?
【解决方案2】:

在 VBA 中使用 EmptyIsEmpty() 主要是为了查看变量是否已初始化,但它通常被误用于检查 Range 是否有值。

如果您想查看 Range 是否为“空”,请使用:

If Range("B27").Value = vbNullString Then
    '// Do Something
End If

如果您想检查包含多个单元格的 Range 是否为空,则可以使用 COUNTA() 参数:

If [COUNTA(B27:C27)=0] Then
    '// Do Something
End If

(或同样的事情使用 WorksheetFunction 类...)

If WorksheetFunction.CountA(Range("B27:C27")) = 0 Then
    '// Do Something
End If

【讨论】:

    【解决方案3】:

    试试 IsEmpty

    If IsEmpty(ws.Range("A1").Value) = True Then
    
    End if
    

    【讨论】:

      【解决方案4】:

      你试过了吗

      var = nz(YourValue,"")

      然后检查

      If var = "" Then 'moar code 
      

      或者只是检查

      If nz(YourValue,"") = "" Then 'moar code 
      

      【讨论】:

        猜你喜欢
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多