набросал код на примере замены текста "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 |
| |
|