Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Переименование имени процедуры по значению в ячейке - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Переименование имени процедуры по значению в ячейке (Макросы/Sub)
Переименование имени процедуры по значению в ячейке
Leviven Дата: Понедельник, 31.08.2020, 14:13 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Уважаемые форумчане! В книге есть модуль 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") 'значение из искомой ячейки

   FinalFileName = Path & CellValue

   ActiveWorkbook.SaveAs Filename:=FinalFileName, _
                      FileFormat:=xlOpenXMLWorkbookMacroEnabled           

   Application.DisplayAlerts = True

  End Sub
[/vba]
А вот как макрос так изменить и сохранить?


Сообщение отредактировал Leviven - Понедельник, 31.08.2020, 14:15
 
Ответить
СообщениеУважаемые форумчане! В книге есть модуль 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") 'значение из искомой ячейки

   FinalFileName = Path & CellValue

   ActiveWorkbook.SaveAs Filename:=FinalFileName, _
                      FileFormat:=xlOpenXMLWorkbookMacroEnabled           

   Application.DisplayAlerts = True

  End Sub
[/vba]
А вот как макрос так изменить и сохранить?

Автор - Leviven
Дата добавления - 31.08.2020 в 14:13
_Boroda_ Дата: Понедельник, 31.08.2020, 14:34 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А зачем?
Что Вам это даст?


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА зачем?
Что Вам это даст?

Автор - _Boroda_
Дата добавления - 31.08.2020 в 14:34
прохожий2019 Дата: Понедельник, 31.08.2020, 14:40 | Сообщение № 3
Группа: Проверенные
Ранг: Старожил
Сообщений: 1241
Репутация: 317 ±
Замечаний: 0% ±

365 Beta Channel
Как можно это значение дописывать к имени процедуры
дописать не получится, можно только удалить процедуру с именем cont_ и создать процедуру cont_23_2
 
Ответить
Сообщение
Как можно это значение дописывать к имени процедуры
дописать не получится, можно только удалить процедуру с именем cont_ и создать процедуру cont_23_2

Автор - прохожий2019
Дата добавления - 31.08.2020 в 14:40
Leviven Дата: Понедельник, 31.08.2020, 14:53 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, Это мне даст запуск конкретного файла и кода в нем, типа такого:
[vba]
Код
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\03_1.xlsm")
Application.Visible = False
Application.Run "03_1.xlsm!Executive.cont_03_1": Workbooks("03_1.xlsm").Close True
[/vba]
 
Ответить
Сообщение_Boroda_, Это мне даст запуск конкретного файла и кода в нем, типа такого:
[vba]
Код
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\03_1.xlsm")
Application.Visible = False
Application.Run "03_1.xlsm!Executive.cont_03_1": Workbooks("03_1.xlsm").Close True
[/vba]

Автор - Leviven
Дата добавления - 31.08.2020 в 14:53
Leviven Дата: Понедельник, 31.08.2020, 15:11 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
прохожий2019, а поподробнее можно? Как, в зависимости от значения в ячейке Y2 создать процедуру с таким именем - cont_ и значением из Y2? И как перед этим удалить процедуру с именем cont_ ?
 
Ответить
Сообщениепрохожий2019, а поподробнее можно? Как, в зависимости от значения в ячейке Y2 создать процедуру с таким именем - cont_ и значением из Y2? И как перед этим удалить процедуру с именем cont_ ?

Автор - Leviven
Дата добавления - 31.08.2020 в 15:11
_Boroda_ Дата: Понедельник, 31.08.2020, 15:37 | Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
мне даст запуск конкретного файла и кода в нем

А макрос-то зачем для этого переименовывать?
Нужен один макрос с изменяемым параметром, типа
[vba]
Код
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\" & cells(3,2) & ".xlsm")
[/vba]
Изменяемая ячейка В3


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
мне даст запуск конкретного файла и кода в нем

А макрос-то зачем для этого переименовывать?
Нужен один макрос с изменяемым параметром, типа
[vba]
Код
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\" & cells(3,2) & ".xlsm")
[/vba]
Изменяемая ячейка В3

Автор - _Boroda_
Дата добавления - 31.08.2020 в 15:37
Leviven Дата: Понедельник, 31.08.2020, 16:33 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_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

Application.ScreenUpdating = False
Workbooks.Open (iFileName)
Application.Visible = False
Application.Run k & ".xlsm!Executive.cont": Workbooks(k & ".xlsm").Close True

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

Application.ScreenUpdating = False
Workbooks.Open (iFileName)
Application.Visible = False
Application.Run k & ".xlsm!Executive.cont": Workbooks(k & ".xlsm").Close True

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. Но как?

Автор - Leviven
Дата добавления - 31.08.2020 в 16:33
_Boroda_ Дата: Понедельник, 31.08.2020, 16:42 | Сообщение № 8
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Странного Вы хотите - "Все работает, но я хочу усложнить код, при этом не изменяя результат". Обычно наоборот бывает - код упрощают :D


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеСтранного Вы хотите - "Все работает, но я хочу усложнить код, при этом не изменяя результат". Обычно наоборот бывает - код упрощают :D

Автор - _Boroda_
Дата добавления - 31.08.2020 в 16:42
Leviven Дата: Понедельник, 31.08.2020, 16:46 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, очень бы хотелось научиться менять название процедуры Sub другим макросом, а затем еще и сам код. Очень :)
 
Ответить
Сообщение_Boroda_, очень бы хотелось научиться менять название процедуры Sub другим макросом, а затем еще и сам код. Очень :)

Автор - Leviven
Дата добавления - 31.08.2020 в 16:46
_Boroda_ Дата: Понедельник, 31.08.2020, 17:11 | Сообщение № 10
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
прохожий2019 Дата: Понедельник, 31.08.2020, 17:34 | Сообщение № 11
Группа: Проверенные
Ранг: Старожил
Сообщений: 1241
Репутация: 317 ±
Замечаний: 0% ±

365 Beta Channel
[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
[/vba]


Сообщение отредактировал прохожий2019 - Понедельник, 31.08.2020, 17:35
 
Ответить
Сообщение[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
[/vba]

Автор - прохожий2019
Дата добавления - 31.08.2020 в 17:34
Leviven Дата: Вторник, 01.09.2020, 09:44 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, спасибо большое. Буду читать
 
Ответить
Сообщение_Boroda_, спасибо большое. Буду читать

Автор - Leviven
Дата добавления - 01.09.2020 в 09:44
Leviven Дата: Вторник, 01.09.2020, 09:46 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
прохожий2019, Да! Это оно! Благодарю от души! Это то, что я искал!
 
Ответить
Сообщениепрохожий2019, Да! Это оно! Благодарю от души! Это то, что я искал!

Автор - Leviven
Дата добавления - 01.09.2020 в 09:46
Nic70y Дата: Вторник, 01.09.2020, 12:05 | Сообщение № 14
Группа: Друзья
Ранг: Экселист
Сообщений: 8703
Репутация: 2258 ±
Замечаний: 0% ±

Excel 2010
[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
[/vba]


ЮMoney 41001841029809
 
Ответить
Сообщение[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
[/vba]

Автор - Nic70y
Дата добавления - 01.09.2020 в 12:05
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Переименование имени процедуры по значению в ячейке (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!