将新行添加到Excel表(VBA)

Mig*_*ira 11 excel vba excel-vba

我有一个excel,用于记录您摄取特定日期和膳食的食物.我有一个网格,其中每一行代表你吃的食物,它有多少糖,等等.

然后我添加了一个保存按钮,将所有数据保存到另一个表格中的表格中.

这就是我尝试过的

    Public Sub addDataToTable(ByVal strTableName As String, ByRef arrData As Variant)
    Dim lLastRow As Long
    Dim iHeader As Integer
    Dim iCount As Integer

    With Worksheets(4).ListObjects(strTableName)
        'find the last row of the list
        lLastRow = Worksheets(4).ListObjects(strTableName).ListRows.Count

        'shift from an extra row if list has header
        If .Sort.Header = xlYes Then
            iHeader = 1
        Else
            iHeader = 0
        End If
    End With

    'Cycle the array to add each value
    For iCount = LBound(arrData) To UBound(arrData)
        **Worksheets(4).Cells(lLastRow + 1, iCount).Value = arrData(iCount)**
    Next iCount
End Sub
Run Code Online (Sandbox Code Playgroud)

但我一直在突出显示的行上得到同样的错误:

Application-defined or object-defined error
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

提前致谢!

chr*_*sen 24

您没有说明您使用的是哪个版本的Excel.这是为2007/2010编写的(Excel 2003需要不同的apprach)

你也没有说你是如何打电话addDataToTable以及你传递的是什么arrData.
我猜你正在传递一个0基础阵列.如果是这种情况(与表中的列开始A),然后iCount将计算0.Cells(lLastRow + 1, iCount)会尝试引用列0这是无效的.

你也没有利用这个ListObject.您的代码假定ListObject1位于行的开头1.如果不是这种情况,您的代码会将数据放在错误的行中.

这是一个利用它的替代方案 ListObject

Sub MyAdd(ByVal strTableName As String, ByRef arrData As Variant)
    Dim Tbl As ListObject
    Dim NewRow As ListRow

    ' Based on OP 
    ' Set Tbl = Worksheets(4).ListObjects(strTableName)
    ' Or better, get list on any sheet in workbook
    Set Tbl = Range(strTableName).ListObject
    Set NewRow = Tbl.ListRows.Add(AlwaysInsert:=True)

    ' Handle Arrays and Ranges
    If TypeName(arrData) = "Range" Then
        NewRow.Range = arrData.Value
    Else
        NewRow.Range = arrData
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

可以通过多种方式调用:

Sub zx()
    ' Pass a variant array copied from a range
    MyAdd "MyTable", [G1:J1].Value
    ' Pass a range
    MyAdd "MyTable", [G1:J1]
    ' Pass an array
    MyAdd "MyTable", Array(1, 2, 3, 4)
End Sub
Run Code Online (Sandbox Code Playgroud)

  • @Jonas_Hess我刚刚在一张简单的工作表上进行了测试,添加了100行<0.5s.所以这不是"AddRows"慢,它是你的"复杂"表.您是否尝试在代码运行时将"计算"设置为"手动"? (2认同)