Всем доброго времени суток! Буду благодарен за любую помощь в решении моей задачи. Есть книга с листом для ввода данных (первый лист) и несколько листов, на которые попадают данные с первого листа в преобразованном виде. На первом листе есть чекбоксы, по которым должен происходить выбор нужных для сохранения листов. Все выбранные листы нужно сохранить в один файл (в одну новую книгу).
Записью макросов я сделал это действие, но, понятное дело, листы выделял вручную. В коде есть строчка, где указаны выбранные листы...
Я сделал формулу в ячейке, где в строчку через запятую пишутся выбранные листы. ВОПРОС: как добавить значение этой ячейки в переменную VBA, из которой будет создаваться копия выделенных листов в новой книге?
Подскажите, если есть какой-нибудь другой способ для этого ?
'Сохраняет каждый лист отмеченный чекбоксом в отдельные файлы на рабочий стол
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
См. вариант. Книги будут сохраняться в ту же папку, в которой находится книга с макросом. Папку сохранения можно поменять (в макросе прокомментировал эту строку). Листы в список попадут автоматически, но первым должен быть лист с кнопкой. Я бы книгам давал не обезличенные имена (Книга1, Книга2...), а, например, по именам листов. Книги будут каждый раз перезаписываться без предупреждения.
написал: Я бы книгам давал не обезличенные имена (Книга1, Книга2...), а, например, по именам листов. Книги будут каждый раз перезаписываться без предупреждения.
А так и задумано... На первом листе есть ячейка, куда вводится номер заключения и он же показывается на всех остальных листах. Позже я хочу сделать именно так.. чтобы макрос автоматически брал имя из этой ячейки и сохранял книгу с этим именем. каждый файл будет уникальным. Пример переделал
Сергей если я правильно понял задачу сохранить листы книги в зависимости от состояния чекбоксов, то зачем вся городьба в столбцах 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
Евгений Смирнов, Отлично! а как теперь перенести этот код на рабочую книгу? в рабочей книге немного больше листов и чекбоксов. при переносе этого кода выдает ошибку. Не могли бы вы указать комментарии к коду?
Надо конечно сразу было указать что чекбоксов много. Попробуйте этот
Код
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
Этот прокатит если больше нет чекбоксов с именами листов
Хочу сказать всем большое спасибо, кто помог мне. ,, не сразу заметил ваш вариант.. за то он оказался понят и выполнен вами с первого раза. , ваш вариант тоже хорош, но для моего проекта лучше чтобы чекбоксы были на листе, а не на форме, но тоже большое спасибо за ваш вклад. , вам тоже большое спасибо за терпение, вам приходилось переделывать код под мои нужды. Всем хорошего предновогоднего настроения!!!