Late将表单模块中的UDT绑定为参数

时间:2016-06-17 13:00:13

标签: excel vba access-vba

我有一个访问数据库,我正在尝试编写一些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

这给我的问题是:

  

Only public user defined types defined in public object modules can be used as parameters or return types for public procedures of class modules or as fields of public user defined types

遵循建议here我改变了

Dim Teamx_Doc As ExportDocument

Teamx_Doc = CreateObject("ExportDocument")

但是现在我得到了

  

运行时错误'429':ActiveX组件无法创建对象VBA

这个问题的所有引用似乎与调用Word.Excel.Outlook.代码库中的代码有关,所以也许我只是缺少我自己的模块存储的前缀在我的数据库中?

我发现的最佳线索是one,这似乎表明我正在尝试做的事情存在更深层次的问题,或者我可以通过拨打Friend来解决问题,尽管我我迷失在哪里以及如何。

有没有办法可以在我的表单代码中绑定我的UDT对象,将一个存储在一个集合中,然后将两者都传递给一个子程序,该子程序将能够从第一个'Doc'对象中获取params,然后遍历第二个'报告'对象?

VBA> _<

2 个答案:

答案 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