#arrays #vba #excel #loops
#массивы #vba #excel #циклы
Вопрос:
У меня есть 2 таблицы на отдельных вкладках, в которых есть несколько столбцов с одинаковыми именами. Я хотел бы объединить данные для этих двух таблиц в новую таблицу на третьей вкладке.
Я пробовал поэкспериментировать с несколькими способами сделать это, например, просто жестко закодировать местоположение столбца (например, A, B, C ..) и вручную ввести код в 20 или около того столбцах, которые мне нужно скопировать и вставить. Однако я бы предпочел выполнить цикл с массивом заголовков столбцов, которые мне нужно скопировать, захватить данные и добавить в 3-ю таблицу. Таким образом, если местоположения перемещаются, он продолжает работать, и мне нужно беспокоиться только о заголовках столбцов. Я не настолько продвинут в использовании массивов или работе с именованными таблицами в VBA, поэтому я надеялся, что кто-нибудь сможет мне помочь.
Пример:
Dim arr1 As Variant
Dim vItm As Variant
Dim tbl1 As ListObject
Dim tbl2 As ListObject
Dim tbl3 As ListObject
arr1 = Array("Header1", "Header2", "Header3")
Set tbl1 = Worksheets("Sheet1").ListObjects("Table1")
Set tbl2 = Worksheets("Sheet2").ListObjects("Table2")
Set tbl3 = Worksheets("Sheet3").ListObjects("Table3")
For Each vItm In arr1
Set c = tbl2.ListColumns(vItm).DataBodyRange
If Not c Is Nothing Then
col = c.Column
With tbl2.DataBodyRange
tRows = .Rows.Count
tCols = .Columns.Count
Set CopyRng = .Range(.Cells(0, col), .Cells(tRows - 1, col))
End With
Set Dest = tbl1.HeaderRowRange.Find(vItm, LookIn:=xlValues, LookAt:=xlWhole, _
MatchCase:=False, SearchFormat:=False)
MsgBox Dest.Address
Else
MsgBox "Header not found"
Exit Sub
End If
Next vItm
Для каждого заголовка столбца в массиве посмотрите в Table1 и скопируйте все данные ниже и вставьте в соответствующий заголовок столбца в Table3. Проделайте это со всеми элементами массива. Затем для каждого заголовка столбца в массиве загляните в Таблицу2 и скопируйте все данные ниже и вставьте в соответствующий заголовок столбца в Таблице3 под данными, полученными из Таблицы1.
Ценю любую помощь здесь. Спасибо!
Комментарии:
1. Вы можете использовать Find (), чтобы найти заголовки каждого столбца, поэтому я бы начал с этого, попробовал написать некоторый код, а затем опубликовать обратно, когда / если вы столкнетесь с конкретной проблемой. Прямо сейчас ваш вопрос немного слишком широкий — подход, который вы описываете, является разумным, поэтому попробуйте начать.
2. @TimWilliams Я обновил код в своем первоначальном сообщении, чтобы дать представление о том, к чему я пришел по этому поводу. Прямо сейчас я дошел до того, что, как мне кажется, у меня есть правильные данные, копируемые в каждом цикле, и правильный столбец назначения в таблице, который я буду консолидировать данные. Сейчас я немного застрял, потому что неясно, как я должен смещать ячейку назначения, чтобы добавить данные под последней активной строкой в таблице назначения. И тогда мне все равно нужно было бы перебрать 3-ю таблицу и сделать то же самое.
Ответ №1:
Я думаю, что я решил большинство своих проблем, ссылающихся на правильные таблицы и данные для копирования и перемещения. Я опубликую готовый код в моем первоначальном вопросе. Однако сейчас у меня возникают проблемы с некорректным обновлением некоторых переменных. Нравится этот фрагмент кода в конце моего подраздела. Я повторно использую copyrng, lastrow и lastcol из предыдущего раздела. При отладке lastrow и lastcol отображают правильное число, но диапазон копирования выбирает только столбец O (# 15) вплоть до последней строки. Есть идеи, что является причиной этого или как сбросить переменные?
With tbl3.DataBodyRange
CopyRng = .Range(Cells(1, 16), .Cells(lastRow, lastCol))
With CopyRng
.Copy
Debug.Print .Address
Debug.Print lastCol
End With
Заканчивается
Комментарии:
1. перед первым
Cells
отсутствует точка