Код VBA для копирования рабочих листов, содержащих именованные диапазоны, из исходной рабочей книги - PullRequest
4 голосов
/ 06 декабря 2011

У меня 2 рабочие тетради. Книга источника и книга назначения. Они полностью одинаковы, за исключением одного листа, который имеет одинаковое имя в обоих, но разные данные (оба содержат около 30 листов). Я хотел скопировать остальные идентичные рабочие листы из исходной рабочей книги в конечную рабочую книгу, оставив тот 1 рабочий лист, который откладывается в данных.

По сути идентичные рабочие листы, присутствующие в целевой книге, должны быть заменены на те, которые находятся в исходной рабочей книге. Рабочие листы содержат формулы и именованные диапазоны. Мне удалось написать код VBA для копирования рабочих листов. Но так как названные диапазоны имеют область действия книги. Именованные диапазоны по-прежнему относятся к местоположениям в исходных рабочих книгах. Таким образом, я получаю 2 именованных диапазона с одинаковым именем. Что-то вроде:

'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 

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

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Один простой способ обойти непреднамеренное создание ссылки при переходе от источника к книге назначения - это связать книгу назначения с источника на себя

Снимок экрана для xl2010

  • Редактировать.... Ссылки
  • «Изменить источник» и выберите текущий файл в качестве нового источника

enter image description here

1 голос
/ 07 декабря 2011

Это изменит именованные диапазоны для удаления ссылки на внешний файл:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...