0

我继承了对使用 Access 进行数据库和 Excel 进行报告的 Web 应用程序的责任(幸运的是,我知道)。使用 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
4

2 回答 2

2

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

我会先说我认为这是 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"因此基本上对值没有任何作用(没有"-"可替换的)。我不知道为什么这会修复错误,但我很高兴它确实如此!

于 2013-05-31T18:50:24.063 回答
0

这适用于 listobjects(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”命名范围产生了一些冲突。

于 2017-10-31T08:50:24.417 回答