excel 未设置块变量的对象变量

g9icjywg  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(196)

我是一个vba新手,目前正在Excel中设计一些自动化矩阵系统。我在工作表中尝试了两组代码,它运行得很好。但是,当我试图在用户窗体的事件子控件中使用相同的代码时,弹出了一个错误91,并在orivalue中显示了一个错误。虽然我已经给它赋值了。2我也会根据编译器高亮显示调试行。
下面是函数的代码。

Function find_prevconfig(x2 As Integer) As Range
    For y = 0 To 30
        If Range("E590").Offset(y, x2) = "Y" Then
            Set find_preconfig = Range("C590").Offset(y, 0)
            Exit Function
        End If
    Next y
End Function

下面是我调用函数的event sub:

Private Sub btn_confirm_Click()
    Dim orivalue As Range
    Dim i As Integer

    For i = 0 To 30
        If Range("E26").Offset(0, i).Value = Range("J6").Value Then
            Set orivalue = find_prevconfig(i)
            MsgBox (orivalue)
        End If
    Next i
End Sub

调试行是MsgBox (orivalue),因为它说orivalue = nothing。您的帮助和建议真的很感谢!

carvr3hs

carvr3hs1#

未设置对象变量或With块变量”或错误“91”
有几件事我将解决。

**1.**关于此错误,您需要在使用之前检查对象是否存在。例如

MsgBox (orivalue)应写为

Set orivalue = find_prevconfig(i)
If Not orivalue Is Nothing Then
    MsgBox orivalue.Value
Else
    MsgBox "Object is Nothing"
End If

**2.**即使条件为True,您的对象find_prevconfig也将始终为Nothing。这是由于输入错误。函数名为find_prevconfig,但您使用的是find_preconfig。建议始终使用Option Explicit
**3.**完全限定您的对象。在代码中,如果不这样做,则它将引用活动工作表,并且活动工作表可能不是您所期望的工作表。例如ThisWorkbook.Sheets("Sheet1").Range("E590").Offset(y, x2)
**4.**尽管.Value是赋值或阅读值时的默认属性,但建议显式使用它。我个人认为这是一个好习惯。这将帮助您在将来快速浏览代码时避免许多麻烦。Set rng = Range("SomeRange")SomeValue = Range("SomeRange").ValueSomeValue = Range("SomeRange").Value2
**5.**在进行字符串比较时,建议考虑字符串可以包含空格或大小写不同。"y"不等于"Y"。同样,"Y "不等于"Y"。如果需要,可以使用TRIMUCASE来实现此目的,如下面的代码所示。

您的程式码可以写成(UNTESTED

Option Explicit

Function find_prevconfig(x2 As Long) As Range
    Dim y As Long
    Dim rng As Range
    Dim ws As Worksheet
    
    '~~> Change sheet as applicable
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    For y = 0 To 30
        If Trim(UCase(ws.Range("E590").Offset(y, x2).Value2)) = "Y" Then
            Set rng = ws.Range("C590").Offset(y)
            Exit For
        End If
    Next y
    
    Set find_prevconfig = rng
End Function

Private Sub btn_confirm_Click()
    Dim orivalue As Range
    Dim i As Long
    Dim ws As Worksheet
    
    '~~> Change sheet as applicable
    '~~> You can also pass the worksheet as a parameter if the comparision is
    '~~> in the same sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    For i = 0 To 30
        If ws.Range("E26").Offset(0, i).Value = ws.Range("J6").Value Then
            Set orivalue = find_prevconfig(i)
            
            '~~> Msgbox in a long loop can be very annoying. Use judiciously
            If Not orivalue Is Nothing Then
                'MsgBox orivalue.Value
                Debug.Print orivalue.Value
            Else
                'MsgBox "Object is Nothing"
                Debug.Print "Object is Nothing"
            End If
        End If
    Next i
End Sub

相关问题