2017-01-22 5 views
0

У меня есть рабочие листы Wk1, Wk2 Wk3 и т. Д. В моей книге.Нужно изменить имена скопированных формул Excel с помощью VBA

Все формулы в листе WK1 имеют префикс WK1 например = Wk1MonWeight

После копирования формулы из листа WK1 к любому из других листов, которые я использую код, приведенный ниже, чтобы изменить префикс WK1 с именем лист они были скопированы, например, после копирования = Wk1MonWeight на лист Wk2 формула становится = Wk2MonWeight. Этот код работает.

Sub Step2ChangeWkNamesInFormulasOnNewWksheet() 

    Dim ws As Worksheet 
    Dim r As Range 

    For Each ws In Worksheets 
     If InStr(1, ws.Name, "Wk", 1) > 0 Then 
      For Each r In ws.Range("C116:I119") 
       r.Formula = Replace(r.Formula, "Wk1", r.Parent.Name) 
      Next r 

      For Each r In ws.Range("C184:J188") 
       r.Formula = Replace(r.Formula, "Wk1", r.Parent.Name) 
      Next r 

      For Each r In ws.Range("E341:AY341") 
       r.Formula = Replace(r.Formula, "Wk1", r.Parent.Name) 
      Next r 


     End If 
    Next ws 

    MsgBox "Done" 
    End Sub 

Я хочу изменить кусок кода ниже, чтобы изменения префикса от WK1 на имя листа, который непосредственно перед листом копируются + Avg. например, когда формула = Wk1MonWeight копируется из листа WK1 к WK4 листа становится = Wk3AvgWeight

For Each r In ws.Range("E341:AY341") 
       r.Formula = Replace(r.Formula, "Wk1", r.Parent.Name) 
      Next r 

Может кто-нибудь помочь с этим.

Спасибо

+0

Просьба уточнить: начальная формула всегда содержит '' Mon' после Wk1' и вы хотите заменить Wk1 на имя предыдущего листа и 'Mon' на' Avg'. Это точно? –

+0

Да Исходная формула всегда содержит Mon. Да, я хочу заменить Wk1 на предыдущее имя. Mon должен быть сброшен и заменен на Avg, так что новая формула будет считана как = Wk3AvgWeight – frustrationmultiplied

ответ

0

По вашему описанию, это должно сделать это:

Редактировать

Sub Step2ChangeWkNamesInFormulasOnNewWksheet() 
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 
    On Error GoTo ErrHandler 

    Dim ws As Worksheet, r As Range 
    For Each ws In Worksheets 
     If InStr(1, ws.Name, "Wk", 1) = 1 And InStr(1, ws.Name, "Wk1", 1) = 0 Then 
      For Each r In ws.Range("C116:I119, C184:J188") 
       r.Formula = Replace(r.Formula, "Wk1", r.Parent.Name) 
      Next r 
      For Each r In ws.Range("E341:AY341") 
       r.Formula = Replace(r.Formula, "Wk1Mon", Sheets(r.Parent.Index - 1).Name & "Avg") 
      Next r 
     End If 
    Next 

    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
    MsgBox "Done" 
    Exit Sub 

ErrHandler: 
    MsgBox "Something Went wrong: " & vbCrLf & Err.Description 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
End Sub 
+0

Извините, это не сработало. Я запустил его на листе Wk2, и изменились только формулы на листе Wk1. У меня есть лист перед листом Wk1, называемым списком продуктов, а формула = Wk1MonWeight изменена на = Food ListAvgWeight * 12 – frustrationmultiplied

+0

Хорошо, я вижу, что вы запускаете макрос на всех листах одновременно. Я отредактирую. –

+0

Должно ли изменение также относиться к листу Wk1? change –

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