#vba #excel
#vba #excel
Вопрос:
Я хочу установить весь именованный диапазон в одной переменной и экспортировать в PDF. Я могу это сделать, когда я вручную ввожу весь именованный диапазон. Моя проблема в том, что именованные диапазоны являются переменными, когда-нибудь у него будет один, когда у него будет больше 10. Пожалуйста, совет…Я пробовал со следующими кодами.
Dim wbBook As Workbook
Dim nName As Name
Set wbBook = ActiveWorkbook
Set nName=wbBook.Names
Set rs = wbBook.Range(nNames)
rs.Select
Selection.ExportAsFixedFormat xlTypePDF, strPath, , , False
Но приведенный ниже код работает для меня, когда я ввожу имя диапазона вручную..
Set rs = wbBook.Range("Page_1,Page_2,Page_3")
rs.Select
Selection.ExportAsFixedFormat xlTypePDF, strPath, , , False
Комментарии:
1. вы настраиваете
Dim nName As Name
, но в вашей строке у вас естьSet rs = wbBook.Range(nNames)
nNames вместо nName2. действительно
Set rs = wbBook.Range("Page_1,Page_2,Page_3")
работает?3. Да, это сработало для меня и дало мне вывод на трех страницах в одном файле PDF.
Ответ №1:
Вы не можете передать коллекцию (много объектов) в объектную переменную (один объект). Вам нужно перебирать объекты коллекции. Обычно мы делаем это с For Each
помощью цикла, но в этом случае, поскольку мне нужно было установить первый элемент отдельно из-за Union
, я использовал простой For
цикл.
Кроме того, избегайте использования .Select
, если можете. Просто используйте свои объекты напрямую.
Также обратите внимание, что вы говорите обо всех именованных диапазонах в рабочей книге, и это может вызвать проблемы, если у вас есть именованные диапазоны на нескольких рабочих листах. Я не тестировал, но сомневаюсь, что это сработает.
Dim wbBook As Workbook
Dim i As Integer
Dim rs As Range
Set wbBook = ActiveWorkbook
Set rs = wbBook.Names(1).RefersToRange
For i = 2 To wbBook.Names.Count
Set rs = Union(rs, wbBook.Names(i).RefersToRange)
Next
rs.ExportAsFixedFormat xlTypePDF, strPath, , , False
Комментарии:
1. предполагается, что все именованные диапазоны рабочей книги находятся на одном листе, в противном
Union()
случае будет выдана ошибка.2. @user3598756 верно, я уже упоминал об этом. Я предположил, что все они были на одном листе, иначе исходный код OP был бы очень далек от решения.
3. вы правы: я только посмотрел на ваш код и не увидел первоначального предостережения . Что касается начального кода OP, ну, ‘wbBook. Range’ — это то, что я бы назвал началом «очень далеким от решения»…
4. Это работает; однако весь именованный диапазон печатается на одной странице, тогда как я хочу, чтобы каждый именованный диапазон был на одной странице. Я динамически настраиваю страницу так, чтобы она соответствовала одной странице (.FitToPagesWide = 1 , .FitToPagesTall = 1) для каждого именованного диапазона. Когда я называю диапазон по отдельности, это работает. Я думаю, нам нужно сохранить исходные настройки страницы в «rs». Вы поможете мне в этом?, я очень новичок в vba. Заранее благодарю
5. Привет, @Manish! Мы с радостью поможем, но поскольку это новый вопрос, пожалуйста, задайте новый вопрос. Кроме того, если мой ответ ответил на ваш вопрос, пожалуйста, отметьте его как принятый, нажав на зеленую галочку слева.