我尝试阅读有关此错误的其他已发布的问题,但我仍然无法理解它。
我在重命名变量后发现错误并发布了这个问题,我使用选项显式并调试我的代码并修复了我的命名问题,但我仍然遇到一个问题,即我的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
我刚刚在更新事件发生相同问题之后发布了第一列操作的函数和代码。