为什么我的If [Range] Is Nothing语句没有检测到变量是Nothing?

时间:2016-08-12 18:12:41

标签: vba excel-vba excel

我有一个If语句测试,看看Range CCAddedGPSum是否为Nothing,在这种情况下,但是当它测试时,它会确定它是否正确。

当我使用Debug.Print CCAddedGPSum.Value时,我收到一个错误,声称需要一个Object,这表示该变量不是Set。为什么这不会以Is Nothing返回?

以下是代码:

If CCAddedGPSum Is Nothing Then 'Once here, ignores the test and continues to "END IF"
    Set CCAddedGPSum = Range(CCGPSum.Offset(1, -3), CCGPSum.Offset(1, 1))
    CCAddedGPSum.Insert shift:=xlDown

    Set CCAddedGPSum = Range(CCGPSum.Offset(1, -3), CCGPSum.Offset(1, 1))
    CCAddedGPSum.Interior.ColorIndex = 0
    CCAddedGPSum.Insert shift:=xlDown

    Set CCAddedGPSum = Range(CCGPSum.Offset(1, -3), CCGPSum.Offset(1, 1))
    CCAddedGPSum.Interior.ColorIndex = 0

    Set CCAddedGPTitle = Range(CCGPSum.Offset(1, -2), CCGPSum.Offset(1, -1))
    With CCAddedGPTitle
        .MergeCells = True
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
    End With

    CCAddedGPTitle.Value = "Removed from Deposit:"
    Set CCAddedGPSum = CCGPSum.Offset(1, 0)
    If CCAddedGPSum2 Is Nothing Then
        CCAddedGPSum.Borders(xlEdgeBottom).LineStyle = xlContinuous
    End If

    If CCGPSum.Offset(-1, 0).Text = "" Then
        Set CCGPSubtotal = CCGPSum
        Set CCGPSum = CCAddedGPSum.End(xlDown).Offset(1, 0)
        Range(CCGPSum.Offset(0, -1), CCGPSum.Offset(0, -2)).MergeCells = True
        CCGPSum.Offset(0, -1).HorizontalAlignment = xlRight
        CCGPSum.Offset(0, -2).Value = "Total:"
        CCGPSum.Interior.ColorIndex = 6
    End If
End If

3 个答案:

答案 0 :(得分:2)

如果在Public模块中进行Worksheet声明,我会发现一些类似的问题,UserForm模块无法使用它,除非符合资格。如果是这种情况,请告诉我。

如果您还没有这样做,请将Option Explicit置于UserForm模块之上,它可能会显示该变量未定义。

enter image description here

我还怀疑UF模块中有一个On Error Resume Next语句,它允许显示表单,否则它可能会无声地失败。要进一步诊断需要查看哪个事件处理程序正在触发代码。如果变量位于事件处理程序(如命令按钮等)中,并且表单保持活动状态,则变量可能会保留在范围内,这可能会解释您遇到间歇性问题的原因。

UserForm事件处理程序中的On Error Resume Next语句会导致测试看起来返回True(从技术上讲,它不返回任何内容,If语句错误并且错误处理程序接管在 next 行上恢复,因此If/EndIf块的主体意外执行。

注意:如果您的Public声明位于标准模块中,则此解决方案可能无效。

Sheet1模块中的示例代码:

Option Explicit
Public r As Range

Sub Main()

    UserForm1.Show

End Sub

UserForm1模块中的示例代码,它将针对公共变量r提出确切的424错误:所需对象:

Private Sub CommandButton1_Click()
If r Is Nothing Then
    Debug.Print r.Address
    MsgBox "'r' is Nothing"
    Set r = Range("A1")
Else:
    MsgBox r.Address
End If

MsgBox "end of UserForm_Initialize"
End Sub

要解决此问题,请将r限定为Sheet1.r或分配给过程范围变量:

Private Sub CommandButton1_Click()
Dim r As Range
Set r = Sheet1.r
If r Is Nothing Then
    Debug.Print r.Address
    MsgBox "'r' is Nothing"
    Set r = Range("A1")
Else:
    MsgBox r.Address
End If

MsgBox "end of UserForm_Initialize"
End Sub

答案 1 :(得分:0)

见...... VBA: Conditional - Is Nothing

Dim MyObject As New Collection
If MyObject Is Nothing Then  ' <--- This check always returns False

这假设CCAddedGPSum被声明为新对象

答案 2 :(得分:0)

Is Nothing

为什么Range不可靠的一个例子
Dim r As Range
Debug.Print r Is Nothing    ' True
Set r = [a1]
Debug.Print r.Value         ' ok
[a1].Delete                 ' !!!
Debug.Print r Is Nothing    ' False!!!
Debug.Print r.Value         ' error!!!