运行-将 Table Listobject 单元格设置为工作表值时出现错误“91”
Run-time error '91' When Setting Table Listobject Cells to Worksheet Values
我正在尝试创建一个子程序,它将工作表中的各种值存储在变量中,然后将变量复制到列表对象 (table) 中空白行的适当列中。我继续收到以下错误:
"运行-时间错误'91':
未设置对象变量或 With 块变量
我尝试了很多变体,但总是出现错误,有时甚至是不同的错误。非常感谢任何建议。这是代码
Sub RecordData()
Dim strName1 As String, strName2 As String
Dim dTimeStamp As Date
Dim sItem1 As Single, sItem2 As Single, sItem3 As Single
Dim sItem4 As Single
Dim ws_1 As Worksheet, ws_2 As Worksheet
Set ws_1 = Sheets("Data")
Set ws_2 = Sheets("Output")
strName1 = ws_1.Range("D1").MergeArea.Cells(1, 1).Value
strName1 = Left(strName1, Len(strName1) - 6)
strName2 = ws_1.Range("B17")
dTimestamp = Now
sItem1 = ws_1.Range("D3")
sItem2 = ws_1.Range("E3")
sItem3 = ws_1.Range("F3")
sItem4 = ws_1.Range("N3")
Dim loTable As ListObject
Set loTable = ws_2.ListObjects("CurrentMkts")
Dim iLastRow As Integer
iLastRow = loTable.Range.Rows.Count
If iLastRow = 2 Then
Dim iTempRow As Integer
iTempRow = iLastRow - 1
loTable.DataBodyRange.Cells(iTempRow, 1).Value = dTimeStamp
loTable.DataBodyRange.Cells(iTempRow, 2).Value = sItem1
loTable.DataBodyRange.Cells(iTempRow, 3).Value = sItem2
loTable.DataBodyRange.Cells(iTempRow, 4).Value = sItem3
loTable.DataBodyRange.Cells(iTempRow, 6).Value = sItem4
loTable.ListRows.Add
Else
iTempRow = iLastRow
loTable.DataBodyRange.Cells(iTempRow, 1).Value = dTimeStamp
loTable.DataBodyRange.Cells(iTempRow, 2).Value = sItem1
loTable.DataBodyRange.Cells(iTempRow, 3).Value = sItem2
loTable.DataBodyRange.Cells(iTempRow, 4).Value = sItem3
loTable.DataBodyRange.Cells(iTempRow, 6).Value = sItem4
loTable.ListRows.Add
End If
End Sub
感谢您的帮助。
错误的发生是由于 Excel 中处理空白 ListObjects 的看似无意义的方式。
本质上,在这种情况下,因为 ListObject 中没有数据,Excel 将 DataBodyRange
属性 视为不存在,因此当您尝试设置值时DataBodyRange
个单元格的代码错误。
要修复它,请将 loTable.ListRows.Add
移动到设置单元格值之前的行,在 IF
块的第一部分。
IF 块的第二部分不需要 loTable.ListRows.Add 移动到顶部,因为实际的数据行会出现。
我正在尝试创建一个子程序,它将工作表中的各种值存储在变量中,然后将变量复制到列表对象 (table) 中空白行的适当列中。我继续收到以下错误:
"运行-时间错误'91': 未设置对象变量或 With 块变量
我尝试了很多变体,但总是出现错误,有时甚至是不同的错误。非常感谢任何建议。这是代码
Sub RecordData()
Dim strName1 As String, strName2 As String
Dim dTimeStamp As Date
Dim sItem1 As Single, sItem2 As Single, sItem3 As Single
Dim sItem4 As Single
Dim ws_1 As Worksheet, ws_2 As Worksheet
Set ws_1 = Sheets("Data")
Set ws_2 = Sheets("Output")
strName1 = ws_1.Range("D1").MergeArea.Cells(1, 1).Value
strName1 = Left(strName1, Len(strName1) - 6)
strName2 = ws_1.Range("B17")
dTimestamp = Now
sItem1 = ws_1.Range("D3")
sItem2 = ws_1.Range("E3")
sItem3 = ws_1.Range("F3")
sItem4 = ws_1.Range("N3")
Dim loTable As ListObject
Set loTable = ws_2.ListObjects("CurrentMkts")
Dim iLastRow As Integer
iLastRow = loTable.Range.Rows.Count
If iLastRow = 2 Then
Dim iTempRow As Integer
iTempRow = iLastRow - 1
loTable.DataBodyRange.Cells(iTempRow, 1).Value = dTimeStamp
loTable.DataBodyRange.Cells(iTempRow, 2).Value = sItem1
loTable.DataBodyRange.Cells(iTempRow, 3).Value = sItem2
loTable.DataBodyRange.Cells(iTempRow, 4).Value = sItem3
loTable.DataBodyRange.Cells(iTempRow, 6).Value = sItem4
loTable.ListRows.Add
Else
iTempRow = iLastRow
loTable.DataBodyRange.Cells(iTempRow, 1).Value = dTimeStamp
loTable.DataBodyRange.Cells(iTempRow, 2).Value = sItem1
loTable.DataBodyRange.Cells(iTempRow, 3).Value = sItem2
loTable.DataBodyRange.Cells(iTempRow, 4).Value = sItem3
loTable.DataBodyRange.Cells(iTempRow, 6).Value = sItem4
loTable.ListRows.Add
End If
End Sub
感谢您的帮助。
错误的发生是由于 Excel 中处理空白 ListObjects 的看似无意义的方式。
本质上,在这种情况下,因为 ListObject 中没有数据,Excel 将 DataBodyRange
属性 视为不存在,因此当您尝试设置值时DataBodyRange
个单元格的代码错误。
要修复它,请将 loTable.ListRows.Add
移动到设置单元格值之前的行,在 IF
块的第一部分。
IF 块的第二部分不需要 loTable.ListRows.Add 移动到顶部,因为实际的数据行会出现。