【问题标题】:Excel - setting a dynamic print area for a range of cells covered by an array formulaExcel - 为数组公式覆盖的一系列单元格设置动态打印区域
【发布时间】:2017-01-28 15:43:57
【问题描述】:

我有一个带有页面(表 3)的电子表格,我想将其导出为 PDF(使用宏导出 pdf)。

目前,这链接到另一个工作表,用户可以在其中输入日期范围以从更大的工作表中提取相关数据。这使用以下数组公式填充工作表 3 上的数据:

=IFERROR(INDEX(Sheet1!$V$3:$W$5998,SMALL(IF((Sheet1!$C$3:$C$5998>=Crynodeb!$D$3)*(Sheet1!$C$3:$C$5998<=Crynodeb!$F$3)*(Sheet1!$V$3:$V$5998<>""),ROW(Sheet1!$V$3:$W$5998)-2),ROW(18:18)),1),"")

Sheet 3 上的数组公式已应用于大约 6000 行数据。因此有可能返回 6000 行数据。但是,根据用户输入的条件,可能只会返回 5 行数据。

除此之外,我还对 6000 行应用了单元格格式,以便在数据行之间有一条便于打印的行。

但是,由于这已应用于 6000 行数据,因此可能会导出 61 个左右的页面,而实际上只显示一个页面的数据。

是否有一种简单的方法可以继续在大范围内应用数组公式,同时将打印功能限制为仅适用于包含从数组公式返回的数据的页面?

我也在使用 Format > AutoFit Row Height 功能根据返回项目的长度调整行高,但目前我认为我必须手动执行此操作我返回数据的时间。有没有办法自动应用它来调整页面内容?

非常感谢

【问题讨论】:

  • Excel 中的打印区域是静态的。因此,没有简单的方法可以摆脱这种情况。您可以只编写一个 VBA 宏来确定实际包含数据的范围,然后在打印前将打印区域设置为该static 区域。但如果没有 VBA,您就无法让它看起来“动态”。
  • 谢谢拉尔夫,感觉这不是一件容易的事。不过,vba 绝望了,不知道从哪里开始……有人能建议一种方法吗?
  • 您可能需要确保在有人打印之前设置了PrintArea。因此,您可能想要使用Workbook_BeforePrint。如果您正在寻找相关的 VBA 代码,您只需进行搜索。网络,尤其是 StackOverflow 充满了例子:stackoverflow.com/search?q=%5Bexcel-vba%5D+printarea
  • 跑题了,但是你有速度问题吗?当运行一个只有绝对固定引用的重复数组公式时,我会将常量数组结果放入一个命名范围:IF((Sheet1!$C$3:$C$5998&gt;=Crynodeb!$D$3)*(Sheet1!$C$3:$C$5998&lt;=Crynodeb!$F$3)*(Sheet1!$V$3:$V$5998&lt;&gt;""),ROW(Sheet1!$V$3:$W$5998)-2),然后使用包装器 SMALL 函数等引用该命名范围。
  • 有时会有点卡顿,但没有问题。不过,我对此感到疑惑,谢谢 - 将考虑实施它。

标签: arrays excel excel-formula vba


【解决方案1】:

由于您想通过宏将数据导出为 PDF,我们可以将您想要的所有内容放入该宏中。

宏需要找到具有值的范围。从您的示例中,我假设总是会从 A3 开始返回数据;然后A列中不会有空格,直到数据结束。

因此,此宏从 A3 开始并查看每个单元格,直到找到一个空白值来确定数据的结束位置。

我还假设您有固定数量的数据列。我只能看到 2 列,所以我在宏中使用了这个数字。您可以将指示的代码更新为实际的列数。

然后,从 A1 到数据的最后一行和最后一列,它会自动调整行,然后将该范围保存为 PDF。

Public Sub SaveCopy()

Dim intLastRow As Integer

'Loops through column A to find last row with data
intLastRow = 3
Do While Cells(intLastRow + 1, 1).Value <> ""
    intLastRow = intLastRow + 1
Loop

'With the range of data...
'NOTE: REPLACE '2' WITH ACTUAL NUMBER OF COLUMNS OF DATA
With Range("A1", Cells(intLastRow, 2))

    'Ensure text is wrapping - required to autofit
    .WrapText = True

    'Autofit row height
    .Rows.AutoFit

    'Save as PDF
    .ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.FullName, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=True

End With

End Sub

这是一个基本的导出,只会将 PDF 保存到与文件相同的位置并使用相同的文件名(包括 excel 文件扩展名),并且只是附加 .PDF 文件扩展名。

有多种选项可用于处理 PDF 的文件名和位置。有了更多关于所需内容的信息,我可以帮助提供一个强大的解决方案。

或者,您可以删除用于导出为 PDF 的代码行并将其替换为“.Select”

这将选择数据范围,然后您可以手动保存为 PDF。只需使用另存为...将类型更改为 PDF,单击选项并在“发布内容”部分中选择“选择”。

如果我的任何假设不正确,请告诉我。

【讨论】:

  • 谢谢迈克尔。关于 PDF 质量,我之前尝试过保存对话框中的其他选项,但它似乎对图像质量影响很小。看来它只是不适合与 excel 一起使用!
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 2021-06-08
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多