我有一个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
但我一直在突出显示的行上得到同样的错误:
Application-defined or object-defined error
我做错了什么?
提前致谢!
您没有说明您使用的是哪个版本的Excel。这是为2007/2010编写的(Excel 2003需要不同的apprach)
你也没有说你如何调用addDataToTable
以及你传递给arrData
的内容。
我猜你正在通过基于0
的阵列。如果是这种情况(并且表格从列A
开始),那么iCount
将从0
计算,而.Cells(lLastRow + 1, iCount)
将尝试引用无效的列0
。
你也没有利用ListObject
。您的代码假设ListObject
1位于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
可以通过多种方式调用:
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
Tbl.ListRows.Add
对我不起作用,我相信其他人也面临同样的问题。我使用以下解决方法:
'First check if the last row is empty; if not, add a row
If table.ListRows.count > 0 Then
Set lastRow = table.ListRows(table.ListRows.count).Range
For col = 1 To lastRow.Columns.count
If Trim(CStr(lastRow.Cells(1, col).Value)) <> "" Then
lastRow.Cells(1, col).EntireRow.Insert
'Cut last row and paste to second last
lastRow.Cut Destination:=table.ListRows(table.ListRows.count - 1).Range
Exit For
End If
Next col
End If
'Populate last row with the form data
Set lastRow = table.ListRows(table.ListRows.count).Range
Range("E7:E10").Copy
lastRow.PasteSpecial Transpose:=True
Range("E7").Select
Application.CutCopyMode = False
希望它可以帮助那里的人。
我有相同的错误消息,经过大量的试验和错误后发现它是由ListObject上设置的高级过滤器引起的。清除高级过滤器.listrows.add再次正常工作。要清除过滤器我使用它 - 不知道如何只清除特定列表对象而不是完整工作表的过滤器。
Worksheets("mysheet").ShowAllData
我实际上刚刚发现,如果你想在你的表格中选择下面添加多行Selection.ListObject.ListRows.Add AlwaysInsert:=True
效果非常好。我只是复制代码五次,在我的表中添加五行
之前我有同样的问题,我通过在新工作表中创建相同的表并删除与表关联的所有名称范围来修复它,我相信当你使用listobjects时,你不会将你的名字范围包含在你的表希望有助于谢谢
今天遇到这个问题(Excel使用.ListRows.Add
添加行时崩溃)。阅读完这篇文章并检查我的表后,我意识到该行中某些单元格中公式的计算取决于其他单元格中的值。在我的情况下,更高列中的细胞和甚至具有公式的细胞!
解决方案是从后到前填充新添加的行,因此计算不会出错。
Excel通常可以处理不同单元格中的公式,但它似乎在表格中按行(A,B,C等等)的顺序添加一行重新计算。
希望这有助于清除.ListRows.Add
的问题
只需删除表并创建一个具有不同名称的新表。另请勿删除该表的整行。似乎当包含表格行的整行被删除时,它会损坏DataBodyRange
因为使用ListRow.Add
可能是一个巨大的瓶颈,我们应该只在它无法避免的情况下使用它。如果性能对您很重要,请在此处使用此函数来调整表的大小,这比以推荐方式添加行要快得多。
请注意,如果有数据,这将覆盖您桌子下方的数据!
此功能基于Chris Neilsen接受的答案
Public Sub AddRowToTable(ByRef tableName As String, ByRef data As Variant)
Dim tableLO As ListObject
Dim tableRange As Range
Dim newRow As Range
Set tableLO = Range(tableName).ListObject
tableLO.AutoFilter.ShowAllData
If (tableLO.ListRows.Count = 0) Then
Set newRow = tableLO.ListRows.Add(AlwaysInsert:=True).Range
Else
Set tableRange = tableLO.Range
tableLO.Resize tableRange.Resize(tableRange.Rows.Count + 1, tableRange.Columns.Count)
Set newRow = tableLO.ListRows(tableLO.ListRows.Count).Range
End If
If TypeName(data) = "Range" Then
newRow = data.Value
Else
newRow = data
End If
End Sub