为什么我的 Access VBA 在 Excel 中添加小计在一个数据库中有效,但在另一个数据库中却出现错误 1004?
Why does my Access VBA to add subtotals in Excel work in one database but error 1004 in another?
我是 VBA 的新手,使用 Access 运行 查询并将结果保存为本地驱动器上的传播sheet。保存后,Access 会打开 Excel 文件并添加小计行和一些基本格式。这在我的沙箱数据库中运行良好。当我将相同的代码(连同查询和宏)复制并粘贴到生产数据库中时,我收到此错误消息:
error message
Public Sub autoformat()
wkbookpath = "H:01_by_division.xls"
Dim XL As Object
On Error Resume Next
Set XL = GetObject(, "Excel.Application")
On Error GoTo 0
If XL Is Nothing Then
Set XL = CreateObject("Excel.Application")
End If
With XL
.Visible = True
.DisplayAlerts = False
.Workbooks.Open wkbookpath
.Range("1:1").Font.FontStyle = "Bold"
' .Range("A2").Activate
.Range("A1").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4, 5, 6, 7, _
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21), Replace:=True, PageBreaks:=False, _
SummaryBelowData:=True
.Range("U:U").EntireColumn.Hidden = True
.Range("1:1").WrapText = True
.Columns("A:U").EntireColumn.AutoFit
End With
End Sub
这是一个分布示例sheet我正在尝试小计。
enter image description here
我是否没有正确引用活动 sheet?这是我能想到的唯一可以解释在一个数据库中运行而不是在另一个数据库中运行的东西——它们是彼此的精确副本。
求助!
我的猜测是您的沙箱数据库实际上有一个 Excel 引用,而生产数据库没有。尽管 code 在它们中都是后期绑定,但您使用的是 xlSum
,它是 Excel.XlConsolidationFunction
枚举的成员。
仅 如果枚举可以解析或者您将其设置为常量,这在您的沙箱中的工作方式某处。它在您的生产数据库中编译的事实也表明您没有在模块中指定 Option Explicit
(养成总是添加它以避免将来发生这种情况的习惯)。否则你会得到一个突出显示它的编译器错误。如果未声明,它将被视为未初始化的 Variant
,当作为 Function
参数传递时,它将转换为 0
并抛出 1004。
如果您在没有参考的情况下进行后期绑定,请使用 xlSum
(-4157) 的数值...
.Range("A1").Subtotal GroupBy:=1, Function:=-4157, TotalList:=Array(4, 5, 6, 7, _
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21), Replace:=True, PageBreaks:=False, _
SummaryBelowData:=True
...或在某处将其声明为常量:
Public Const xlSum As Long = -4157
我是 VBA 的新手,使用 Access 运行 查询并将结果保存为本地驱动器上的传播sheet。保存后,Access 会打开 Excel 文件并添加小计行和一些基本格式。这在我的沙箱数据库中运行良好。当我将相同的代码(连同查询和宏)复制并粘贴到生产数据库中时,我收到此错误消息:
error message
Public Sub autoformat()
wkbookpath = "H:01_by_division.xls"
Dim XL As Object
On Error Resume Next
Set XL = GetObject(, "Excel.Application")
On Error GoTo 0
If XL Is Nothing Then
Set XL = CreateObject("Excel.Application")
End If
With XL
.Visible = True
.DisplayAlerts = False
.Workbooks.Open wkbookpath
.Range("1:1").Font.FontStyle = "Bold"
' .Range("A2").Activate
.Range("A1").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4, 5, 6, 7, _
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21), Replace:=True, PageBreaks:=False, _
SummaryBelowData:=True
.Range("U:U").EntireColumn.Hidden = True
.Range("1:1").WrapText = True
.Columns("A:U").EntireColumn.AutoFit
End With
End Sub
这是一个分布示例sheet我正在尝试小计。
enter image description here
我是否没有正确引用活动 sheet?这是我能想到的唯一可以解释在一个数据库中运行而不是在另一个数据库中运行的东西——它们是彼此的精确副本。
求助!
我的猜测是您的沙箱数据库实际上有一个 Excel 引用,而生产数据库没有。尽管 code 在它们中都是后期绑定,但您使用的是 xlSum
,它是 Excel.XlConsolidationFunction
枚举的成员。
仅 如果枚举可以解析或者您将其设置为常量,这在您的沙箱中的工作方式某处。它在您的生产数据库中编译的事实也表明您没有在模块中指定 Option Explicit
(养成总是添加它以避免将来发生这种情况的习惯)。否则你会得到一个突出显示它的编译器错误。如果未声明,它将被视为未初始化的 Variant
,当作为 Function
参数传递时,它将转换为 0
并抛出 1004。
如果您在没有参考的情况下进行后期绑定,请使用 xlSum
(-4157) 的数值...
.Range("A1").Subtotal GroupBy:=1, Function:=-4157, TotalList:=Array(4, 5, 6, 7, _
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21), Replace:=True, PageBreaks:=False, _
SummaryBelowData:=True
...或在某处将其声明为常量:
Public Const xlSum As Long = -4157