определенные столбцы копируются из одного Excel в другой Excel на основе имени заголовка столбца

#excel #vba

#excel #vba

Вопрос:

Я хочу скопировать столбцы из одного Excel в другой Excel на основе имени заголовка столбца. у меня есть два файла Excel с именами «Source» и «Destination», как показано ниже на изображении:

Source.xls

Destination.xls

я хотел скопировать все столбцы из исходного файла и вставить в в конечный файл Excel на основе файла заголовка, т. е. в столбцы, заштрихованные желтым цветом.Поскольку в целевом файле определена некоторая формула, как показано, и она вычисляет значения из столбца исходного файла.

Я попробовал основные столбцы копирования и вставки. Хотя это работает, требуется много ручных вмешательств.

пример фрагмента кода:

 src.Range("A:A").Copy Destination:=trg.Range("A1")

src.Range("B:B").Copy Destination:=trg.Range("E1")

src.Range("C:C").Copy Destination:=trg.Range("I1")
  

я ожидал бы чего-то вроде поиска имени заголовка столбца из исходного файла и файла назначения, и если имена совпадают, то он вставит целые столбцы в файл назначения. Поскольку я очень новичок в Excel, кто-нибудь может помочь решить это с помощью сценариев VBA

Ответ №1:

Пожалуйста, попробуйте это.

 Option Explicit

Public Sub SpecificColCopy()
    Dim Wbs As Workbook
    Dim Wbd As Workbook
    Dim Wbm As Workbook
    Dim RealLastRow As Long
    Dim SourceCol As Long
    Dim Cell As Range
    Dim sourceWS As Worksheet, targetWS As Worksheet
    Dim MacroWS As Worksheet
    Dim SourceHeaderRow As Long: SourceHeaderRow = 1
    Dim SourceCell As Range
    Dim TargetHeader As Range
    Application.DisplayAlerts = False
    On Error Resume Next
    Set Wbm = ThisWorkbook
    Set MacroWS = Wbm.Worksheets("Sheet1")

    Set Wbs = Workbooks.Open("C:mydirbSource.xlsx") 'workbook needs to be closed state
    Set sourceWS = Wbs.Worksheets("Sheet1")

    Set Wbd = Workbooks.Open("C:mydirbDestination.xlsx") ''workbook needs to be closed state
    Set targetWS = Wbd.Worksheets("Sheet1")
    Set TargetHeader = targetWS.Range("A1:N1")
    On Error GoTo 0

    sourceWS.Activate
    For Each Cell In TargetHeader
        If Cell.Value <> "" Then
            Set SourceCell = Rows(SourceHeaderRow).Find _
                (Cell.Value, LookIn:=xlValues, LookAt:=xlWhole)
            If Not SourceCell Is Nothing Then
                SourceCol = SourceCell.Column
                RealLastRow = Columns(SourceCol).Find("*", LookIn:=xlValues, _
                SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
                If RealLastRow > SourceHeaderRow Then
                    Range(Cells(SourceHeaderRow   1, SourceCol), Cells(RealLastRow, _
                        SourceCol)).Copy
                    targetWS.Cells(2, Cell.Column).PasteSpecial xlPasteValues
                End If
            End If
        End If
    Next


  MacroWS.Activate
  Wbs.Save
  Wbd.Save
  Wbs.Close
  Wbd.Close
  Application.DisplayAlerts = True
End Sub

 [![Souce_destination][1]][1]
  

Комментарии:

1. @suresh Рад, что у вас это сработало. Пожалуйста, примите мой ответ. Чтобы отметить ответ как принятый, пожалуйста, нажмите на галочку рядом с ответом под нижним треугольником, чтобы переключить его с серого на заполненный.