【问题标题】:Object variable or With block variable not set (Error 91) in excel在 Excel 中未设置对象变量或带有块变量(错误 91)
【发布时间】:2015-05-02 13:53:56
【问题描述】:

出现错误:在 excel vba 中未设置对象变量或块变量(错误 91)。

    Sub RegisterNewUser()

'Disable screen refresh during code excution
Application.ScreenUpdating = False


'Variables
Dim users As Worksheet           'Variable for users table sheet
Dim NewUser As Worksheet         'Variable for new user entry sheet
Dim RecordIsValid As String
Dim NextRecordIndex As Long      'Variable for the next available row in the users table

Set users = ThisWorkbook.Worksheets("USERS")
Set NewUser = ThisWorkbook.Worksheets("NEW USER")
NextRecordIndex = users.ListObjects("USERS").ListRows.Count

If NextRecordIndex = 0 Then

users.ListObjects("USERS").DataBodyRange(NextRecordIndex, 1).Value = NewUser.Range("D" & 6).Value

Else

NextRecordIndex = NextRecordIndex + 1

users.ListObjects("USERS").DataBodyRange(NextRecordIndex, 1).Value = NewUser.Range("D" & 6).Value

    End If

错误就在这里:

after the if statement:

users.ListObjects("USERS").DataBodyRange(NextRecordIndex, 1).Value = NewUser.Range("D" & 6).Value

else 条件下的代码工作正常。仅当 USERS 表为空且行数为零时才会出现此错误。

谁能指导一下是什么问题?

谢谢..

【问题讨论】:

  • 那么在 USERS 工作表上,您有一个名为 USERS 的表?
  • 检查 ThisWorkbook.Worksheets("NEW USER") 的计算结果是否为 Nothing
  • 是的,在 USERS 工作表下有一个 USERS 表。
  • else 条件下的代码工作正常: NextRecordIndex = NextRecordIndex + 1 users.ListObjects("USERS").DataBodyRange(NextRecordIndex, 1).Value = NewUser.Range("D" & 6) .Value 只有在 NextRecordIndex 为 0(表为空)时不起作用

标签: excel vba


【解决方案1】:

如果数字或记录为0,则不能参考:

users.ListObjects("USERS").DataBodyRange

因为它不存在(DataBodyRange = Nothing

你应该先添加一个空行:

users.ListObjects("USERS").ListRows.Add

您还应该替换:

users.ListObjects("USERS").DataBodyRange(NextRecordIndex, 1).Value

users.ListObjects("USERS").DataBodyRange(NextRecordIndex+1, 1).Value

编辑:

if 语句可能是多余的,下面的代码应该适用于所有情况:

NextRecordIndex = users.ListObjects("USERS").ListRows.Count

users.ListObjects("USERS").ListRows.Add
users.ListObjects("USERS").DataBodyRange(NextRecordIndex + 1, 1).Value = 
      NewUser.Range("D" & 6).Value

【讨论】:

  • 很好的提示。错误消失了,但记录已插入标题行。当表格为空时,有什么方法可以在表格的第一行插入?
  • @SupermanAkrt 请看一下答案的第二部分(编辑)。只需将1 添加到NextRecordIndex
  • 很好,现在可以工作,但我有一个问题:当我使用:users.ListObjects("USERS").DataBodyRange(1, 1).Value 它添加到第二个 DataBodyRange 行中。
  • @SupermanAkrt 我再次编辑了我的答案以简化您的代码。
猜你喜欢
  • 2014-01-08
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
相关资源
最近更新 更多