簡體   English   中英

將多個工作表合並到不同工作簿中的單個工作表

[英]Merging Multiple Worksheets To Single Worksheet In Different Workbook

我想將一個工作簿中的多個工作表中的所有行和列復制到另一個工作簿中的單個工作表。 另外,我只想復制一次標題,即使它存在於我要復制的所有工作表中。

我可以打開包含我要復制到目標工作表/工作簿的所有工作表的工作簿,但是,我不知道如何只復制一次標題,並且經常會出現“粘貼特殊”錯誤。

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”,並且標題僅復制一次。

實際:某些值是粘貼但格式錯誤,它們不正確排列。

你的代碼有很多問題。 請在下面找到代碼(未經過測試)。 請注意差異,以便您可以改進。

請注意,在設置目標工作表時,我將包含工作簿對象(如果在不同的工作簿中)。 這樣可以防止錯誤發生。 另請注意,此代碼應在OLD工作簿中運行。 另外,我假設你的標題在每張表的第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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM