我有一个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
答案 0 :(得分:2)
如果在Public
模块中进行Worksheet
声明,我会发现一些类似的问题,UserForm
模块无法使用它,除非符合资格。如果是这种情况,请告诉我。
如果您还没有这样做,请将Option Explicit
置于UserForm模块之上,它可能会显示该变量未定义。
我还怀疑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!!!