vba excel устанавливает динамические именованные диапазоны

#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 вместо nName

2. действительно 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! Мы с радостью поможем, но поскольку это новый вопрос, пожалуйста, задайте новый вопрос. Кроме того, если мой ответ ответил на ваш вопрос, пожалуйста, отметьте его как принятый, нажав на зеленую галочку слева.