2016-09-09 2 views
0

У меня есть кнопка, которая создает новый рабочий лист. Я уже понял, как передать имя активного листа (происхождение нажатой кнопки). Вот моя проблема.Заменить справочную работу формулы с помощью макроса excel

У меня есть рабочий лист под названием «A». При нажатии на кнопку он выдает другой лист «Печать» на основе активного листа «A». Это означает, что формула ячеек в листе «Печать» ссылается на «A» (например, «A»! B1).

Теперь у меня есть рабочий лист под названием «B». Поэтому, когда я нажимаю кнопку, она должна заменить «A» в формуле всех ячеек на листе «Печать». У меня есть следующий код, но кажется, что подстановочный знак в замене не работает.

For Each cell In ActiveSheet.Range("A1:C6") 
    cell.Formula = Replace(cell.Formula, "'*'", "'" + shtName + "'") 
Next 

где shtName соответствует имени ActiveSheet (A или B).

Любая помощь будет оценена по достоинству.

ответ

0

После нескольких поисков по 5 страниц в Google кажется, что функция «Заменить» не очень хорошо подходит для подстановочных знаков. Вместо этого я использовал метод «Заменить».

For Each cell In ActiveSheet.Range("A1:C6") 

cell.Replace What:="'" + "*" + "'", Replacement:="'" + shtName + "'", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, 
SearchFormat:=False, ReplaceFormat:=False  

Next 
0
For Each cell In ActiveSheet.Range("A1:C6") 
    cell.Formula = "'" & shtName & "'" & Right(cell.Formula, _ 
          len(cell.Formula)-instrrev(cell.Formula, "'")) 
Next 
+0

Это не похоже на работу, хотя. В любом случае спасибо! Оценил вашу помощь! :) – Ronald

0

В зависимости от старого имени рабочего листа (shtName) формула может ссылаться может быть либо shtName! или 'shtName'!. Здесь я создаю определенное имя, чтобы получить правильную ссылку. Следующий Range().Replace используется для обновления всех ячеек в целевом диапазоне.

enter image description here

Sub TestReplace() 

    ReplaceSheetNameInFormula Range("A1:C6"), "A", "Print" 
    ReplaceSheetNameInFormula Range("A1:C6"), "A-b", "Print" 

End Sub 


Sub ReplaceSheetNameInFormula(Target As Range, OldSheet As String, NewSheet As String) 
    Const TempName = "TempDefinedName" 

    Dim What As String, Replacement As String 
    Replacement = "'" & NewSheet & "'!" 

    With Worksheets(NewSheet) 
     .Names.Add TempName, Worksheets(OldSheet).Range("A1"), False 
     What = Mid(.Names(TempName), 2, Len(.Names(TempName)) - 5) 
    End With 

    Target.Replace What, Replacement 

End Sub 
Смежные вопросы