Копировать именованные диапазоны в другую книгу

0

У меня есть этот код VBA для копирования именованных ячеек из одной рабочей книги в другую, но он мне дает Error 9: Subscript out of range. Есть идеи, пожалуйста?

Sub namexfr()
 wbs = "C:\Users\MousaviM\Desktop\Book1.xlsm"
 wbd = "C:\Users\MousaviM\Desktop\Book2.xlsm"
 For Each nam In Workbooks(wbs).Names
  Workbooks(wbd).Names.Add Name:=nam.Name, RefersToR1C1:=nam.RefersToR1C1
 Next
End Sub
Масуд
источник
Какая строка выдает ошибку?
Excellll
Самая последняя строчка перед Следующим
Масуд
Вы пытались пройтись по коду с помощью F8 в редакторе VBA? Происходит ли ошибка в первый раз, когда она достигает этой линии, или она проходит через нее несколько раз, прежде чем возникнет ошибка?
Excellll
Он не проходит, я получаю сообщение об ошибке, когда в первый раз добираюсь до линии. Я нашел этот код на этом сайте, я не очень хорош в VBA. На что ссылается R1C1? Это тот диапазон, в котором должны быть мои названные клетки?
Масуд
Имеют ли рабочие книги (1) одинаковое количество рабочих листов; и (2) листы имеют одинаковые имена?
Excellll

Ответы:

1

Таким образом, проблема в том, что Workbooks(wbs)не распознается как объект Workbook. Это связано с тем, что аргумент в скобках должен быть индексом, т. Е. Целым числом, а не путем к файлу.

Одним из решений является циклический просмотр коллекции Workbooks и сравнение желаемого пути с путями открытых рабочих книг. Затем установите объект Workbook равным соответствующей книге.

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

Sub namexfr()
Dim wbs As Workbook, wbd As Workbook, wb As Workbook
wbspath = "C:\Users\MousaviM\Desktop\Book1.xlsm"
wbdpath = "C:\Users\MousaviM\Desktop\Book2.xlsm"
For Each wb In Workbooks
    If wb.FullName = wbspath Then
        Set wbs = wb
        Exit For
    End If
Next wb
For Each wb In Workbooks
    If wb.FullName = wbdpath Then
        Set wbd = wb
        Exit For
    End If
Next wb
For Each nam In wbs.Names
    wbd.Names.Add Name:=nam.Name, RefersToR1C1:=nam.RefersToR1C1
Next
End Sub
Excellll
источник
Я понял, что первый код будет работать, если я исключу путь и просто открою обе книги. Но есть ли способ выбрать, какое имя ячейки передать, а не все?
Масуд
Вы должны будете включить ваши условия в For Eachцикл через имена. Это было бы что-то вроде, ЕСЛИ nam удовлетворяет условиям X, Y, Z, затем добавьте дублирующее имя к wbd. В противном случае пропустите это.
Excellll
+1 Хороший улов - я пропустил это. Я бы просто заменил for each ...с , for each .. in wbs.namesно это решение кажется более надежным.
Raystafarian