Excel宏 - 动态设置打印区域

时间:2011-03-16 11:20:42

标签: excel vba excel-2007

我有一个具有固定列数的表,但行数每周都不同。

我可以创建一个宏来自动设置此表的打印区域吗?

6 个答案:

答案 0 :(得分:3)

我会将动态调整大小的命名范围与VBA方法结合起来。

首先创建一个命名区域MyNamedRange :(假设你的桌子起价为$ A $ 1而你的桌子有标题)

=OFFSET(A1,0,0,COUNTA(A:A)-1,COUNTA(1:1))

然后只执行一行VBA:

ActiveSheet.PageSetup.PrintArea = "MyNamedRange"

答案 1 :(得分:1)

只需使用这个简单的代码:

 Private Sub prnt()
 On Error Resume Next

  Cells(1, 1).Select
  With ActiveSheet.PageSetup
    .PrintArea = Range(ActiveCell, ActiveCell.SpecialCells(xlCellTypeLastCell)).Select.Address
    .Orientation = xlLandscape
    .LeftHeader = "&p/&N"
    .LeftFooter = ActiveWorkbook.FullName 'to show address
    .PrintTitleRows = "$1:$5" 'repeat at top
    .Zoom = False
    .Orientation = xlLandscape
    .FitToPagesWide = 1 'to print in 01 page
    .FitToPagesTall = False 'to print in 01 page
  End With
End Sub

答案 2 :(得分:0)

如果您想要始终打印整张纸,您实际上只需清除打印区域,它将默认为填充数据的纸张数量。如果你不想隐藏某些列,wtfsven的答案是完美的。

答案 3 :(得分:0)

我想这是一个很晚的回应...... 上面的解决方案在Excel 2007中对我不起作用所以我使用了

begin_column = 1
end_column = 5

begin_row = 1
end_row = 30

'converting the numbers to uppercase letters
temp_begin_column = Chr(first_column + 64)
temp_end_column = Chr(second_column + 64)

ActiveSheet.PageSetup.PrintArea = "$" & temp_begin_column & "$" & begin_row & ":$" & temp_end_column & "$" & end_row

这看起来似乎是一个复杂的解决方案,但它是我唯一可靠的解决方案

答案 4 :(得分:0)

  

我试过这个,它为我工作。

StartColumn="A"
StartRow=1
EndColumn="B"
EndRow=10

ActiveSheet.PageSetup.PrintArea = StartColumn & StartRow & ":" & EndColumn & EndRow
ActiveSheet.PageSetup.PrintArea = "A1:B10"

Or 
ActiveSheet.PageSetup.PrintArea = "$" & StartColumn & "$" & StartRow & ":" & "$"  & EndColumn & "$" & EndRow
ActiveSheet.PageSetup.PrintArea = "$A$1:$B$10"

答案 5 :(得分:0)

ActiveSheet.PageSetup.PrintArea =“ Stephen Collins上面建议的” MyNamedRange“对我不起作用。

但是如果我键入了一个稍微修改的版本: ActiveSheet.PageSetup.PrintArea = MyNamedRange.Address然后在我的上下文中可以完美地工作。

我激活了Application.ReferenceStyle = xlR1C1而不是xlA1。

注意:ActiveSheet.PageSetup.PrintArea = MyNamedRange.Address(ReferenceStyle:= xlR1C1)对我不起作用。

类似地, Bhanu Pratap上面提议的ActiveSheet.PageSetup.PrintArea = StartColumn&StartRow&“:”&EndColumn&EndRow确实非常好,第一次。 Bu不太容易以编程方式进行管理(大写字母)。

但是使用“ R”&StartRow&“ C”&StartColumn&“:”&“ R”&EndRow&“ C”&EndColumn-对我也不起作用。因此,一致。

看着https://docs.microsoft.com/en-us/office/vba/api/excel.pagesetup.printarea 它指出“ 您使用Address属性返回A1样式的地址。

因此,不使用xlR1C1似乎是一种预期的VBA行为,而以编程方式使用起来会容易得多。

我的简单解决方法:

设置MyNamedRange = Worksheets(i_sheet_idx).Range(Cells(StartRow,StartColumn),Cells(EndRow,EndColumn))-使用与Bhanu Pratap上面建议的变量相同的变量。

然后 ActiveSheet.PageSetup.PrintArea = MyNameRange.Address'可以为我完成工作。

因此,我可以通过编程轻松地播放开始/结束行/列。 如上所述,使用偏移量也应该可以更改范围,但这与VBA在此处遇到的编程困难无关,该困难在于以VBA可以接受而不会出错的方式指定范围地址。我不想统计这些试验中出现的奇怪且不清楚的VBA错误。我不经常使用VBA,也永远不会编程(因此,上面的工作很困难)。目标是按照模式自动,智能地和循环地打印大型工作表中的许多部分。

NB:可能不相关,我在调试阶段遇到-仅在PageSetup.PrintArea行上-如上所示,这是一个奇怪的现象,即使没有错误(因此,在重新运行完全预期且受控的路径之后,下面的代码)代码有时会无缘无故地跳到另一个工作簿中的完全不同的子或功能(我有另一个个人工作簿在多个模块中存储了许多工作宏)。在测试中,它发生了4次。我试图找到可能触发此事件的事件,但找不到。有时是同一子/功能被触发,有时是另一子/功能,没有逻辑连接。但是我注意到,我之前曾看到过在没有充分理由的情况下在另一种情况下触发了相同的功能(请参见下面的基本代码)。因此,某些事情必须在应用程序级别发生。在编写用于测试上述内容的“一小段代码”中,我稍后介绍了一个错误处理程序,以捕获err.number,以防发生问题,但当然不会发生。

我认为关闭并重新启动Excel(此处为2013)应该可以解决此错误。这是我以前在Excel 2010中曾经发生过的事情。指针发疯了,但是有些坚持,重复的愚蠢,背后隐藏着一些逻辑。很奇怪。
这是最常在另一个工作簿的另一个模块中触发的功能(虽然我完全没有通过编程方式激活,但我会重复):它对我来说没有逻辑意义,但它是:

函数HLink(rng作为范围)作为字符串 '从超链接中提取URL     如果rng(1).Hyperlinks.Count那么HLink = rng.Hyperlinks(1).Address 结束功能

另一个被激活的子程序没有明显的意义。