Листы, выбранные в listbox2 и экспортирующие их в новую рабочую книгу - PullRequest
0 голосов
/ 26 февраля 2019

Надеюсь, кто-нибудь сможет мне помочь.

У меня есть 2 списка в форме пользователя (Listbox1 и Listbox2), в Listbox1 я получаю имена всех видимых листов в рабочей книге.В Listbox2 будут листы, которые я выберу в Listbox1, для копирования в новую рабочую книгу.

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

For K = 0 To ListBox2.ListCount - 1
    If ListBox2.Selected(K) Then
        Worksheets(ListBox2.List(K, 0)).Copy
    End If
Next K

Но я получаю ошибку времени выполнения-9 "Ошибка индекса ниже диапазона"

Вопрос: что здесь не так?Как изменить код, чтобы все выбранные элементы / листы в Listbox2 были приятно экспортированы в новую рабочую книгу.

Спасибо за помощь

1 Ответ

0 голосов
/ 27 февраля 2019
Worksheets(ListBox2.List(K, 0)).Copy

Делая слишком много вещей одновременно, делая слишком много предположений: предполагается, что ActiveWorkbook имеет рабочий лист с именем ListBox2.List(K, 0).Также предполагается, что ListBox2.List(K, 0) будет успешным.

Разбейте его.

Dim sheetName As String
sheetName = ListBox2.List(K, 0)

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

Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets(sheetName)

Если это удастся, мы можем приступить к копированию листа:

ws.Copy

Но мы находимся в цикле ... и ws.Copy собирается изменить ActiveWorkbook - так что если первая итерация сработалавторой гарантированно взорвется.

Поэтому первое, что нужно сделать, - это захватить «исходную» книгу еще до того, как мы начнем:

Dim srcBook As Workbook
Set srcBook = ActiveWorkbook

И затем использовать эту ссылку на объектчтобы квалифицировать Worksheets вызов:

...
Set ws = srcBook.Worksheets(sheetName)
...

Теперь следующая проблема заключается в том, что каждый выбранный лист будет скопирован в новую рабочую книгу - это означает, что каждый выбранный лист получает свою собственную новуюРабочая тетрадь.

Если это задумано, все хорошо.Но это не то, как я прочитал « скопировать листы в новую рабочую книгу » - верно?

Чтобы все копии оказались в одной и той же книге назначения, вам необходимо сохранить ссылкук этой книге.И поскольку он будет создан и активирован на лету с помощью первой сделанной вами копии, я сделаю что-то вроде этого:

Dim dstBook As Workbook
...
If dstBook Is Nothing Then
'destination workbook doesn't exist yet
    ws.Copy
    Set dstBook = ActiveWorkbook
Else
'copy worksheet to destination workbook, after the last sheet
    With dstBook
        ws.Copy After:=.Worksheets(.Worksheets.Count)
    End With
End If
...

Итак:

Dim srcBook As Workbook
Set srcBook = ActiveWorkbook ' ThisWorkbook?

Dim dstBook As Workbook
For K = 0 To ListBox2.ListCount - 1
    If ListBox2.Selected(K) Then

        Dim sheetName As String
        sheetName = ListBox2.List(K, 0)

        Dim ws As Worksheet
        Set ws = srcBook.Worksheets(sheetName)

        If dstBook Is Nothing Then
        'destination workbook doesn't exist yet
            ws.Copy ' creates & activates a new workbook
            Set dstBook = ActiveWorkbook 'there's our destination
        Else
        'copy worksheet to destination workbook, after the last sheet
            With dstBook
                ws.Copy After:=.Worksheets(.Worksheets.Count)
            End With
        End If

    End If

Next
...