为啥我的 Access VBA 在 Excel 中添加小计在一个数据库中工作,但在另一个数据库中出现错误 1004?

Posted

技术标签:

【中文标题】为啥我的 Access VBA 在 Excel 中添加小计在一个数据库中工作,但在另一个数据库中出现错误 1004?【英文标题】:Why does my Access VBA to add subtotals in Excel work in one database but error 1004 in another?为什么我的 Access VBA 在 Excel 中添加小计在一个数据库中工作,但在另一个数据库中出现错误 1004? 【发布时间】:2016-12-01 16:34:10 【问题描述】:

我是 VBA 新手,我使用 Access 运行查询并将结果作为电子表格保存在本地驱动器上。保存后,Access 会打开 Excel 文件并添加小计行和一些基本格式。这在我的沙盒数据库中运行良好。当我将相同的代码(连同查询和宏)复制并粘贴到生产数据库中时,我收到以下错误消息:

error message

Public Sub autoformat()
wkbookpath = "H:\1401_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

这是我尝试小计的电子表格示例。

enter image description here

我没有正确引用活动工作表吗?这是我能想到的唯一可以解释在一个数据库中运行而不在另一个数据库中运行的东西——它们是彼此的精确副本。

救命!

【问题讨论】:

尝试创建一个最小的例子。删除所有不必要的 cmets 您的所有.Range 对象似乎都在尝试对应用程序(XL 变量)而不是打开的工作簿中的特定工作表进行操作。创建一个工作簿变量(对象类型,如果在 Access 中)并使用它打开工作簿Set wrkbk = .Workbooks.Open(.....),然后使用With wrkbk.worksheets("SheetName"),然后使用.Range 代码。 您确定工作表有数据吗?如果无法确定数据是否有列标题,Excel 也会报错。 【参考方案1】:

我的猜测是,您的沙盒数据库实际上有 Excel 引用,而生产数据库没有。尽管 代码 在它们中都是后期绑定的,但您使用的是 xlSum,它是 Excel.XlConsolidationFunction 枚举的成员。

唯一在您的沙盒中起作用的方式是,如果可以解析枚举,或者您在某处将其设置为常量。它在您的生产数据库中编译的事实也表明您没有在模块中指定Option Explicit(养成始终添加它的习惯以避免将来发生这种情况)。否则你会得到一个突出显示它的编译器错误。如果未声明,则会将其视为未初始化的 Variant,它会转换为 0,并在作为 Function 参数传递时抛出 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

【讨论】:

感谢大家的反馈。共产国际,您切换到数值的建议导致它第一次运行,然后第二次在我的 wkbkpath 变量上出错。我省略了它并直接使用 .Workbooks.Open ("H:\1401_by_division.xls") 打开它。我认为 Darren 也是正确的——我正在处理 Excel 对象而不是特定的电子表格。我今天将继续努力,可能会回来提出后续问题。

以上是关于为啥我的 Access VBA 在 Excel 中添加小计在一个数据库中工作,但在另一个数据库中出现错误 1004?的主要内容,如果未能解决你的问题,请参考以下文章

从 Access 2010 VBA 打开 Excel 2010 文件

为啥我的 VBA 函数没有正确关闭 Access?

从 Access 2010 VBA 控制 Excel 工作簿

VBA - 从 Excel 更新 Access 文件的链接表

使用 VBA 将数据从 Excel 导出到 Access

使用自动化/VBA 填充 Excel 时,Access O365 崩溃