Объединение нескольких рабочих листов в один рабочий лист в другой книге

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

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

Sub Raw_Report_Import()

'Define variables'
Dim ws As Worksheet
Dim wsDest As Worksheet

'Set target destination'
Set wsDest = Sheets("Touchdown")

'For loop to copy all data except headers'
For Each ws In ActiveWorkbook.Sheets
    'Ensure worksheet name and destination tab do not have same name'
    If ws.Name <> wsDest.Name Then
        ws.Range("A2", ws.Range("A2").End(xlToRight).End(xlDown)).Copy
        wsDest.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial xlPasteValues
    End If
Next ws

End Sub

Ожидается: все целевые рабочие листы из второй рабочей книги копируются и вставляются в конечный рабочий лист «Touchdown» в первой рабочей книге, а заголовок копируется только один раз.

Фактически: некоторые значения вставлены, но форматирование отличается от того, что было, и оно не выстраивается правильно.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
133
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В вашем коде есть ряд ошибок. Ниже приведен код (не тестировался). Пожалуйста, обратите внимание на различия, чтобы вы могли улучшить.

Обратите внимание, что при настройке рабочего листа назначения я бы включил объект рабочей книги (если он находится в другой рабочей книге). Это предотвратит появление ошибок. Также обратите внимание, что этот код следует запускать в СТАРОЙ книге. Кроме того, я предполагаю, что ваши заголовки находятся в строке 1 на каждом листе, поэтому я включил headerCnt, чтобы принять это во внимание и копировать заголовки только один раз.

Option Explicit

Sub Raw_Report_Import()

    Dim ws As Worksheet
    Dim wsDest As Worksheet
    Dim lCol As Long, lRow As Long, lRowTarget As Long
    Dim headerCnt As Long

    'i would include the workbook object here
    Set wsDest = Workbooks("NewWorkbook.xlsx").Sheets("Touchdown")

    For Each ws In ThisWorkbook.Worksheets
        'this loops through ALL other sheets that do not have touch down name
        If ws.Name <> wsDest.Name Then
            'need to include counter to not include the header
            'establish the last row & column to copy
            lCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column
            lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

            'establish the last row in target sheet
            lRowTarget = wsDest.Range("A" & wsDest.Rows.Count).End(xlUp).Row + 1

            If headerCnt = 0 Then
                'copy from Row 1
                ws.Range(ws.Cells(1, 1), ws.Cells(lRow, lCol)).Copy
            Else
                'copy from row 2
                ws.Range(ws.Cells(2, 1), ws.Cells(lRow, lCol)).Copy
            End If

            wsDest.Range("A" & lRowTarget).PasteSpecial xlPasteValues

            'clear clipboard
            Application.CutCopyMode = False
            'header cnt
            headerCnt = 1
        End If
   Next ws

End Sub

Попробуйте так.

Sub CopyDataWithoutHeaders()
    Dim sh As Worksheet
    Dim DestSh As Worksheet
    Dim Last As Long
    Dim shLast As Long
    Dim CopyRng As Range
    Dim StartRow As Long

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    'Delete the sheet "RDBMergeSheet" if it exist
    Application.DisplayAlerts = False
    On Error Resume Next
    ActiveWorkbook.Worksheets("RDBMergeSheet").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    'Add a worksheet with the name "RDBMergeSheet"
    Set DestSh = ActiveWorkbook.Worksheets.Add
    DestSh.Name = "RDBMergeSheet"

    'Fill in the start row
    StartRow = 2

    'loop through all worksheets and copy the data to the DestSh
    For Each sh In ActiveWorkbook.Worksheets
        If sh.Name <> DestSh.Name Then

            'Find the last row with data on the DestSh and sh
            Last = LastRow(DestSh)
            shLast = LastRow(sh)

            'If sh is not empty and if the last row >= StartRow copy the CopyRng
            If shLast > 0 And shLast >= StartRow Then

                'Set the range that you want to copy
                Set CopyRng = sh.Range(sh.Rows(StartRow), sh.Rows(shLast))

                'Test if there enough rows in the DestSh to copy all the data
                If Last + CopyRng.Rows.Count > DestSh.Rows.Count Then
                    MsgBox "There are not enough rows in the Destsh"
                    GoTo ExitTheSub
                End If

                'This example copies values/formats, if you only want to copy the
                'values or want to copy everything look below example 1 on this page
                CopyRng.Copy
                With DestSh.Cells(Last + 1, "A")
                    .PasteSpecial xlPasteValues
                    .PasteSpecial xlPasteFormats
                    Application.CutCopyMode = False
                End With

            End If

        End If
    Next

ExitTheSub:

    Application.Goto DestSh.Cells(1)

    'AutoFit the column width in the DestSh sheet
    DestSh.Columns.AutoFit

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub

Все подробности здесь.

https://www.rondebruin.nl/win/s3/win002.htm

Другие вопросы по теме