对象变量或块变量未设置错误访问Vba

时间:2017-01-09 16:16:10

标签: vba ms-access

我尝试阅读有关此错误的其他已发布的问题,但我仍然无法理解它。

我在重命名变量后发现错误并发布了这个问题,我使用选项显式并调试我的代码并修复了我的命名问题,但我仍然遇到一个问题,即我的21个组合框中的2个在操作行中是仍然得到同样的错误。当他们使用与其他19相同的功能时,他们怎么会得到一个错误。我检查了他们的名字,他们是正确的,这怎么可能?

我有一个我已构建的表单,其设置外观和功能类似于excel电子表格。这是布局,首先是列名,然后是控件类型

Operation   Time/Min   DecTime    LaborRate   Cost    MarkUp    Total 
ComboBox     TextBox   Label       Label      Label   TextBox   Label

所以我总共有7列,有21行(不包括列名),我可以在其中输入数据。任何有标签的地方都没有用户输入,其价值仅来自其他字段。

我对表单控件cb_op1,cb_op2,cb_op3使用了以下命名约定...我只是将它递增1来模仿行号(控件名加行号)。 Operation = cb_op,Time = tb_time,DecTime = tb_Dectime,LaborRate = tb_LbrRate,Cost = tb_Cost,MarkUp = tb_MU,Total = tb_Total。

我为我的控件编写了AfterUpdate事件的函数。第一个函数根据行号获取控件的值,然后允许我将其赋值给变量,此函数用于多个控件更新事件。

Private Function GetControlValue(name As String) As Object

    Dim obj As Object

    For Each obj In Me.Controls
        If obj.name = name Then
            Set GetControlValue = obj
            Exit Function
        End If

    Next

End Function

下一个函数用于根据更新后事件实际更新行中的其他字段。我在此函数中使用上面列出的GetControlValue函数。这仅适用于操作列。

Private Function OperationsUpdate(RowNumber As Integer)

 Dim Operations As Object
 Dim Time As Object
 Dim DecTime As Object
 Dim LaborRate As Object

 Set Operations = GetControlValue("cb_op" & RowNumber)
 Set Time = GetControlValue("tb_time" & RowNumber)
 Set DecTime = GetControlValue("tb_DecTime" & RowNumber)
 Set LaborRate = GetControlValue("tb_LbrRate" & RowNumber)
 Set Cost = GetControlValue("tb_Cost" & RowNumber)

    If IsNull(Time.Value) Then
        If IsNull(Operation.Value) Then
            Cost.Value = ""
            LaborRate.Value = ""
        Else
            LaborRate.Value = DLookup("LaborRate", "OperationsType", "[operationsID] = " & Operation.Value)
        End If
    Else
        If IsNull(Operation.Value) Then
            Cost.Value = ""
            LaborRate.Value = ""
        Else
            LaborRate.Value = DLookup("LaborRate", "OperationsType", "[operationsID] = " & Operation.Value)
            Cost.Value = DecTime.Value * LaborRate.Value
        End If
    End If

    FormObjectsUpdate2 (RowNumber)

 Set Operations = Nothing
 Set Time = Nothing
 Set DecTime = Nothing
 Set LaborRate = Nothing
 Set Cost = Nothing

End Function

最后,这是我的After更新事件对每个控件的看法。我只发布前三个而不是全部21来节省空间。

Private Sub cb_op1_AfterUpdate()
    OperationsUpdate (1)
End Sub

Private Sub cb_op2_AfterUpdate()
    OperationsUpdate (2)
End Sub

Private Sub cb_op3_AfterUpdate()
    OperationsUpdate (3)
End Sub

我刚刚在更新事件发生相同问题之后发布了第一列操作的函数和代码。

0 个答案:

没有答案