Как сделать так, чтобы макрос VBA выполнял поиск / замену в формулах по всей книге? - PullRequest
1 голос
/ 11 февраля 2009

Я раздаю рабочую книгу Excel нескольким пользователям, и они предполагают , чтобы в их папке XLSTART был предварительно установлен определенный файл макроса.

Если у них не установлен макрос правильно, и они отправляют мне книгу обратно, любые формулы, зависящие от нее, включают полный путь к макросу, например ::

'C:\Documents and Settings\richard.tallent\Application Data\
Microsoft\Excel\XLSTART\pcs.xls'!MyMacroFunction()

Я хочу создать быстрый макрос, который можно использовать для удаления неправильного пути из каждой формулы в книге .

Я успешно получил специальную папку, используя GetSpecialFolder (внешняя функция, которая прекрасно работает), но сам вызов Replace, показанный ниже, выдает «Ошибка приложения или объекта».

Public Sub FixBrokenMacroFormulas()
  Dim badpath As String
  badpath = "'" & GetSpecialFolder(AppDataFolder) & "\Microsoft\Excel\XLSTART\mymacro.xls'!"
  Dim Sheet As Worksheet
  For Each Sheet In ActiveWorkbook.Sheets
      Call Sheet.Activate
      Call Sheet.Select(True)
      Call Selection.Replace(What:=badpath, Replacement:="", LookIn:=xlFormulas)
      ''//LookAt:=xlPart, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
  Next
End Sub

Автоматизация поиска и замены не совсем моя сильная сторона, что я делаю не так?

Я уже прокомментировал некоторые параметры, которые не кажутся необходимыми.

Ответы [ 2 ]

2 голосов
/ 08 сентября 2012

Нет необходимости использовать такую ​​функцию, вместо этого вы можете просто использовать следующий оператор:

 'Replace with a reference to other workbook
  xlBook.ChangeLink Name:= _
     "C:\LISTADOS\reporte_gestion_sucursales\modelo_vaciado\modelo_reporte.xlsx", _
     NewName:=fileIn2, Type:=xlExcelLinks
1 голос
/ 11 февраля 2009

Попробуйте следующее:

Sub FormulaFindAndReplace(phrase As String)
  For Each Sheet_Select In ActiveWorkbook.Worksheets
    Sheet_Select.Activate
    Set Found_Link = Cells.Find(what:=phrase, After:=ActiveCell, _
        LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, _
        searchdirection:=xlNext, MatchCase:=False)
    While UCase(TypeName(Found_Link)) <> UCase("Nothing")
       Found_Link.Activate
       Found_Link.Formula = Replace(Found_Link.Formula, phrase, "")
       Set Found_Link = Cells.FindNext(After:=ActiveCell)
    Wend
  Next Sheet_Select
End Sub

Я назвал это с:

FormulaFindAndReplace "'" & GetSpecialFolder(AppDataFolder) & "\Microsoft\Excel\XLSTART\mymacro.xls'!"  

Это было взломано с:

Макросы для удаления ссылок формул

...