Изменение макроса VBA с помощью макроса

#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:

  1. «Одна часть, которая меня смущает, в какой момент меняется SL (начальная линия)?«

Когда совпадение найдено, оно возвращается/изменяется, как и номер строки, на которой найден соответствующий текст. Независимо от его первоначального значения. Таким образом, при попытке поиска с самого начала достаточно только объявить переменную.

И, чтобы позволить коду выполнить поиск по остальным строкам, вы должны увеличить этот возвращаемый номер строки/переменную:

Итак, вам следует заменить:

 SC = EC   1  

с:

 SL = SL   1 'to start searching from the next code line  
  1. «Что такое столбцы кодового модуля? Моя ссылка, скажем, состоит из 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 С другой стороны, разве мой вышеприведенный ответ не прояснил ваши вопросы? Если это так, то мы здесь, когда кто-нибудь ответит на наш вопрос полезным способом, установите флажок слева от кода, чтобы сделать его приемлемым ответом . Таким образом, кто-то другой, ищущий аналогичную проблему, будет знать, что ответ правильный…