Страницы: 1
RSS
Сохранение листов, которые отмечены галочкой (checkbox) в отдельный файл VBA
 
Всем доброго времени суток! Буду благодарен за любую помощь в решении моей задачи.
Есть книга с листом для ввода данных (первый лист) и несколько листов, на которые попадают данные с первого листа в преобразованном виде.
На первом листе есть чекбоксы, по которым должен происходить выбор нужных для сохранения листов. Все выбранные листы нужно сохранить в один файл (в одну новую книгу).

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

Я сделал формулу в ячейке, где в строчку через запятую пишутся выбранные листы. ВОПРОС: как добавить значение этой ячейки в переменную VBA, из которой будет создаваться копия выделенных листов в новой книге?

Подскажите, если есть какой-нибудь другой способ для этого ?

Скриншоты и файл- пример прилагаю
Изменено: Сергей - 08.12.2021 12:02:20
 
Код
'Сохраняет каждый лист отмеченный чекбоксом в отдельные файлы на рабочий стол
Sub SaveWsh0()
    Dim objShape As Object
        Application.ScreenUpdating = False
        For Each objShape In ThisWorkbook.Worksheets("Лист1").DrawingObjects
            If TypeName(objShape) = "CheckBox" Then
                If objShape.Value = 1 Then
                    Worksheets(objShape.Text).Copy
                    ActiveWorkbook.SaveAs Environ("USERPROFILE") & "\Desktop\" & objShape.Text & Format(Now(), "yyyyddmm_hhnnss") & ".xlsx"
                    ActiveWorkbook.Close
                End If
            End If
        Next objShape
End Sub

'Сохраняет группу отмеченных чекбоксами листов в один файл на рабочий стол
Sub SaveWsh1()
    Dim objShape As Object, arr(), i As Long
        Application.ScreenUpdating = False
        ReDim arr(0 To 0)
        For Each objShape In ThisWorkbook.Worksheets("Лист1").CheckBoxes
                If objShape.Value = 1 Then
                    ReDim Preserve arr(0 To i)
                    arr(i) = objShape.Text
                    i = i + 1
                End If
        Next objShape
        Sheets(arr).Copy
        ActiveWorkbook.Close SaveChanges:=True, Filename:=Environ("USERPROFILE") & "\Desktop\" & Format(Now(), "yyyyddmm_hhnnss") & ".xlsx"
End Sub
Изменено: DANIKOLA - 08.12.2021 19:08:52 (Улучшен макрос)
 
См. вариант.
Книги будут сохраняться в ту же папку, в которой находится книга с макросом. Папку сохранения можно поменять (в макросе прокомментировал эту строку).
Листы в список попадут автоматически, но первым должен быть лист с кнопкой.
Я бы книгам давал не обезличенные имена (Книга1, Книга2...), а, например, по именам листов. Книги будут каждый раз перезаписываться без предупреждения.
 
,
Цитата
написал:
Я бы книгам давал не обезличенные имена (Книга1, Книга2...), а, например, по именам листов. Книги будут каждый раз перезаписываться без предупреждения.
А так и задумано... На первом листе есть ячейка, куда вводится номер заключения и он же показывается на всех остальных листах. Позже я хочу сделать именно так.. чтобы макрос автоматически брал имя из этой ячейки и сохранял книгу с этим именем. каждый файл будет уникальным.
Пример переделал
Изменено: Сергей - 08.12.2021 01:42:00
 
Сергей если я правильно понял задачу сохранить листы книги в зависимости от состояния чекбоксов, то зачем вся городьба в столбцах G:K.
Посмотрите мой вариант. Там только надо исправить путь сохранения файлов у меня в папку где расположен исходный файл. И надо чтобы надпись чекбоксов соответствовала  именам листов.
Код
Sub SENsdfsd()
Dim Col1 As New Collection, Tp1
Application.ScreenUpdating = False
    For Each Tp1 In Worksheets("Лист1").CheckBoxes
        If Tp1.Value = 1 Then Col1.Add Tp1.Characters.Text
    Next
For i = 1 To Col1.Count
    Sheets(Col1(i)).Copy
    ActiveWorkbook.Close True, ThisWorkbook.Path & "\Книга" & i
Next
End Sub

Не совсем внимательно прочитал задание. Сохранить надо в 1 книгу. Тогда так

Код
Sub ENSTaraL()
Dim Col1 As New Collection, Tp1
Application.ScreenUpdating = False
    For Each Tp1 In Worksheets("Лист1").CheckBoxes
        If Tp1.Value = 1 Then Col1.Add Tp1.Characters.Text
    Next: ReDim Tp1(1 To Col1.Count)
For i = 1 To Col1.Count
    Tp1(i) = Col1(i)
Next
    Sheets(Tp1).Copy
    ActiveWorkbook.Close True, ThisWorkbook.Path & "\Книга1"
End Sub

Изменено: Евгений Смирнов - 09.12.2021 06:15:17
 
Цитата
Евгений Смирнов написал:
Не совсем внимательно прочитал задание. Сохранить надо в 1 книгу
Я тоже прочитал, что  каждый лист в отдельную книгу )
 
Евгений Смирнов,  Отлично! а как теперь перенести этот код на рабочую книгу?  в рабочей книге немного больше листов и чекбоксов. при переносе этого кода выдает ошибку. Не могли бы вы указать комментарии к коду?
Изменено: Сергей - 08.12.2021 15:25:17
 
Надо конечно  сразу было указать что чекбоксов много. Попробуйте этот
Код
Sub enstaralпрпр() 'В 1 книгу
Dim Tp1, Tp2, Tp3, kLis%, i&, j&
Application.ScreenUpdating = False
    kLis = Worksheets.Count: ReDim Tp1(1 To kLis): Tp2 = Tp1
For i = 1 To kLis: Tp1(i) = Worksheets(i).Name: Next
    For Each Tp3 In Worksheets("Лист1").CheckBoxes
If Tp3.Value = 1 And UBound(Filter(Tp1, Tp3.Text, , 1)) >= 0 Then j = j + 1: Tp2(j) = Tp3.Text
    Next: ReDim Preserve Tp2(1 To j)
Sheets(Tp2).Copy
ActiveWorkbook.Close True, ThisWorkbook.Path & "\Книга1"
End Sub

Этот прокатит если больше нет чекбоксов с именами листов

Изменено: Евгений Смирнов - 09.12.2021 06:16:25
 
, Огромнейшее спасибо!!! Все работает как надо!
 
Пожалуйста
Приятно, когда человек вежливый
 
вопрос темы был решен, тема закрыта

DANIKOLA , Евгений Смирнов и Юрий М

Хочу сказать всем большое спасибо, кто помог мне. ,, не сразу заметил ваш вариант.. за то он оказался понят и выполнен вами с первого раза. , ваш вариант тоже хорош, но для моего проекта лучше чтобы чекбоксы были на листе, а не на форме, но тоже большое спасибо за ваш вклад. , вам тоже большое спасибо за терпение, вам приходилось переделывать код под мои нужды. Всем хорошего предновогоднего настроения!!!
Страницы: 1
Наверх