【问题标题】:vba excel set dynamic named rangesvba excel设置动态命名范围
【发布时间】:2016-10-04 20:17:57
【问题描述】:

我想将所有命名范围设置在一个变量中并导出为 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

【问题讨论】:

  • 你设置了 Dim nName As Name 但在你的行中你有 Set rs = wbBook.Range(nNames)nNames 而不是 nName
  • 真的Set rs = wbBook.Range("Page_1,Page_2,Page_3") 有效吗?
  • 是的,这对我有用,并在单个 PDF 文件中提供了三页的输出。

标签: vba excel


【解决方案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

【讨论】:

  • 这假定所有 workbook 命名范围都驻留在同一个工作表中,否则 Union() 会出错。
  • @user3598756 是的,我已经提到了这一点。我假设它们都在同一张纸上,否则 OP 的原始代码将与解决方案相去甚远。
  • 你说得对:我只看了你的代码,并没有看到最初的caveat。至于 OP 的初始代码,“wbBook.Range”就是我所说的“离解决方案很远”的开始......
  • 它的工作;但是所有命名范围都打印在单页中,而我希望每个命名范围都在单页中。我动态地进行页面设置以适应每个命名范围的单页(.FitToPagesWide = 1,.FitToPagesTall = 1)。当我单独命名范围时,它可以工作。我认为,我们需要将原始页面设置保留在“rs”中。你会在这方面帮助我吗?我对 vba 很陌生。提前感谢
  • 嗨@Manish!我们很乐意提供帮助,但由于这是一个新问题,请提出一个新问题。另外,如果我的回答回答了您的问题,请点击左侧的绿色勾号将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2019-12-05
  • 2017-10-01
  • 2019-04-04
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多