Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将数组的每个值作为新行添加到ListObject_Excel_Vba - Fatal编程技术网

Excel 将数组的每个值作为新行添加到ListObject

Excel 将数组的每个值作为新行添加到ListObject,excel,vba,Excel,Vba,我试图通过测试奇数位代码和解构它的工作原理来扩展我对VBA的知识 我正在尝试更好地使用数组,并对它们有更多的了解,因为我认为它们有很多实际用途,但现在我在尝试将其与ListObject结合使用时遇到了困难 我已经创建了下面的宏。它成功地填充数组,然后将内容放入工作表中 但是,我遇到的问题是,我希望向数组中添加值,然后将这些值添加到表(列出对象)中,同时保留其中的现有数据。目前,这只是将数据添加到表的顶部,并覆盖任何现有内容。我已经尝试过使用许多不同的方法来添加一个列表行,但是它只将数组中的第一个

我试图通过测试奇数位代码和解构它的工作原理来扩展我对VBA的知识

我正在尝试更好地使用数组,并对它们有更多的了解,因为我认为它们有很多实际用途,但现在我在尝试将其与ListObject结合使用时遇到了困难

我已经创建了下面的宏。它成功地填充数组,然后将内容放入工作表中

但是,我遇到的问题是,我希望向数组中添加值,然后将这些值添加到表(列出对象)中,同时保留其中的现有数据。目前,这只是将数据添加到表的顶部,并覆盖任何现有内容。我已经尝试过使用许多不同的方法来添加一个列表行,但是它只将数组中的第一个值放在表中,而不是整个值

我想创建一个新行,添加数据,对于每一段数据,还要为该行中的一列设置另一个值,然后继续

例如,我希望代码执行以下操作:

Search for criteria in Table named PRODUCT

Criteria = "Monthly"

Add all the items in column 3 to an array

Put the content of the array in another table called TRACKER. 
For every record put in, set the column called Job Type to STANDARD. 
到目前为止,这就是我在下面所做的。它是一个静态数组,因此在我计算它时,我更容易使用它。然而,实际上,我将通过过滤listobject,然后将第3列中的所有值添加到数组中,从工作表中获取数组的内容

Sub ArrayExercise_3()
Dim myArray(1 To 5) As Integer
Dim i As Integer
Dim arrTable As ListObject
Dim arrRow As ListRow

Set arrTable = ThisWorkbook.Worksheets("Array2").ListObjects("Table7")
Set arrRow = arrTable.ListRows.Add

myArray(1) = 10
myArray(2) = 20
myArray(3) = 30
myArray(4) = 40
myArray(5) = 50

For i = 1 To UBound(myArray)
    arrTable.DataBodyRange.Cells(i, 1) = myArray(i)
    arrTable.DataBodyRange.Cells(i, 2) = "TEST"
Next i

End Sub

你可以这样做。您需要为每个数组元素添加新行,以便将其放入循环中。不过我怀疑你可以不用一个循环就做到这一点

Sub ArrayExercise_3()
Dim myArray(1 To 5) As Integer
Dim i As Integer
Dim arrTable As ListObject
Dim arrRow As ListRow

Set arrTable = ThisWorkbook.Worksheets("Array2").ListObjects("Table7")

myArray(1) = 10
myArray(2) = 20
myArray(3) = 30
myArray(4) = 40
myArray(5) = 50

For i = 1 To UBound(myArray)
    arrTable.ListRows.Add
    With arrTable.DataBodyRange
        .Cells(.Rows.Count, 1).Value = myArray(i)
        .Cells(.Rows.Count, 2) = "TEST"
    End With
Next i

End Sub

你可以这样做。您需要为每个数组元素添加新行,以便将其放入循环中。不过我怀疑你可以不用一个循环就做到这一点

Sub ArrayExercise_3()
Dim myArray(1 To 5) As Integer
Dim i As Integer
Dim arrTable As ListObject
Dim arrRow As ListRow

Set arrTable = ThisWorkbook.Worksheets("Array2").ListObjects("Table7")

myArray(1) = 10
myArray(2) = 20
myArray(3) = 30
myArray(4) = 40
myArray(5) = 50

