Member 13304612 Ответов: 1

Код Visual basic для объединения электронных таблиц excel в сводный лист


Я объединяю некоторые электронные таблицы в один сводный лист, но я не хочу, чтобы данные, скопированные (из нескольких листов), начинались до строки/столбца D9, и я не хочу, чтобы он начинал вставку на сводный лист до D9. вот мой текущий код... Как добавить другие директивы?

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 summary sheet if it exists.
    Application.DisplayAlerts = False
    On Error Resume Next
    ActiveWorkbook.Worksheets("Comprehensive").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    ' Add a new summary worksheet.
    Set DestSh = ActiveWorkbook.Worksheets.Add
    DestSh.Name = "Comprehensive"

    ' Fill in the start row.
    StartRow = 2

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

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

            ' If source worksheet is not empty and if the last
            ' row >= StartRow, copy the range.
            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 to see whether there are enough rows in the summary
               ' worksheet to copy all the data.
                If Last + CopyRng.Rows.Count > DestSh.Rows.Count Then
                   MsgBox "There are not enough rows in the " & _
                   "summary worksheet to place the data."
                   GoTo ExitTheSub
                End If

                ' This statement copies values and formats.
                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 summary sheet.
    DestSh.Columns.AutoFit

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


Что я уже пробовал:

пока ничего. просто используя уже описанный VB-код...

Richard MacCutchan

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

1 Ответов

Рейтинг:
0

CHill60

Вот версия вашего кода, которая копирует данные из D9 в конец используемых данных и вставляет результаты в лист [Comprehensive], начиная с ячейки D9 вместо A2. Он копирует данные, присутствующие из D9, в последний столбец, а не пытается скопировать все столбцы для используемых строк, иначе для копирования не хватило бы столбцов.
Я оставляю это вам, чтобы определить различия

Option Explicit

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 summary sheet if it exists.
    Application.DisplayAlerts = False
    On Error Resume Next
    ActiveWorkbook.Worksheets("Comprehensive").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True
 
    ' Add a new summary worksheet.
    Set DestSh = ActiveWorkbook.Worksheets.Add
    DestSh.Name = "Comprehensive"
 
    ' Fill in the start row.
    StartRow = 9
 
    ' Loop through all worksheets and copy the data to the
    ' summary worksheet.
    For Each sh In ActiveWorkbook.Worksheets
        If sh.Name <> DestSh.Name Then
 
            ' Find the last row with data on the summary
            ' and source worksheets.
            Last = LastRow(DestSh)
            shLast = LastRow(sh)
            
            If Last < 9 Then Last = 8   'As we add +1 later
 
            'Find the last cell used on the source worksheet courtesy of Andy Pope, OzMVP
            Dim lastCell As String
            lastCell = Replace(Cells(1, sh.UsedRange.Columns.Count).Address(False, False), "1", CStr(shLast))
            
 
            ' If source worksheet is not empty and if the last
            ' row >= StartRow, copy the range.
            If shLast > 0 And shLast >= StartRow Then
                'Set the range that you want to copy
                Set CopyRng = sh.Range("D" & CStr(StartRow) & ":" & lastCell)
 
               ' Test to see whether there are enough rows in the summary
               ' worksheet to copy all the data.
                If Last + CopyRng.Rows.Count > DestSh.Rows.Count Then
                   MsgBox "There are not enough rows in the " & _
                   "summary worksheet to place the data."
                   GoTo ExitTheSub
                End If
 
                ' This statement copies values and formats.
                CopyRng.Copy
                With DestSh.Cells(Last + 1, "D")
                    .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 summary sheet.
    DestSh.Columns.AutoFit
 
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub
Private Function LastRow(ws As Worksheet) As Long

    LastRow = ws.UsedRange.Rows.Count

End Function