0
votes

I want to copy all the rows and columns in multiple worksheets in a one workbook to a single worksheet in a different workbook. In addition, I just want to copy the header once, even though it is in all of the worksheets I'll copy.

I can open the workbook containing all of the worksheets I want to copy to my destination worksheet/workbook however, I don't know how to copy the header only once and often get a Paste Special error.

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

Expected: All of the target worksheets from second workbook are copied and pasted to destination worksheet "Touchdown" in first workbook and the header is copied only once.

Actual: Some values are paste but the formatting is wrong from what they were and it is not lining up correctly.

2

2 Answers

0
votes

There are a number of things wrong with your code. Please find below code (not tested). Please note the differences so you can improve.

Note, when setting the destination worksheet, I would include the workbook object (if in a different workbook). This will prevent errors from occurring. Also note that this code should be run in the OLD workbook. Additionally, I assume your headers are in Row 1 in each sheet, as such I have included headerCnt to take this into consideration and only copy the headers once.

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
0
votes

Try it like this.

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

All details are here.

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