VBA Code to Copy worksheets containing named ranges from source to destination workbook

ansh picture ansh · Dec 6, 2011 · Viewed 8k times · Source

I have 2 workbooks. A Source workbook and a destination workbook. They are completely same except for 1 worksheet which has the same name in both but different data (both contain around 30 sheets). What i wanted was to Copy the rest of the identical worksheets from source workbook to destination workbook leaving that 1 worksheet which defers in data.

Basically the identical worksheets present in the destination workbook should be replaced with the ones from the source workbook. The worksheets contain formulas and named ranges. I was successfully able to write the VBA Code to copy the worksheets. But since the named ranges have a workbook scope. The named ranges still refer to locations in the source workbooks. So i get 2 named ranges with the same name. Something like:

'The one already present in the destination workbook (from the worksheet which was replaced)
Name=VaccStart , Refers To =Sheet2!$A$2 
'The one due to the copied worksheet.
Name=VaccStart , Refers To =[C:\Users\.....\Source.xls]Sheet2!$A$2 

I want the named ranges to refer to the destination workbook and not the source workbook when i copy them. Since all the sheets in both the workbooks are same and i am just replacing them.

Answer

Rachel Hettinger picture Rachel Hettinger · Dec 7, 2011

This will modify the named ranges to remove the external file reference:

Sub ResetNamedRanges()
    Dim nm As Name
    Dim sRefersTo As String
    Dim iLeft As Integer
    Dim iRight As Integer

    For Each nm In ActiveWorkbook.Names
        sRefersTo = nm.RefersTo
        iLeft = InStr(sRefersTo, "[")
        iRight = InStr(sRefersTo, "]")
        If iLeft > 1 And iRight > 0 Then
            sRefersTo = Left$(sRefersTo, iLeft - 1) & Mid$(sRefersTo, iRight + 1)
            nm.RefersTo = sRefersTo
        End If
    Next nm
End Sub