На листе - в ячейки J23, J24, J25 - вписаны текстовые строки другого похожего макроса.
Как макросом - при щелчке по "Кнопке-2" - переместить содержимое ячеек J23, J24, J25 в код "Макроса1" с заменой предыдущего содержания ?
То есть при щелчке на "Кнопку-2" текст, вписанный в ячейки J23, J24, J25 должен заместить текст - который сейчас вписан в код "Макроса1". В общем суть в том, что при щелчке по "Кнопке-2" - код "Макроса1" - меняет свое содержимое.
Добрый вечер, форумчане. Хочу обратиться с необычным вопросом.
Есть простой макрос поворота автофигуры. Макрос прикреплен к "Кнопке-1". Его текст выглядит так:
На листе - в ячейки J23, J24, J25 - вписаны текстовые строки другого похожего макроса.
Как макросом - при щелчке по "Кнопке-2" - переместить содержимое ячеек J23, J24, J25 в код "Макроса1" с заменой предыдущего содержания ?
То есть при щелчке на "Кнопку-2" текст, вписанный в ячейки J23, J24, J25 должен заместить текст - который сейчас вписан в код "Макроса1". В общем суть в том, что при щелчке по "Кнопке-2" - код "Макроса1" - меняет свое содержимое.Grell
Можно, конечно, и макрос макросом переписать, но зачем Вам этот изврат? Не проще поставить радиокнопки "По часовой" и "Против часовой"? Посмотрите в файле
Можно, конечно, и макрос макросом переписать, но зачем Вам этот изврат? Не проще поставить радиокнопки "По часовой" и "Против часовой"? Посмотрите в файле_Boroda_
Именно "переписать" - действительно довольно муторно. А вот на ходу создать новый в новом модуле, выполнить его и тут же удалить (и макрос, и модуль) - примерно вот так: [vba]
Код
Option Explicit
'ВАЖНО: для успешности всего процесса следует включить "галочку" в меню Excel: 'Разработчик / Безопасность макросов/ Параметры макросов / опция "Доверять доступ к объкетной модели VBA" - устанавливаем!
'для использования в программе и получения информации о следующих объектах: ' -- в Excel перейти в редактор Visual Basic, ' -- в меню Tools/References подключить "галочкой" ссылку на ' "Microsoft Visual Basic for Applications Extensibility 5.3" ' (расположение на диске: C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB) ' -- в меню View/Object Browser (F2) порассматривать библиотеку VBIDE
Dim vbc As VBComponents Dim vbmdl As VBComponent Dim vbcode As CodeModule
Sub runTemporarySub()
'1. в текущей рабочей книге создаем новый модуль Set vbc = ThisWorkbook.VBProject.VBComponents Set vbmdl = vbc.Add(1) vbmdl.Name = "OurTemporaryModule" Set vbcode = vbmdl.CodeModule
'2. добавляем строки кода новой процедуры в новый модуль addCodeLine "Sub newSub20170412()" addCodeLine " MsgBox ""Привет из новой Sub""" addCodeLine "End Sub"
'3. выполняем только что созданную процедуру Application.Run "newSub20170412"
'4. удаляем только что созданный модуль vbmdl.Collection.Remove vbmdl
End Sub
Sub addCodeLine(codeText As String) vbcode.InsertLines vbcode.CountOfLines + 1, codeText 'самый первый раз CountOfLines необходимо на тот случай, 'если ваш Excel настроен на автоматическое добавление 'оператора Option Explicit в новый модуль End Sub
Именно "переписать" - действительно довольно муторно. А вот на ходу создать новый в новом модуле, выполнить его и тут же удалить (и макрос, и модуль) - примерно вот так: [vba]
Код
Option Explicit
'ВАЖНО: для успешности всего процесса следует включить "галочку" в меню Excel: 'Разработчик / Безопасность макросов/ Параметры макросов / опция "Доверять доступ к объкетной модели VBA" - устанавливаем!
'для использования в программе и получения информации о следующих объектах: ' -- в Excel перейти в редактор Visual Basic, ' -- в меню Tools/References подключить "галочкой" ссылку на ' "Microsoft Visual Basic for Applications Extensibility 5.3" ' (расположение на диске: C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB) ' -- в меню View/Object Browser (F2) порассматривать библиотеку VBIDE
Dim vbc As VBComponents Dim vbmdl As VBComponent Dim vbcode As CodeModule
Sub runTemporarySub()
'1. в текущей рабочей книге создаем новый модуль Set vbc = ThisWorkbook.VBProject.VBComponents Set vbmdl = vbc.Add(1) vbmdl.Name = "OurTemporaryModule" Set vbcode = vbmdl.CodeModule
'2. добавляем строки кода новой процедуры в новый модуль addCodeLine "Sub newSub20170412()" addCodeLine " MsgBox ""Привет из новой Sub""" addCodeLine "End Sub"
'3. выполняем только что созданную процедуру Application.Run "newSub20170412"
'4. удаляем только что созданный модуль vbmdl.Collection.Remove vbmdl
End Sub
Sub addCodeLine(codeText As String) vbcode.InsertLines vbcode.CountOfLines + 1, codeText 'самый первый раз CountOfLines необходимо на тот случай, 'если ваш Excel настроен на автоматическое добавление 'оператора Option Explicit в новый модуль End Sub
_Boroda_, суть вопроса была в том, чтобы переписать один макрос - другим макросом.
Ну уж простите пожалуйста. Я почему-то здесь привык отвечать не по букве, а по духу вопроса, что в большинстве случаев спрашивающему и нужно Хотите макрос переписать? Ну держите код для второй кнопки [vba]
Код
For i = 1 To 3 ActiveWorkbook.VBProject.VBComponents(1).CodeModule.ReplaceLine i + 1, Range("J" & 22 + i) Next i
_Boroda_, суть вопроса была в том, чтобы переписать один макрос - другим макросом.
Ну уж простите пожалуйста. Я почему-то здесь привык отвечать не по букве, а по духу вопроса, что в большинстве случаев спрашивающему и нужно Хотите макрос переписать? Ну держите код для второй кнопки [vba]
Код
For i = 1 To 3 ActiveWorkbook.VBProject.VBComponents(1).CodeModule.ReplaceLine i + 1, Range("J" & 22 + i) Next i
на ходу создать новый в новом модуле, выполнить его и тут же удалить (и макрос, и модуль)
А можно еще проще - с использованием ActiveX-компонента MS Script Control: [vba]
Код
Sub runDynamicOperator() With CreateObject("ScriptControl") .Language = "vbscript" .AddObject "xlApp", Excel.Application .ExecuteStatement "xlApp.Range(""C4"").Value = ""ПРИВЕТ из динамического оператора""" End With End Sub
[/vba] На форуме есть хорошая тема, посвященная этому объекту.
P.S. Поскольку MS Script Control является 32-битным компонентом, то данный макрос может не работать в 64-битной среде (Windows, Excel). К счастью, сторонним производителем уже создана 64-битная версия Script Control - не под маркой MS, но под маркой Tablacus. Компонент следует установить на компьютере, скачав отсюда, после чего запустить макрос, и что приятно, ничего в нём не меняя.
на ходу создать новый в новом модуле, выполнить его и тут же удалить (и макрос, и модуль)
А можно еще проще - с использованием ActiveX-компонента MS Script Control: [vba]
Код
Sub runDynamicOperator() With CreateObject("ScriptControl") .Language = "vbscript" .AddObject "xlApp", Excel.Application .ExecuteStatement "xlApp.Range(""C4"").Value = ""ПРИВЕТ из динамического оператора""" End With End Sub
[/vba] На форуме есть хорошая тема, посвященная этому объекту.
P.S. Поскольку MS Script Control является 32-битным компонентом, то данный макрос может не работать в 64-битной среде (Windows, Excel). К счастью, сторонним производителем уже создана 64-битная версия Script Control - не под маркой MS, но под маркой Tablacus. Компонент следует установить на компьютере, скачав отсюда, после чего запустить макрос, и что приятно, ничего в нём не меняя.Gustav