【问题标题】:VBA error on PageSteup.PrintArea when using Excel 2007, works fine in Excel 2003使用 Excel 2007 时 PageSteup.PrintArea 上的 VBA 错误,在 Excel 2003 中工作正常
【发布时间】:2013-05-29 18:11:25
【问题描述】:

我已经继承了一个 Web 应用程序的责任,该应用程序使用 Access 作为数据库并使用 Excel 进行报告(我很幸运,我知道)。使用 Office 2003 一切正常,但该公司已开始推出 Office 2007,但现在引起了问题。到目前为止,Excel 2007 似乎在生成的报告之一存在问题。

报告是通过 Access 数据库中的 VBA 代码生成的,有问题的行是这样的:

sht.PageSetup.PrintArea = strPrintArea

在这种情况下,strPrintArea 的值为"$C$2:$G$57",这对我来说是有效的。 sht 是传入此函数的 Excel 工作表。

但是该行将失败并出现以下错误:

Run-time error '-2147352560(80020010)': 
Method 'PrintArea' of object 'PageSetup' failed

我很困惑为什么同一行代码在 Excel 2003 中可以正常工作,而在 Excel 2007 中却失败了。我发现 Microsoft 针对 Excel 2010 发布了针对此问题的修补程序 (http://support.microsoft.com/kb/2553436),但我还没有找到Excel 2007 的任何类似内容。

我不知道下一步该去哪里。非常感谢任何帮助!

不确定它会有多大帮助,但这是发生错误的完整功能:

Sub SetPrintProperty(ByRef sht As Excel.Worksheet, ByRef strPrintArea As String, ByRef douLeftMargin As Double, ByRef douRightMargin As Double, _
                        ByRef douTopMargin As Double, ByRef douBottomMargin As Double, _
                        ByRef douHeaderMargin As Double, ByRef douFooterMargin As Double)
'*******************************************************************************************************************
'set the print area for a worksheet
'Arguments:
'   sht: the spreadsheet needed to set print area
'   strPrintArea: the address of the print area on a spreadsheet
'   douLeftMargin: left margin
'   douRightMargin: right margin
'   douTopMargin: top margin
'   douBottomMargin: bottom margin
'   douHeaderMargin: header margin
'   douFooterMargin: footer margin
'********************************************************************************************************************

    sht.PageSetup.PrintArea = strPrintArea
    With sht.PageSetup
        .PrintTitleRows = ""
        .PrintTitleColumns = ""
    End With

    With sht.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Excel.Application.InchesToPoints(douLeftMargin)
        .RightMargin = Excel.Application.InchesToPoints(douRightMargin)
        .TopMargin = Excel.Application.InchesToPoints(douTopMargin)
        .BottomMargin = Excel.Application.InchesToPoints(douBottomMargin)
        .HeaderMargin = Excel.Application.InchesToPoints(douHeaderMargin)
        .FooterMargin = Excel.Application.InchesToPoints(douFooterMargin)
        .PrintHeadings = False
        .PrintGridlines = False
        .PrintComments = xlPrintNoComments
'        .PrintQuality = 600
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlLandscape
        .Draft = False
        '.PaperSize = xlPaperLetter
        .PaperSize = xlPaperLegal
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintErrors = xlPrintErrorsDisplayed
    End With

End Sub

【问题讨论】:

  • 您从哪里运行此代码?检查您是否没有混淆对 Access 和 Excel 的引用(您是否在 Access 中正确设置了对 Excel 的引用)。我认为某处有你的问题......
  • 此代码是从通过 Web 应用程序中的 ActiveX 调用的 VBA 宏执行的。我对 VBA 很陌生,我将如何检查参考资料?
  • 尝试更换打印机再试一次。我遇到了类似的问题,将打印机更改为“软件”打印机(即 Microsoft Office Document Image Writer),进行了所有页面设置更改,然后将打印机改回了真正的打印机。似乎可以解决问题。除此之外,它比直接与打印机驱动程序通信要快得多。
  • 刚刚尝试将默认打印机从办公室的打印机更改为 Microsoft 的软件 XPS 打印机。没有骰子。我还尝试在分配给 PageSetup.PrintArea 之前在代码中设置它,它仍然抛出相同的错误:For Each prt In Application.Printers If (prt.DeviceName = "Microsoft XPS Document Writer") Then Set Application.Printer = prt End If Next prt sht.PageSetup.PrintArea = strPrintArea

标签: excel ms-access vba


【解决方案1】:

因此,希望这能以某种方式帮助那些面临同样问题并希望免去解决问题的麻烦的人,这是我的最终解决方案。

我会先说我认为这是 Excel 2007 的 VBA 中的一个错误,因为该解决方案对我没有任何意义。

无论如何,在试图找出导致错误的确切原因时,我尝试测试sht.PageSetup.PrintArea 的硬编码值。起初我做了一些基本的事情,比如:

sht.PageSetup.PrintArea = "A1:A3"

令我惊讶的是,它奏效了!好吧,我想,如果我将最初通过 strPrintArea 传递给函数的值输入呢?

sht.PageSetup.PrintArea = "$C$2:$G$57"

再次令我惊讶的是它起作用了!好的,此时我很困惑,分配strPrintArea 怎么会导致错误,但"$C$2:$G$57" 工作正常?最后我没有答案,但怀疑 Excel 以某种方式想要分配“不同”类型的字符串,这就是我最终尝试查看是否调用会返回我的字符串值的函数会工作:

sht.PageSetup.PrintArea = Replace(strPrintArea, "-", "")

由于传入的值始终采用 excel 范围格式,例如 "$C$2:$G$57",这基本上对值没有任何作用(没有要替换的 "-")。我不知道为什么这会修复错误,但我很高兴它确实如此!

【讨论】:

  • 这个解决方案让我想知道ByRef strPrintArea As StringByRef 部分是否是问题所在。没有理由导致问题,但在给出的代码中也没有必要将其传递为 ByRef 而不是 ByVal
  • 我刚刚尝试在尚未将更改推出的数据库副本上将ByRef strPrintArea As String 更改为ByVal strPrintArea As String,但在执行时它仍然在同一行上给出了相同的错误。我会对那个解决方案更满意,但至少它会给出它为什么会崩溃的原因!一定是别的东西……
【解决方案2】:

这适用于列表对象(excel 表格):

Dim ws As Worksheet, LastRow as Integer
Set ws = Sheets("Sheet1")
With ws.ListObjects("My_Table")
  LastRow = .ListRows(.ListRows.Count).Range.End(xlUp).Row - 1
  'If LastRow = 1 Then LastRow = .ListRows(.ListRows.Count).Range.Offset(1, 0).End(xlUp).Row
  ws.PageSetup.PrintArea = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, 12)).Address
End With

在我的情况下,这种替代方法会产生错误:

ws.PageSetup.PrintArea = ws.Range("My_Table[#All]").Address

更新:我现在怀疑我在打印区域中的冲突名称问题与在两台不同的电脑上处理同一个文件有关:一台使用 Windows 7,另一台使用西班牙语的 Winows XP。 我看到 Office 2007 的西班牙版 XP 安装后打印区域变为“Área_de_impresión”,这可能会与“Print_Area”命名范围产生一些冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多