UserForm命令按钮代码 - 错误91:对象变量或未设置块变量

时间:2016-11-30 15:22:21

标签: vba excel-vba userform excel

我有一个命令按钮单击事件的代码,它不断抛出错误91.当我单步执行代码时,它会在“Set findvalue”代码执行后立即抛出错误。请参阅下面的代码段。在检查代码本身时,我无法弄明白。

'findvalue'的尺寸为范围对象。 'DataSH'是主数据表以记录ID列(B列)开头存在的工作表。用户表单元素在DataSH的数据表中设置为各自的列。

    Private Sub cmdEdit_Click()
    'declare the variables
    Dim findvalue As Range
    Dim cNum As Integer
    Dim DataSH As Worksheet
    'error handling
    On Error GoTo errHandler:
    'hold in memory and stop screen flicker
    Application.ScreenUpdating = False
    Set DataSH = Sheet1

设置此片段的click事件子例程将根据这些UF元素中的值(即更改或删除)更新DataSH中所选记录ID(行号标识符)的行上的相应列数据值)。重点是使用UF元素(文本框和组合框)中的任何更改来更新DataSH上的主数据表。

    Set findvalue = DataSH.Range("B:B"). _
    Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole)
    'update the values
    findvalue = tbRecID.Value
    findvalue.Offset(0, 1) = tbRecDate.Value
    findvalue.Offset(0, 2) = cmbRecLoc.Value
    findvalue.Offset(0, 3) = cmbRecCust.Value
    findvalue.Offset(0, 4) = tbRecAmt.Value
    findvalue.Offset(0, 5) = cmbRecComm.Value
    findvalue.Offset(0, 6) = cmbRecPrin.Value
    findvalue.Offset(0, 7) = tbRecTerr.Value
    findvalue.Offset(0, 8) = tbRecRep.Value

3 个答案:

答案 0 :(得分:1)

我认为DataSH没有设置。是" Sheet1"工作表的名称或工作表变量?如果它是一个名称,那么你必须像这样设置DataSH:

Set DataSH = thisworkbook.worksheets("Sheet1") 

而不是Set DataSH = Sheet1

答案 1 :(得分:0)

错误91会弹出(在这种情况下),因为您尝试将值分配给尚未设置的某个范围,因此Me.tbRecID.Value中不存在DataSH.Range("B:B")。要避免此问题,可以添加一些错误异常,例如:

    Set findvalue = DataSH.Range("B:B"). _
    Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole)
    'update the values
On Error GoTo ErrHand:
    findvalue = tbRecID.Value
On Error GoTo 0
    findvalue.Offset(0, 1) = tbRecDate.Value
    findvalue.Offset(0, 2) = cmbRecLoc.Value
    findvalue.Offset(0, 3) = cmbRecCust.Value
    findvalue.Offset(0, 4) = tbRecAmt.Value
    findvalue.Offset(0, 5) = cmbRecComm.Value
    findvalue.Offset(0, 6) = cmbRecPrin.Value
    findvalue.Offset(0, 7) = tbRecTerr.Value
    findvalue.Offset(0, 8) = tbRecRep.Value
ErrHand:
[rest of your code]

如果没有为此变量分配范围,这将强制程序绕过使用findvalue的行。

答案 2 :(得分:0)

您的代码无法找到" Me.tbRecID.Value"在" DataSH.Range(" B:B")"

所以将你的代码包装在" If Then End If"如果findvalue实际上已设置为有效范围

,则执行
Set findvalue = DataSH.Range("B:B"). _
Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not findvalue Is Nothing Then
    findvalue.Offset(0, 1) = tbRecDate.Value
    findvalue.Offset(0, 2) = cmbRecLoc.Value
    findvalue.Offset(0, 3) = cmbRecCust.Value
    findvalue.Offset(0, 4) = tbRecAmt.Value
    findvalue.Offset(0, 5) = cmbRecComm.Value
    findvalue.Offset(0, 6) = cmbRecPrin.Value
    findvalue.Offset(0, 7) = tbRecTerr.Value
    findvalue.Offset(0, 8) = tbRecRep.Value
End If