MyTetra Share
Делитесь знаниями!
Заменить слово во всех модулях - VBA
Время создания: 16.03.2019 23:43
Текстовые метки: References, VBA,Объектная модель, VBOM
Раздел: !Закладки - VBA - VBA управление кодами
Запись: xintrea/mytetra_db_adgaver_new/master/base/15159319255jfav4dyj2/text.html на raw.githubusercontent.com

набросал код на примере замены текста "Private Sub" на "Public Sub"


Visual BasicВыделить код

1

2

3

4

5

6

7

8

9

10

11

12

13

Private Sub SearchTextInModules()

    Dim i As Long, s As String, vbc As Object

    For Each vbc In ThisWorkbook.VBProject.VBComponents

        With vbc

            For i = 1 To .CodeModule.CountOfLines

                s = .CodeModule.Lines(i, 1)

                If InStr(s, "Private Sub ") = 1 Then

                    .CodeModule.ReplaceLine i, Replace(s, "Private Sub ", "Public Sub ", 1, 1)

                End If

            Next i

        End With

    Next vbc

End Sub

Данный код предназначен только для замены "Private Sub" на "Public Sub". Не пытайтесь обобщать его на другие тексты, не подумав как следует!

И последнее. Примите во внимание, что я не несу ответственности за любой случайный, косвенный и непреднамеренный ущерб (в том числе, среди прочего, утрату прибыли либо конфиденциальной или иной информации, потерю бизнеса, а также любые иные материальные потери), понесенный в результате использования вышеизложенного кода.


Стандарная замена "из меню" не подходит из-за того, что макрос будет запускать при открытии книги и закрытии.
Почему он работает только именно "Private Sub" на "Public Sub"?
например, я пытаюсь поменять "А1" на "А2" во вовсех модулях, но замена не идет. А с "Private Sub" на "Public Sub"все идет нормально...?
Вот конкретно не работает:


Visual BasicВыделить код

1

2

3

4

5

6

7

8

9

10

11

12

13

Public Sub SearchTextInModules()

    Dim i As Long, s As String, vbc As Object

    For Each vbc In ThisWorkbook.VBProject.VBComponents

        With vbc

            For i = 1 To .CodeModule.CountOfLines

                s = .CodeModule.Lines(i, 1)

                If InStr(s, "R2C1:R7500C1") = 1 Then

                    .CodeModule.ReplaceLine i, Replace(s, "R2C1:R7500C1", "R2C1:R9500C1", 1, 1)

                End If

            Next i

        End With

    Next vbc

End Sub



Visual BasicВыделить код

1

If InStr(s, "R2C1:R7500C1") = 1 Then

замените на


Visual BasicВыделить код

1

If InStr(s, "R2C1:R7500C1") Then



Так Вы "R2C1:R7500C1" объявите константой на уровне проекта(сразу второй или первой строкой):


Visual BasicВыделить код

1

Public Const sToReplace as string = "R2C1:R7500C1"

и цикл в модулях потом делайте с третьей или второй строки:


Visual BasicВыделить код

            For i = 3 To .CodeModule.CountOfLines

                s = .CodeModule.Lines(i, 1)

                If InStr(s, sToReplace) Then

                    .CodeModule.ReplaceLine i, Replace(s, sToReplace, "R2C1:R9500C1", 1, 1)

                End If

            Next i





Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования