Excel VBA: макрос для редактирования кода листа

Автор henryh, 15 октября 2018, 15:38

henryh

Можно ли как то прописать код, чтобы макрос после создание новой книги с нескольким листами, заходил в код каждого листа и вписывал туда одну и ту же команду для выполнения на этих листах?

Администратор

Подключите библиотеку: Microsoft Visual Basic for Applications Extensibility 5.3
Её можно не отключать, т.к. она встроена в виндоус.

Если в модуль листа надо вставить много кода, то тогда вставляйте код из текстового файла.
Иначе в коде макроса будет неудобно писать много кода.

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

Макрос
Sub макрос()
   
    Dim bk_new As Workbook, VBProject As VBIDE.VBProject
    Dim VBComponent As VBIDE.VBComponent
   
   
    ' Создание книги и присвоение ей имени 'bk_new'.
        ' Далее в коде можно будет обращаться к книге по этому имени.
    Set bk_new = Workbooks.Add
   
    ' Присваиваем vba-проекту имя 'VBProject'.
    Set VBProject = bk_new.VBProject
   
    ' Движение по всем модулям vba-проекта.
    For Each VBComponent In VBProject.VBComponents
        ' Если имя vba-проекта начинается со слова 'Лист'.
        If VBComponent.Name Like "Лист*" Then
            ' Запись кода в модуль листа, начиная с первой строки.
            VBComponent.CodeModule.InsertLines Line:=1, String:="Sub Макрос()" & vbCr & "End Sub"
        End If
    Next VBComponent
   
End Sub
[свернуть]

henryh

Второй вариант мне вроде больше подходит.
Можно прописать эти команды в модуль макроса, который я запускаю? Я так понимаю это должно быть где-то перед показом пользовательской формы.

Макрос
Sub Макрос1()
'перенос выбраных листов в новую книгу
    Dim TempW As Window
    Set CurW = ActiveWindow
    Set TempW = ActiveWorkbook.NewWindow
    CurW.SelectedSheets.Copy
    TempW.Close
    'показ формы для ввода данных
    UserForm1.TextBox3.Value = CreateObject("WScript.Shell").specialfolders("Desktop")
    UserForm1.Show
    'сохранение новой книги
    ActiveWorkbook.SaveAs Filename:=UserForm1.TextBox3.Value & "\#LOG" & UserForm1.TextBox1.Value & "MС" & UserForm1.TextBox2 & ".xlsm", _
    FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
'закрытие исходной книги
    Workbooks("BOO2 — копия.xlsm").Close SaveChanges:=False
End Sub
[свернуть]

Администратор

Макрос
Sub Макрос1()

    'перенос выбраных листов в новую книгу

    Dim TempW As Window
   
    Set CurW = ActiveWindow
    Set TempW = ActiveWorkbook.NewWindow
    CurW.SelectedSheets.Copy
    TempW.Close
    'показ формы для ввода данных
    UserForm1.TextBox3.Value = CreateObject("WScript.Shell").specialfolders("Desktop")
    UserForm1.Show
    'сохранение новой книги
    ActiveWorkbook.SaveAs filename:=UserForm1.TextBox3.Value & "\#LOG" & UserForm1.TextBox1.Value & "MС" & UserForm1.TextBox2 & ".xlsm", _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
    ' Присваиваем новой книге имя 'bk_new'. Далее в коде можно будет обращаться к книге по этому имени.
    Set bk_new = ActiveWorkbook
    'закрытие исходной книги
    Workbooks("BOO2 — копия.xlsm").Close SaveChanges:=False
    ' Запись кода в модули листов новой книги.
    WriteMacrosToNewFile bk_new
   
End Sub

Private Sub WriteMacrosToNewFile(bk_new As Workbook)

    Dim VBProject As VBIDE.VBProject, VBComponent As VBIDE.VBComponent
   
   
    ' Присваиваем vba-проекту имя 'VBProject'.
    Set VBProject = bk_new.VBProject
   
    ' Движение по всем модулям vba-проекта.
    For Each VBComponent In VBProject.VBComponents
        ' Если имя vba-проекта начинается со слова 'Лист'.
        If VBComponent.Name Like "Лист*" Then
            ' Запись кода в модуль листа, начиная с первой строки.
            VBComponent.CodeModule.InsertLines Line:=1, String:="Sub Макрос()" & vbCr & "End Sub"
        End If
    Next VBComponent
   
End Sub
[свернуть]