For i = 1 To UBound(myArray)
    arrTable.ListRows.Add
    With arrTable.DataBodyRange
        .Cells(.Rows.Count, 1).Value = myArray(i)
        .Cells(.Rows.Count, 2) = "TEST"
    End With
Next i

End Sub

您应该在循环中添加行,如下所示:

For i = 1 To UBound(myArray)
    Set arrRow = arrTable.ListRows.Add
    arrRow.Range(1, 1) = myArray(i)
    arrRow.Range(1, 2) = "TEST"
Next i

您应该在循环中添加行,如下所示:

For i = 1 To UBound(myArray)
    Set arrRow = arrTable.ListRows.Add
    arrRow.Range(1, 1) = myArray(i)
    arrRow.Range(1, 2) = "TEST"
Next i

首先,应该在循环中移动ListObject的扩展,以便为每个数组元素插入新行

其次,数组和ListObject的索引不同

第三,如果你写UBound,最好也写LBound

Sub ArrayExercise_3()
    Dim myArray(1 To 5) As Integer
    Dim i As Integer
    Dim arrTable As ListObject
    Dim arrRow As ListRow

    Set arrTable = ThisWorkbook.Worksheets("Array2").ListObjects("Table7")

    myArray(1) = 10
    myArray(2) = 20
    myArray(3) = 30
    myArray(4) = 40
    myArray(5) = 50

    For i = LBound(myArray) To UBound(myArray)
        Set arrRow = arrTable.ListRows.Add
        arrTable.DataBodyRange.Cells(arrTable.DataBodyRange.Rows.Count, 1).Value = myArray(i)
        arrTable.DataBodyRange.Cells(arrTable.DataBodyRange.Rows.Count, 2).Value = "TEST"
    Next i

End Sub

我没有测试上面的代码,但它应该可以工作,或者至少显示了这个想法。它没有针对速度进行优化(同时插入所有值必须更快),但遵循原始代码的逻辑。

首先,应将ListObject的扩展移动到循环中,以便为每个数组元素插入新行

其次,数组和ListObject的索引不同

第三,如果你写UBound,最好也写LBound

Sub ArrayExercise_3()
    Dim myArray(1 To 5) As Integer
    Dim i As Integer
    Dim arrTable As ListObject
    Dim arrRow As ListRow

    Set arrTable = ThisWorkbook.Worksheets("Array2").ListObjects("Table7")

    myArray(1) = 10
    myArray(2) = 20
    myArray(3) = 30
    myArray(4) = 40
    myArray(5) = 50

    For i = LBound(myArray) To UBound(myArray)
        Set arrRow = arrTable.ListRows.Add
        arrTable.DataBodyRange.Cells(arrTable.DataBodyRange.Rows.Count, 1).Value = myArray(i)
        arrTable.DataBodyRange.Cells(arrTable.DataBodyRange.Rows.Count, 2).Value = "TEST"
    Next i

End Sub

我没有测试上面的代码,但它应该可以工作,或者至少显示了这个想法。它没有针对速度进行优化(同时插入所有值必须更快),但遵循原始代码的逻辑。

在添加行时,我避免使用
ListObject.DataBodyRange
。如果表中没有行,则
ListObject.DataBodyRange=Nothing
。使用
ListObject.ListRows.Add.Range
更简单,它将始终返回一个Range对象

Sub Demo()

    Dim myArray(1 To 5) As Integer
    myArray(1) = 10
    myArray(2) = 20
    myArray(3) = 30
    myArray(4) = 40
    myArray(5) = 50

    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects(1)

    rowCount = tbl.ListRows.Count
    tbl.ListRows.Add.Range.Resize(UBound(myArray) + 1, 1).Value = myArray

End Sub

我避免在添加行时使用
ListObject.DataBodyRange
。如果表中没有行,则
ListObject.DataBodyRange=Nothing
。使用
ListObject.ListRows.Add.Range
更简单,它将始终返回一个Range对象

Sub Demo()

    Dim myArray(1 To 5) As Integer
    myArray(1) = 10
    myArray(2) = 20
    myArray(3) = 30
    myArray(4) = 40
    myArray(5) = 50

    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects(1)

    rowCount = tbl.ListRows.Count
    tbl.ListRows.Add.Range.Resize(UBound(myArray) + 1, 1).Value = myArray

End Sub