Определите массив с именами ваших столбцов ColumnNameList = Array("id", "sisteprosess", "hendelse")
, а затем l oop через него.
Вам также понадобится счетчик PasteColumn
, чтобы перейти к следующему столбцу для вставки в рабочий лист данных. Обратите внимание, что это начнется в столбце A вашего рабочего листа данных, затем вставьте его в B, C,….
Также не используйте .Activate
, поскольку вы уже установили свои рабочие листы на переменные SourceWS
и TargetWS
вы можете использовать их без активации dircetcy.
Вы можете использовать .Offset(RowOffset:=1)
для перехода от найденного заголовка на одну строку вниз, чтобы он начинался со строки 2 только для копирования данных (без заголовка).
Option Explicit
Public Sub CopyColumnsByName()
Dim SourceWS As Worksheet
Set SourceWS = Workbooks("UTTREKK.xlsx").Worksheets(1)
Dim TargetWS As Worksheet
Set TargetWS = Workbooks("Target.xlsm").Worksheets("data")
'COPY AND PASTE COLUMNS
Dim LastRowA As Long 'last row in col A (use for all copy actions)
LastRowA = SourceWS.Cells(SourceWS.Rows.Count, "A").End(xlUp).Row
Dim LastCol As Long 'last column for search
LastCol = SourceWS.Cells(1, SourceWS.Columns.Count).End(xlToLeft).Column
Dim SearchRange As Range 'define search range for column name
Set SearchRange = SourceWS.Range("A1", SourceWS.Cells(1, LastCol))
Dim ColumnNameList() As Variant
ColumnNameList = Array("id", "sisteprosess", "hendelse") 'your columns list
Dim PasteColumn As Long
PasteColumn = 1 'start pasting in column 1 of your data worksheet
Dim ColumnName As Variant
For Each ColumnName In ColumnNameList
With SearchRange
Dim FoundAt As Range
Set FoundAt = .Find(What:=ColumnName, _
After:=.Cells(1), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False)
If Not FoundAt Is Nothing Then
SourceWS.Range(FoundAt.Offset(RowOffset:=1), SourceWS.Cells(LastRowA, FoundAt.Column)).Copy Destination:=TargetWS.Cells(2, PasteColumn)
PasteColumn = PasteColumn + 1 'move to next paste column
End If
End With
Next ColumnName
End Sub
Обратите внимание, что здесь список столбцов ColumnNameList = Array("id", "sisteprosess", "hendelse")
жестко запрограммирован. Если они у вас уже есть в пункте назначения, вы можете лучше прочитать их оттуда, а не записывать в свой код.
ColumnNameList = TargetWS.Range("A1", TargetWS.Cells(1, TargetWS.Columns.Count).End(xlToLeft)).Value