运行-将 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 移动到顶部,因为实际的数据行会出现。