Как скопировать несколько (указан c) выбранных листов в новую книгу - PullRequest
0 голосов
/ 19 февраля 2020

Я искал несколько часов, но безуспешно. Я хочу скопировать несколько листов из файла в новую рабочую книгу. Не все листы, а только те, которые я выбрал. Мой выбор может отличаться каждый раз, когда я выполняю это упражнение. Сценарий состоит в том, что у меня есть основной файл отчетов с, скажем, 25 листами с различным отчетом. Я хочу открыть файл и выбрать отчеты для отправки пользователю. Я выберу, скажем, 5 конкретных c отчетов, например, листы 1,10,15,18 и 20, затем я хочу скопировать их в новую рабочую книгу, чтобы я мог отправить их своему клиенту по электронной почте. В идеале я бы вставил их в новую рабочую книгу со значениями только для удаления всех формул и ссылок из отчетов, отправляемых клиенту. Следующий код отлично работает для одного листа:

ThisWorkbook.ActiveSheet.Copy _
Before:=Workbooks.Add.Worksheets(1)

Я хотел бы изменить слово «ActiveSheet» на «SelectedSheets» и оставить все остальное таким же. Это не работает. Я что-то упустил?

Я пытался: a: изменить код, как указано выше b: записать макрос, копирующий выбранные листы и использующий код (но он предоставляет код для указанных c имен листов, таких как sheet2 и sheet 3. Это не будет работать, так как мне нужно, чтобы это был код, который работает с любыми выбранными листами. c: искал inte rnet в течение нескольких часов. Как правило, предоставляет рекомендации по работе со всеми листами, работе с предопределенным набор выбранных листов, работа с предварительно определенным выбором с использованием массивов, код для выбора листов на основе общих характеристик, например, выберите все листы с именем «R1» в нем.

Ответы [ 3 ]

0 голосов
/ 20 февраля 2020

Так как здесь есть два различных требования (копировать только выбранные листы и только копировать значения), я бы предложил перебирать выбранные листы и копировать данные по одному листу за раз. Вы можете также скопировать форматирование

Некоторые примечания:

  • Поскольку вы хотите действовать на выбранных листах, здесь необходимо использовать ActiveWindow
  • Как вы Я хочу, чтобы в листе назначения были только значения, я бы избегал простой Вставить копию, поскольку это скопировало бы формулы, условное форматирование, определения именованных диапазонов, любой VBA в модуле листа и, возможно, другие вещи, которые затем пришлось бы удалить. Вставьте только то, что вы хотите.
  • Не забывайте, что имена листов
  • Ширина столбцов может быть PasteSpecial 'd, если требуется
  • Нет xlPasteRowHeights поэтому, если это необходимо, вам нужно будет написать его от руки
Sub Demo()
    Dim wb As Workbook
    Dim wks As Sheets
    Dim wsDest As Worksheet
    Dim wsSrc As Worksheet
    Dim rng As Range

    ' reference selected sheets
    Set wks = ActiveWindow.SelectedSheets
    'deselect multiple sheets so Copy will work
    wks.Item(1).Select

    'create new book with one sheet
    Set wb = Application.Workbooks.Add(xlWBATWorksheet)

    'reference that sheet
    Set wsDest = wb.Worksheets(1)

    ' loop selected sheets
    For Each wsSrc In wks
        'rename sheet
        wsDest.Name = wsSrc.Name
        ' copy values and formats
        Set rng = wsSrc.UsedRange
        rng.Copy
        With wsDest.Cells(rng.Row, rng.Column) ' Used Range might not start at A1
            .PasteSpecial xlPasteValues
            .PasteSpecial xlPasteFormats      ' optional, if required
            .PasteSpecial xlPasteColumnWidths ' optional, if required
            .Cells.FormatConditions.Delete    ' optional, if CF is not required
        End With

        ' add another sheet if required
        If Not wsSrc Is wks.Item(wks.Count) Then
            Set wsDest = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
        End If
    Next

    wb.SaveAs "C:\Your\Path\To\YourFileName.xlsx", xlWorkbookDefault ' or other format
End Sub
0 голосов
/ 20 февраля 2020

Если вам известны номера листов того, что вы хотите скопировать (что, как вам кажется, вы делаете из своего поста), вы можете просто скопировать их, чтобы создать новую книгу:

Sheets(array(1,3,5)).copy

Это скопирует листы 1, 3 и 5 к новой книге.

В качестве альтернативы, если вы хотите сначала выбрать их, а затем запустить макрос, этот код скопирует их в новую книгу:

Activeworkbook.Windows(1).SelectedSheets.copy

Затем вы можете l oop через листы в новой книге, например:

Dim WS as worksheet
For each WS in worksheets
    cells.copy
    range("A1").PasteSpecial xlPasteValues
next

Это скопирует и вставит в качестве значения все на каждом листе.

Я заметил, что вы сказали в своих комментариях, что используя Activeworkbook.Windows(1).SelectedSheets сделает все листы, но это не так. Я только что создал новую рабочую книгу, добавил 5 листов, выбрал 1, 3 и 5 и запустил этот код, получившаяся рабочая книга была новой рабочей книгой с 3 листами, Sheet1, Sheet3 и Sheet5.

0 голосов
/ 20 февраля 2020

Вы можете использовать Window.SelectedSheets здесь:

Возвращает коллекцию листов, которая представляет все выбранные листы в указанном окне

При тестировании кажется, что вам нужно l oop через SelectedSheets. Однострочник .Copy на всю коллекцию скопирован по всем листам, а не только по выбранному (ым).

Sub Test()
    Dim wb As Workbook
    Set wb = Workbooks.Add

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Windows(1).SelectedSheets
        ws.Copy Before:=wb.Sheets(1)
    Next ws
End Sub

РЕДАКТИРОВАТЬ: Повторно протестировано, и я не смог воспроизвести исходный выпуск SelectedSheets.Copy, копируя все листы.

ThisWorkbook.Windows(1).SelectedSheets.Copy
Dim wb as Workbook
Set wb = ActiveWorkbook '<~ this is the new workbook with the copied sheets
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...