Excel VBA: копирование таблицы на другой лист – объяснение нескольких методов

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

Метод 1: использование Range.Copy и Range.PasteSpecial
Самый простой способ скопировать таблицу — использовать метод Range.Copy для копирования исходной таблицы и метод Range.PasteSpecial для вставки ее в целевой лист..

Sub CopyTable_Method1()
    Dim sourceTable As Range
    Dim destinationWorksheet As Worksheet

    ' Set the source table range
    Set sourceTable = Worksheets("SourceSheet").Range("A1:D10")

    ' Set the destination worksheet
    Set destinationWorksheet = Worksheets("DestinationSheet")

    ' Copy and paste the table
    sourceTable.Copy
    destinationWorksheet.Range("A1").PasteSpecial Paste:=xlPasteValues
End Sub

Метод 2: использование ListObjects.Add и ListObjects.Range.Copy
Другой подход заключается в преобразовании таблицы в ListObject (также известный как структурированная таблица) с помощью метода ListObjects.Add. Затем вы можете использовать метод ListObjects.Range.Copy для копирования таблицы.

Sub CopyTable_Method2()
    Dim sourceTable As Range
    Dim destinationWorksheet As Worksheet
    Dim destinationTable As ListObject

    ' Set the source table range
    Set sourceTable = Worksheets("SourceSheet").Range("A1:D10")

    ' Set the destination worksheet
    Set destinationWorksheet = Worksheets("DestinationSheet")

    ' Convert the source table to a ListObject
    Set destinationTable = destinationWorksheet.ListObjects.Add(xlSrcRange, sourceTable, , xlYes)

    ' Copy the table
    destinationTable.Range.Copy
End Sub

Метод 3: использование Power Query (получение и преобразование данных)
Если у вас есть Excel 2016 или более поздние версии, вы можете использовать Power Query (также известный как получение и преобразование данных) для копирования таблиц между листами. Power Query позволяет выполнять преобразования данных и загружать результат в новый лист.

Sub CopyTable_Method3()
    ' Assuming the source table is loaded into a worksheet query named "SourceQuery"
    ' Create a new worksheet query for the destination table
    Worksheets.Add.Name = "DestinationSheet"
    ActiveWorkbook.Queries.Add Name:="DestinationQuery", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Excel.CurrentWorkbook(){[Name=""SourceQuery""]}[Content]," & Chr(13) & "" & Chr(10) & "    #"Converted to Table"" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error)," & Chr(13) & "" & Chr(10) & "    #"Promoted Headers"" = Table.PromoteHeaders(#"Converted to Table"", [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #"Changed Type"" = Table.TransformColumnTypes(#"Promoted Headers"",{{""Column1"", type text}, {""Column2"", type text}, {""Column3"", type text}, {""Column4"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #"Changed Type"""

    ' Load the destination table into a new worksheet
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=DestinationQuery;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [DestinationQuery]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .SourceConnectionFile = _
        "C:\Users\YourUsername\Documents\DestinationQuery.odc"
        .ListObject.DisplayName = "Table_DestinationQuery"
        .Refresh BackgroundQuery:=False
    End With

    ' Delete the query connection
    ActiveWorkbook.Queries("DestinationQuery").Delete
End Sub

ЗаключениеКопировать таблицы между листами Excel с помощью VBA можно несколькими способами. В этой статье блога мы рассмотрели три подхода:

  1. Использование Range.Copy и Range.PasteSpecial. Этот метод включает копирование исходной таблицы с помощью метода Range.Copy и вставку ее в целевой лист с помощью метода Range.PasteSpecial.

  2. Использование ListObjects.Add и ListObjects.Range.Copy. Этот метод преобразует исходную таблицу в ListObject с помощью метода ListObjects.Add, а затем копирует таблицу с помощью метода ListObjects.Range.Copy.

  3. Использование Power Query (получение и преобразование данных). Если у вас есть Excel 2016 или более поздние версии, вы можете использовать Power Query для копирования таблиц. Этот метод предполагает создание нового запроса к целевой таблице и загрузку результата в новый лист.

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