Добавление каждого значения массива в ListObject в виде новой строки - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь расширить свои знания 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. 

Пока что это то, что я сделал ниже.Это статический массив, так что мне будет легче с ним работать, пока я это выясняю, однако на практике я получу содержимое массива из рабочего листа, отфильтровав объект-список и затем добавив все значения в столбце 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

Ответы [ 4 ]

0 голосов
/ 02 апреля 2019

Я избегаю использования 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
0 голосов
/ 01 апреля 2019

Вы должны добавлять строки внутри цикла, например:

For i = 1 To UBound(myArray)
    Set arrRow = arrTable.ListRows.Add
    arrRow.Range(1, 1) = myArray(i)
    arrRow.Range(1, 2) = "TEST"
Next i
0 голосов
/ 01 апреля 2019

Прежде всего, вы должны переместить расширение ListObject внутри цикла, чтобы новая строка вставлялась для каждого элемента массива.

Во-вторых, индексирование Array и 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

Я не тестировал приведенный выше код, но он должен работать или, по крайней мере, показать идею.Он не оптимизирован для скорости (одновременная вставка всех значений должна выполняться быстрее), но следует логике исходного кода.

0 голосов
/ 01 апреля 2019

Вы можете сделать это таким образом.Вам нужно добавить новую строку для каждого элемента массива, поэтому поместите его в цикл.Я подозреваю, что вы можете сделать это вообще без цикла.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...