#vba #module #edit
Вопрос:
- существует довольно много различных файлов макросов excel со ссылкой, которая была обновлена. Есть ли способ изменить макрос с помощью макроса?
- Это то, что я смог найти до сих пор, используя CodeModule, найдите строку, в которой находится ссылка, а затем замените всю строку. У меня есть этот макрос в одном файле, и я запускаю его в файле, который хочу изменить (позже я могу автоматизировать его, чтобы просмотреть все файлы в папке), но сначала нужно заставить его работать.
- Одна часть, которая меня смущает, в какой момент меняется SL (начальная линия)?
- Что такое столбцы кодового модуля? Моя ссылка, скажем, 35 символов, почему столбец 35, не должен быть 1?
- Есть ли лучший способ? Спасибо
Sub findLink() Dim VBProj As VBIDE.VBProject Dim VBComp As VBIDE.VBComponent Dim CodeMod As VBIDE.CodeModule Dim FindWhat As String Dim SL As Long ' start line Dim EL As Long ' end line Dim SC As Long ' start column Dim EC As Long ' end column Dim Found As Boolean Set VBProj = ActiveWorkbook.VBProject Set VBComp = VBProj.VBComponents("Module1") Set CodeMod = VBComp.CodeModule 'find text to replace FindWhat = "https://www.abc.net.au/" With CodeMod SL = 1 EL = .CountOfLines SC = 1 EC = 255 Found = .Find(target:=FindWhat, StartLine:=SL, StartColumn:=SC, _ EndLine:=EL, EndColumn:=EC, _ wholeword:=True, MatchCase:=False, patternsearch:=False) Do Until Found = False MsgBox CStr(SL) Debug.Print "Found at: Line: " amp; CStr(SL) amp; " Column: " amp; CStr(SC) EL = .CountOfLines SC = EC 1 EC = 255 Found = .Find(target:=FindWhat, StartLine:=SL, StartColumn:=SC, _ EndLine:=EL, EndColumn:=EC, _ wholeword:=True, MatchCase:=False, patternsearch:=False) Loop 'If Found Then Call .ReplaceLine(SL, "Link = ""https://www.abc2.net.au/"" ") End With MsgBox "Found at: Line: " amp; CStr(SL) amp; " Column: " amp; CStr(SC) End Sub
Комментарии:
1. Есть ли лучший способ? — Поместите ссылку на рабочий лист и получите код для ссылки на него. Гораздо проще обновить значение в ячейке, чем изменять код VBA.
Ответ №1:
- «Одна часть, которая меня смущает, в какой момент меняется SL (начальная линия)?«
Когда совпадение найдено, оно возвращается/изменяется, как и номер строки, на которой найден соответствующий текст. Независимо от его первоначального значения. Таким образом, при попытке поиска с самого начала достаточно только объявить переменную.
И, чтобы позволить коду выполнить поиск по остальным строкам, вы должны увеличить этот возвращаемый номер строки/переменную:
Итак, вам следует заменить:
SC = EC 1
с:
SL = SL 1 'to start searching from the next code line
- «Что такое столбцы кодового модуля? Моя ссылка, скажем, состоит из 35 символов, почему в столбце 35, не должно быть 1?«
Ну, «Каждый символ в строке кода находится в отдельном столбце, начинающемся с нуля на левой стороне строки кода. Если найдено совпадение, значение StartColumn
аргумента устанавливается в столбец, в котором найден начальный символ совпадающей строки.
Таким образом, если ваш код возвращает 35 (как StartColumn
после совпадения), это означает, что перед первым символом строки ссылки есть еще 34 символа. Также учитываются пробелы…
Если соответствующая строка кода содержит другие слова, которые следует сохранить, код может быть адаптирован для изменения только необходимой строки.
И, если будет больше вхождений, ваш код (без предложенных выше изменений) вернет только первое. После изменения финал MsgBox
вернет только последнее вхождение…
Комментарии:
1. @nki8 Разве приведенный выше ответ не прояснил обсуждаемые вопросы? Если нет, пожалуйста, не стесняйтесь обращаться за разъяснениями…
2. спасибо за ваш ответ. Вы хотите сказать, что Find заменяет значение SL? Я бы подумал, что мне нужно написать что-то вроде SL =1 внутри цикла или использовать Найденное. Линии подсчета или Целевая строка… Разве SL не является независимой переменной от функции поиска? Причина, по которой я спрашиваю, заключается в том, что именно здесь я больше всего спотыкаюсь при кодировании, все происходит само по себе. Как и на днях, моя дата изменилась на 2021-01-01 00:00:00, было довольно сложно вернуть ее к исходному 01/01/2021.
3. @nki8 Вот что Microsoft говорит об этой проблеме… Это VBA, а не C. Я уже показал в приведенном выше ответе , как должно быть выполнено приращение:
SL = SL 1
вместоSC = EC 1
, что не имеет никакого смысла. «моя дата изменилась» имеет общее значение, и я не понимаю, что вы имеете в виду. Если вы говорите о ячейке формата в Excel, ее легко решить. Если речь идет о формате даты Windows, вы, вероятно, играли с региональными настройками. Разве вы не пробовали вышеприведенное предложение с ответом?4. @nki8 С другой стороны, разве мой вышеприведенный ответ не прояснил ваши вопросы? Если это так, то мы здесь, когда кто-нибудь ответит на наш вопрос полезным способом, установите флажок слева от кода, чтобы сделать его приемлемым ответом . Таким образом, кто-то другой, ищущий аналогичную проблему, будет знать, что ответ правильный…