Уважаемые форумчане! В книге есть модуль Executive, а в нем - макрос - cont_ Еще на листе "Контроль" в этой книге есть изменяемое значение в ячейке Y2. Как можно это значение дописывать к имени процедуры и сохранять: например: если Y2 = 23_2 то надо, чтобы имя макроса изменилось с cont_ на cont_23_2 Пусть в качестве примера макрос будет примитивным: с этого: [vba]
Код
Sub cont_() MsgBox "ЗАПУСК" End Sub
[/vba] на это: [vba]
Код
Sub cont_23_2() MsgBox "ЗАПУСК" End Sub
[/vba] Изменения в ячейке Y2 будут производиться только один раз вручную. Сохранить файл с именем по значению в ячейке у меня получилось: [vba]
Код
Sub SaveFile()
Dim CellValue As String Dim Path As String Dim FinalFileName As String
Application.DisplayAlerts = False
Path = ThisWorkbook.Path & "\"
CellValue = Range("Y2") 'значение из искомой ячейки
Уважаемые форумчане! В книге есть модуль Executive, а в нем - макрос - cont_ Еще на листе "Контроль" в этой книге есть изменяемое значение в ячейке Y2. Как можно это значение дописывать к имени процедуры и сохранять: например: если Y2 = 23_2 то надо, чтобы имя макроса изменилось с cont_ на cont_23_2 Пусть в качестве примера макрос будет примитивным: с этого: [vba]
Код
Sub cont_() MsgBox "ЗАПУСК" End Sub
[/vba] на это: [vba]
Код
Sub cont_23_2() MsgBox "ЗАПУСК" End Sub
[/vba] Изменения в ячейке Y2 будут производиться только один раз вручную. Сохранить файл с именем по значению в ячейке у меня получилось: [vba]
Код
Sub SaveFile()
Dim CellValue As String Dim Path As String Dim FinalFileName As String
Application.DisplayAlerts = False
Path = ThisWorkbook.Path & "\"
CellValue = Range("Y2") 'значение из искомой ячейки
прохожий2019, а поподробнее можно? Как, в зависимости от значения в ячейке Y2 создать процедуру с таким именем - cont_ и значением из Y2? И как перед этим удалить процедуру с именем cont_ ?
прохожий2019, а поподробнее можно? Как, в зависимости от значения в ячейке Y2 создать процедуру с таким именем - cont_ и значением из Y2? И как перед этим удалить процедуру с именем cont_ ?Leviven
_Boroda_, У меня есть один файл-шаблон со стандартным набором макросов и формул в таблицах. Оператор заполняет его (все листы этого файла) и устанавливает определенную дату, передающую значение ячейке Y2. После разноса текстовых значений и обработки таблиц макросами идет автосохранение шаблона в файл с названием из ячейки Y2. Например, 23_2.xlsm (23 февраля). Уже в этом файле код автоматически вставляет формулы, устанавливающие связи с предыдущим листом - 22_2. Так, по мере заполнения книг (начиная с 1 января) появляются все 365 файлов-дней. При необходимости, оператор вносит изменения в какой-либо из файлов. Нажатие кнопки "Редактировать" запускает макрос автообновления последующих файлов. И вот здесь важно: начать с конкретного файла и макроса в нем. Имя берется из ячейки Y2. Далее обновление пойдет по цепочке автоматом. Поскольку файл-шаблон универсален, его нужно изменять под каждый создаваемый день автоматически. Вот поэтому и нужно брать устанавливаемое оператором значение. В принципе, я решил вопрос запуска обновления благодаря помощи форумчан следующим образом: [vba]
Код
Sub obnovl() k = Range("Y2").Value iPath = ThisWorkbook.Path iFileName = iPath & "\" & k & ".xlsm" If Dir(iPath & "\" & k & ".xlsm") <> "" Then
Else MsgBox "ЗАВЕРШЕНО" Range("O11").Interior.Color = 13395711 Application.Visible = True Exit Sub End If End Sub
[/vba] все работает. Макрос cont хоть и одинаков, но работает, поскольку находится в разных книгах. Но хотелось бы запускать его так: [vba]
Код
Application.Run k & ".xlsm!Executive.cont_" & k: Workbooks(k & ".xlsm").Close True
[/vba] А для этого нужно сохранять его из шаблона с именем из ячейки Y2. Но как?
_Boroda_, У меня есть один файл-шаблон со стандартным набором макросов и формул в таблицах. Оператор заполняет его (все листы этого файла) и устанавливает определенную дату, передающую значение ячейке Y2. После разноса текстовых значений и обработки таблиц макросами идет автосохранение шаблона в файл с названием из ячейки Y2. Например, 23_2.xlsm (23 февраля). Уже в этом файле код автоматически вставляет формулы, устанавливающие связи с предыдущим листом - 22_2. Так, по мере заполнения книг (начиная с 1 января) появляются все 365 файлов-дней. При необходимости, оператор вносит изменения в какой-либо из файлов. Нажатие кнопки "Редактировать" запускает макрос автообновления последующих файлов. И вот здесь важно: начать с конкретного файла и макроса в нем. Имя берется из ячейки Y2. Далее обновление пойдет по цепочке автоматом. Поскольку файл-шаблон универсален, его нужно изменять под каждый создаваемый день автоматически. Вот поэтому и нужно брать устанавливаемое оператором значение. В принципе, я решил вопрос запуска обновления благодаря помощи форумчан следующим образом: [vba]
Код
Sub obnovl() k = Range("Y2").Value iPath = ThisWorkbook.Path iFileName = iPath & "\" & k & ".xlsm" If Dir(iPath & "\" & k & ".xlsm") <> "" Then
Sub ch() With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule 'del strt = .ProcStartLine("cont_", vbext_pk_Proc) num = .ProcCountLines("cont_", vbext_pk_Proc) .DeleteLines StartLine:=strt, Count:=num 'add num = .CountOfLines + 1 .InsertLines num, "Sub cont_" & [Y2] & "()" num = num + 1 .InsertLines num, " MsgBox ""ЗАПУСК""" num = num + 1 .InsertLines num, "End Sub" End With End Sub
[/vba]
[vba]
Код
Sub ch() With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule 'del strt = .ProcStartLine("cont_", vbext_pk_Proc) num = .ProcCountLines("cont_", vbext_pk_Proc) .DeleteLines StartLine:=strt, Count:=num 'add num = .CountOfLines + 1 .InsertLines num, "Sub cont_" & [Y2] & "()" num = num + 1 .InsertLines num, " MsgBox ""ЗАПУСК""" num = num + 1 .InsertLines num, "End Sub" End With End Sub
Sub ch() With ThisWorkbook.VBProject.VBComponents.Item("Module1").CodeModule For u = 1 To .CountOfLines If .Lines(u, 1) = "Sub cont_()" Then .ReplaceLine u, "Sub cont_" & [Y2] & "()" Next End With End Sub
[/vba]а может [vba]
Код
Sub ch() ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ReplaceLine 1, "Sub cont_" & [Y2] & "()" End Sub
[/vba]
[vba]
Код
Sub ch() With ThisWorkbook.VBProject.VBComponents.Item("Module1").CodeModule For u = 1 To .CountOfLines If .Lines(u, 1) = "Sub cont_()" Then .ReplaceLine u, "Sub cont_" & [Y2] & "()" Next End With End Sub
[/vba]а может [vba]
Код
Sub ch() ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ReplaceLine 1, "Sub cont_" & [Y2] & "()" End Sub