我有一个访问数据库,我正在尝试编写一些VBA来提高自动化程度。
我有一个名为Global Variables
的模块,我已成功用于定义全局常量(文件路径等)和模块ReportCode
,它有两个主要的子路由,一个用于运行查询使用ADODB
(在需要的地方刮取形式参数 - 返回记录集),然后使用该记录集并将数据写入excel模板。
鉴于我可能希望将多个查询写入多个选项卡,我认为最好的方法是定义一个ExportDocument
对象以包含公共参数和OrgReport
对象,其中包含查询和选项卡特定参数 - 然后在集合中收集多个OrgReport
个对象。
我希望然后将这两个参数传递给主子程序。事实证明这是VBA的痛苦(或者至少与红宝石相比!)。
在这里,您可以看到我是如何通过自定义对象定义的
Option Private Module
' Define Custom Doc Object
Public Type ExportDocument
TeamName As String
TemplatePath As String
SaveName As String
SavePath As String
End Type
' Define Custom Report Object
Public Type OrgReport
Query As String
Fields As Variant
Sheet As String
StartCol As Integer
StartRow As Integer
Headers As Boolean
End Type
这是我的表单中的代码,然后调用了一个额外的模块来完成繁重的工作 - 我知道这部分是有效的,因为它在我试图对此进行所有OOP之前就已经完成了......
Private Sub my_report_from_form_Click()
' Prep Query Inputs
Dim TeamX_Report As OrgReport
TeamX_Report.Query = "qry_TeamReporting Query"
TeamX_Report.Sheet = "RawData"
TeamX_Report.StartCol = 1
TeamX_Report.StartRow = 2
TeamX_Report.Headers = True
TeamX_Report.Fields = Nothing
' Prep Document Inputs
Dim Teamx_Doc As ExportDocument
Teamx_Doc.TeamName = "MyTeam"
Teamx_Doc.TemplatePath = strReportTemplatePath & "MyTeam.xltm"
Teamx_Doc.SaveName = ""
Teamx_Doc.SavePath = strReportSavePath & Teamx_Doc.TeamName
' Init and set collection for CHAIN reports
Dim TeamReports As New Collection
TeamReports .Add Item:=TeamX_Report, Key:=TeamX_Report.Query
Call export_data_dump(Teamx_Doc, TeamReports)
End Sub
这给我的问题是:
遵循建议here我改变了
Dim Teamx_Doc As ExportDocument
到
Teamx_Doc = CreateObject("ExportDocument")
但是现在我得到了
运行时错误'429':ActiveX组件无法创建对象VBA
这个问题的所有引用似乎与调用Word.
,Excel.
或Outlook.
代码库中的代码有关,所以也许我只是缺少我自己的模块存储的前缀在我的数据库中?
我发现的最佳线索是one,这似乎表明我正在尝试做的事情存在更深层次的问题,或者我可以通过拨打Friend
来解决问题,尽管我我迷失在哪里以及如何。
有没有办法可以在我的表单代码中绑定我的UDT对象,将一个存储在一个集合中,然后将两者都传递给一个子程序,该子程序将能够从第一个'Doc'对象中获取params,然后遍历第二个'报告'对象?
VBA> _<
答案 0 :(得分:1)
我没理由看出为什么这不起作用:
Dim Teamx_Doc As ExportDocument
特别是如果您没有在线上收到错误
Dim TeamX_Report As OrgReport
之前我使用过自定义公共类型 - 不需要CreateObject
虽然文档似乎说它很好,但您可以尝试删除
Option Private Module
答案 1 :(得分:1)
错误消息有点误导。您根本无法将具有用户定义类型的变量放入集合中。
选项1 :改为使用数组。这实际上听起来对你想做的事情很有效。
选项2 :为OrgReport
创建类模块而不是UDT。然后实例化该类的对象,即可以添加到集合中的对象。
请参阅
Excel VBA Collections and Custom Data Types
和
http://www.mrexcel.com/forum/excel-questions/16849-adding-user-defined-types-collection.html