VBA Перебирает имена столбцов таблицы и объединяет данные на новом листе

#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 отсутствует точка