Богдан, твой макрос можно впихнуть в меньшее количество букаф (не меняя сути) [vba]
Код
s = "MsgBox ""No :(""" x = "MsgBox ""Yes :)""" With ThisWorkbook.VBProject.VBComponents("tt").CodeModule n = .ProcBodyLine("test", 0) For i = n To .ProcCountLines("test", 0) + n - 1 If .Lines(i, 1) = s Then .ReplaceLine i, x Next End With
[/vba]
кстати, у тебя одна логическая ошибка - обрабатывается одна лишняя строка (которой может и не быть). пс. почему-то у меня "сокращенный" вариант VBComponents("tt") вместо VBComponents.Item("tt") даже запускаться не соглашается
мда, я немного сам себе усложнил задачу
Богдан, твой макрос можно впихнуть в меньшее количество букаф (не меняя сути) [vba]
Код
s = "MsgBox ""No :(""" x = "MsgBox ""Yes :)""" With ThisWorkbook.VBProject.VBComponents("tt").CodeModule n = .ProcBodyLine("test", 0) For i = n To .ProcCountLines("test", 0) + n - 1 If .Lines(i, 1) = s Then .ReplaceLine i, x Next End With
[/vba]
кстати, у тебя одна логическая ошибка - обрабатывается одна лишняя строка (которой может и не быть). пс. почему-то у меня "сокращенный" вариант VBComponents("tt") вместо VBComponents.Item("tt") даже запускаться не соглашается ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Сообщение отредактировал ikki - Воскресенье, 03.02.2013, 15:10
Ну хорошо В одном модуле "tt" макрос "test", у которого есть строка MsgBox "No :("
Цитата (ikki)
Цитата (AlexM) А во втором модуле а откуда это следует?
Можно и в том же. В модуле "tt" [vba]
Код
Sub Macros() With ThisWorkbook.VBProject.VBComponents.Item("tt").CodeModule For i = 1 To .CountOfLines If .Lines(i, 1) = "MsgBox ""No :(""" Then .ReplaceLine i, "MsgBox ""Yes :)""" Next End With End Sub
Sub test() MsgBox "No :(" End Sub
[/vba]
Цитата (ikki)
почему "некий"?
Ну хорошо В одном модуле "tt" макрос "test", у которого есть строка MsgBox "No :("
Цитата (ikki)
Цитата (AlexM) А во втором модуле а откуда это следует?
Можно и в том же. В модуле "tt" [vba]
Код
Sub Macros() With ThisWorkbook.VBProject.VBComponents.Item("tt").CodeModule For i = 1 To .CountOfLines If .Lines(i, 1) = "MsgBox ""No :(""" Then .ReplaceLine i, "MsgBox ""Yes :)""" Next End With End Sub
Sub Macros() With ThisWorkbook.VBProject.VBComponents.Item("tt").CodeModule For i = 1 To .CountOfLines If InStr(.Lines(i, 1), "MsgBox ""No :(""") > 0 Then .ReplaceLine i, Replace(.Lines(i, 1), "No :(", "Yes :)") Next End With End Sub
[/vba] Учитывает отступы, другие операторы и комментарии в строке с MsgBox "No :(". Заменяется только содержимое MsgBox
208 символов [vba]
Код
Sub Macros() With ThisWorkbook.VBProject.VBComponents.Item("tt").CodeModule For i = 1 To .CountOfLines If InStr(.Lines(i, 1), "MsgBox ""No :(""") > 0 Then .ReplaceLine i, Replace(.Lines(i, 1), "No :(", "Yes :)") Next End With End Sub
[/vba] Учитывает отступы, другие операторы и комментарии в строке с MsgBox "No :(". Заменяется только содержимое MsgBoxAlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
Сообщение отредактировал AlexM - Воскресенье, 03.02.2013, 19:50
AlexM, почти. не считая, что в тексте кода теоретически могут быть комментарии, полностью совпадающие с указанной командой, а также присвоение переменной строки, полностью содержащей интересующую нас строку. но это чрезвычайно маловероятно, конечно
всё же, согласись, сокращать за счет потери точности - бессмысленно и чревато сократить код можно, присвоив строку переменной. да и .Lines(i, 1) тоже можно присвоить - другой переменной. на сокращение времени работы это вряд ли существенно скажется.
AlexM, почти. не считая, что в тексте кода теоретически могут быть комментарии, полностью совпадающие с указанной командой, а также присвоение переменной строки, полностью содержащей интересующую нас строку. но это чрезвычайно маловероятно, конечно
всё же, согласись, сокращать за счет потери точности - бессмысленно и чревато сократить код можно, присвоив строку переменной. да и .Lines(i, 1) тоже можно присвоить - другой переменной. на сокращение времени работы это вряд ли существенно скажется.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Сообщение отредактировал ikki - Воскресенье, 03.02.2013, 21:01
Ок. 100% правы. Если учесть все. Чтобы замена была только в макросе "test", не реагировала на MsgBox "No :(" в комментариях и все что уже учитывает, то код получается большой. В любом случае задача оказалась полезной. Ранее макросы макросами не правил. Теперь знаю как с такими задачами справляться.
Цитата (ikki)
всё же, согласись
Ок. 100% правы. Если учесть все. Чтобы замена была только в макросе "test", не реагировала на MsgBox "No :(" в комментариях и все что уже учитывает, то код получается большой. В любом случае задача оказалась полезной. Ранее макросы макросами не правил. Теперь знаю как с такими задачами справляться. AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
[offtop] Эх, что-то вдохновила меня эта тема, решил вот чуток поиграться с VBProject'ом На 100% не уверен, что до меня этого никто не делал (возможно просто не попадалось на глаза), так что строго не судите
1. addToReferences - включаем "доверять доступ к объектной модели проектов VBA" (на всякий случай) и добавляем в References 4 библиотеки: Scripting, RegExp, ADODB, WScript.Shell. Добавил себе в Personal на Workbook_Open. Возможно в скором добавляю проверку на версии библиотек.
[vba]
Код
Private Sub addToReferences() On Error Resume Next Dim strVal As String Dim objWs As Object
With ActiveWorkbook.VBProject.References .AddFromGuid "{420B2830-E718-11CF-893D-00A0C9054228}", 1, 0 'Scripting .AddFromGuid "{3F4DACA7-160D-11D2-A8E9-00104B365C9F}", 5, 5 'VBScript_RegExp_55 .AddFromGuid "{B691E011-1797-432E-907A-4D8C69339129}", 6, 1 'ADODB .AddFromGuid "{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}", 1, 0 'IWshRuntimeLibrary End With End Sub
[/vba]
2. addCommToModules - добавляется в каждый модуль активной книги описание вверху кода (после Option Explicit): название модуля, дата и время, имя пользователя. Добавил себе на панель быстрого доступа.
[vba]
Код
Sub addCommToModules() On Error Resume Next Dim i As Long With ActiveWorkbook.VBProject.VBComponents For i = 1 To .Count If .item(i).Type = 1 Then '1 тип = модуль .item(i).CodeModule.AddFromString (addText(.item(i).Name, Now, Application.UserName)) End If Next End With MsgBox "Описание модулей добавлено", vbInformation, "Information" End Sub
[offtop] Эх, что-то вдохновила меня эта тема, решил вот чуток поиграться с VBProject'ом На 100% не уверен, что до меня этого никто не делал (возможно просто не попадалось на глаза), так что строго не судите
1. addToReferences - включаем "доверять доступ к объектной модели проектов VBA" (на всякий случай) и добавляем в References 4 библиотеки: Scripting, RegExp, ADODB, WScript.Shell. Добавил себе в Personal на Workbook_Open. Возможно в скором добавляю проверку на версии библиотек.
[vba]
Код
Private Sub addToReferences() On Error Resume Next Dim strVal As String Dim objWs As Object
With ActiveWorkbook.VBProject.References .AddFromGuid "{420B2830-E718-11CF-893D-00A0C9054228}", 1, 0 'Scripting .AddFromGuid "{3F4DACA7-160D-11D2-A8E9-00104B365C9F}", 5, 5 'VBScript_RegExp_55 .AddFromGuid "{B691E011-1797-432E-907A-4D8C69339129}", 6, 1 'ADODB .AddFromGuid "{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}", 1, 0 'IWshRuntimeLibrary End With End Sub
[/vba]
2. addCommToModules - добавляется в каждый модуль активной книги описание вверху кода (после Option Explicit): название модуля, дата и время, имя пользователя. Добавил себе на панель быстрого доступа.
[vba]
Код
Sub addCommToModules() On Error Resume Next Dim i As Long With ActiveWorkbook.VBProject.VBComponents For i = 1 To .Count If .item(i).Type = 1 Then '1 тип = модуль .item(i).CodeModule.AddFromString (addText(.item(i).Name, Now, Application.UserName)) End If Next End With MsgBox "Описание модулей добавлено", vbInformation, "Information" End Sub