Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 240
1

Заменить слово во всех модулях

09.04.2015, 13:20. Просмотров 2326. Ответов 8
Метки нет (Все метки)

добрый день,
как с помощью макроса заменить слово ААА на ВВВ во всех модулях?
на сколько я понимаю, он макрос должен состоять из 2х частей: сначала найти, потом заменить.
Нашёл макрос, который находит определенное значение во всех модулях .
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub SearchTextInModules()
    iText$ = "Private Sub"
    For Each iVBComponent In ThisWorkbook.VBProject.VBComponents
        With iVBComponent.CodeModule
             If .Find(iText$, 1, 1, .CountOfLines, 1) = True Then _
             
             MsgBox "Ìîäóëü " & iVBComponent.Name & " ñîäåðæèò èñêîìûé òåêñò", , ""
        End With
    Next
End Sub
Но не могу найти макрос, который дальше заменить все найденное.
Помогите, пожалуйста, есть ли у кого-нибудь "вторая" нужная половина или м.б. сам макрос целиком
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2015, 13:20
Ответы с готовыми решениями:

В символьной строке каждое слово НН заменить на слово Нижний Новгород и полученную строку вывести на экран
В символьной строке каждое слово НН заменить на слово Нижний Новгород и полученную строку вывести...

Как объявить переменную, доступную во всех модулях?
К примеру есть три файла: #a.py import main def aDef(): main.q = q+5 #b.py

Как правильно сделать декларацию класса видимой во всём проекте и всех его модулях?
Здравствуйте. Имеется класс декларированный в одном модуле (файле), а нужно использовать его...

Найти самое короткое слово, начинающееся с буквы "А", и заменить это слово на первое слово строки
Строка символов. Надо найти кратчайший слово начинающееся с буквы "А" и надо заменить это слово на...

8
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
09.04.2015, 14:21 2
Если используете поиск, то добавьте ещё и метод .ReplaceLine Line As Long, String As String, где Line это номер строки, а String - это новый текст. Номер строки можно получить с помощью .Find (см. второй аргумент), а новую строку с помощью Replace(.Lines(Line, 1), "AAA", "BBB")

P.S. Не стоит также забывать, что в одном модуле искомый текст может встречаться более одного раза.
1
6068 / 1312 / 195
Регистрация: 12.12.2012
Сообщений: 1,024
09.04.2015, 14:22 3
Лучший ответ Сообщение было отмечено mrf как решение

Решение

Здравствуйте, mrf,
Обычно достаточно возможностей, которые предоставляет стандартный диалог поиска-замены (вызывается по Ctrl + H).

Заменить слово во всех модулях


Но если обязательно нужно сделать с помощью макроса, тогда вот, набросал код на примере замены текста "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". Не пытайтесь обобщать его на другие тексты, не подумав как следует!

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

С уважением,
Аксима
2
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 240
09.04.2015, 14:47  [ТС] 4
Аксима, большое спасибо!
Стандарная замена "из меню" не подходит из-за того, что макрос будет запускать при открытии книги и закрытии.
Почему он работает только именно "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
0
1312 / 291 / 65
Регистрация: 13.11.2008
Сообщений: 604
09.04.2015, 15:04 5
Visual Basic
1
If InStr(s, "R2C1:R7500C1") = 1 Then
замените на
Visual Basic
1
If InStr(s, "R2C1:R7500C1") Then
1
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 240
09.04.2015, 15:14  [ТС] 6
да, спасибо!!!
осталось додуматься как сделать, что в самом этом модуле не менялось
а то точно будет по сненарию Аксимы
" И последнее. Примите во внимание, что я не несу ответственности за любой случайный, косвенный и непреднамеренный ущерб (в том числе, среди прочего, утрату прибыли либо конфиденциальной или иной информации, потерю бизнеса, а также любые иные материальные потери), понесенный в результате использования вышеизложенного кода."
0
1312 / 291 / 65
Регистрация: 13.11.2008
Сообщений: 604
09.04.2015, 15:29 7
Так Вы "R2C1:R7500C1" объявите константой на уровне проекта(сразу второй или первой строкой):
Visual Basic
1
Public Const sToReplace as string = "R2C1:R7500C1"
и цикл в модулях потом делайте с третьей или второй строки:
Visual Basic
1
2
3
4
5
6
            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
2
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 240
09.04.2015, 15:49  [ТС] 8
спасибо!!! реально гениальное, по моему, решение!
действительно, текст который надо заменить нах-ся после 10 строчке во всех модулях.
в исполнительном последнее упоминание о нем - в 8 строчке.
просто замену надо делать после 9 строчки и все ок, даже без объявления костантой.
спасиба!
0
346 / 107 / 20
Регистрация: 08.01.2015
Сообщений: 1,157
Записей в блоге: 1
02.09.2015, 17:18 9
Цитата Сообщение от Аксима Посмотреть сообщение
Не пытайтесь обобщать его на другие тексты, не подумав как следует!
Это верно)). Такие эксперименты - поначалу только в виртуальной машине.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2015, 17:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

В тексте заменить слово А(любое слово) на слово В(любое слово). А и В разной длинны
Не могу сообразить как написать программу: Пользователь вводит текст Необходимо замениь слово...

Во всех словах заменить первую букву на последнюю, а последнюю на первую. Как считывать каждое слово?
Ребята, написал программу, выполняла свое предназначение, но меня преподаватель попросил записать в...

Заменить заданное слово в тексте, находящемся в заданном файле, на другое слово.
Заменить заданное слово в тексте, находящемся в заданном файле, на другое слово.

Дан текст, а также 2 слова. Заменить встречающееся в тексте слово 1 на слово 2
Подскажите пожалуйста, как написать программу в visual basic 6.0, если: Дан текст, а также 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.