VBA Копирует значения с одного листа на другой на основе заголовков с помощью таблицы сопоставления

#vba #dictionary #header #mapping

Вопрос:

У меня есть рабочая тетрадь с листом 1, листом 2, отображением. Я хочу скопировать значения со листа 2 на лист 1 на основе заголовков строк/столбцов на обоих листах. Заголовки столбцов не могли совпадать, поэтому я создал таблицу сопоставления на листе «Сопоставление», чтобы соответствовать этим заголовкам. Следующий код работает для заголовков столбцов, но я не знаю, как также учитывать заголовки строк. Поэтому любые советы будут оценены по достоинству :). Также я хочу использовать «именованную таблицу» для целевого листа, поэтому, если у вас есть какие-либо идеи..

Отображение:

введите описание изображения здесь

Лист1:

введите описание изображения здесь

Лист2:

введите описание изображения здесь

Результат, которого я хочу:

введите описание изображения здесь

Код:

     Public Sub test()
        Application.ScreenUpdating = False
        stack "Sheet2", "Sheet1", "Mapping" 
        Application.ScreenUpdating = True
    End Sub
    
    Public Sub stack(ByVal Sheet2 As String, ByVal Sheet1 As String, ByVal Mapping As String)
        Dim rng As Range, trgtCell As Range, src As Worksheet, trgt As Worksheet, helper As Worksheet
        Set src = Worksheets("Sheet2")
        Set trgt = Worksheets("Sheet1")
        Set helper = Worksheets("Mapping")
    
        With src
            For Each rng In Intersect(.Rows(3), .UsedRange).SpecialCells(xlCellTypeConstants)
                Dim lkup As Variant
                With helper
                    lkup = Application.VLookup(rng.Value, .Range("A2:B" amp; .Cells(.Rows.Count, "A").End(xlUp).Row), 2, False)
                End With
                If Not IsError(lkup) Then
                    Set trgtCell = trgt.Rows(2).Find(lkup, LookIn:=xlValues, lookat:=xlWhole)
                    If Not trgtCell Is Nothing Then
                        .Range(rng.Offset(1), .Cells(.Rows.Count, rng.Column).End(xlUp)).Copy
                        With trgt                                                  
                            .Range(Split(trgtCell.Address, "$")(1) amp; 3).PasteSpecial
                        End With
                    End If
                End If
            Next rng
        End With
    End Sub