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

2680
Masoud

У меня есть этот код 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 
0
Какая строка выдает ошибку? Excellll 9 лет назад 0
Самая последняя строка перед Next Masoud 9 лет назад 0
Вы пробовали пройти через код с помощью F8 в редакторе VBA? Происходит ли ошибка в первый раз, когда она достигает этой линии, или она проходит через нее несколько раз, прежде чем возникнет ошибка? Excellll 9 лет назад 0
Он не проходит, я получаю сообщение об ошибке при первом достижении линии. Я нашел этот код на этом сайте, я не очень хорош в VBA. На что ссылается R1C1? Это тот диапазон, в котором должны быть мои названные клетки? Masoud 9 лет назад 0
Имеют ли рабочие книги (1) одинаковое количество рабочих листов; и (2) листы имеют одинаковые имена? Excellll 9 лет назад 0
Да, я просто открываю две новые рабочие книги для этого теста. Я назвал их Book1 и Book2, и у обоих были Sheet1, Sheet2, Sheet3. Masoud 9 лет назад 0
Извините, я только что добавил это в модуль и смог увидеть остановки ошибок в строке «Для каждого имени в книгах (wbs). Имена» Masoud 9 лет назад 0
есть ли в книге именованные диапазоны? Raystafarian 9 лет назад 0
Да, я добавил 3 именованные ячейки в book1, чтобы посмотреть, смогу ли я перенести их в book2. Я просто хочу сделать этот тест, прежде чем использовать код в рабочей рабочей книге. Masoud 9 лет назад 0

1 ответ на вопрос

1
Excellll

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

Одно из решений состоит в том, чтобы просмотреть коллекцию рабочих книг и сравнить желаемый путь с путями открытых рабочих книг. Затем установите объект 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 
Я понял, что первый код будет работать, если я исключу путь и просто открою обе книги. Но есть ли способ выбрать, какое имя ячейки передать, а не все? Masoud 9 лет назад 0
Вы должны будете включить свои условия в цикл «Для каждого» через имена. Это было бы что-то вроде, если IF nam удовлетворяет условиям X, Y, Z, а затем добавить дублирующееся имя в `wbd`. В противном случае пропустите это. Excellll 9 лет назад 0
+1 Хороший улов - я пропустил это. Я бы просто заменил `для каждого ...` на `для каждого .. в wbs.names`, но это решение кажется более надежным. Raystafarian 9 лет назад 0

Похожие вопросы