迟绑定表单模块中的UDT作为parameter passing

我有一个访问数据库,我正在尝试写一些VBA来增加自动化。

我有一个模块,我有Global Variables ,我已经成功地用来定义全局常量(文件path等)和一个模块ReportCode有两个主要的子程序,一个用ADODB运行查询(在需要的地方抓取表单参数 – 返回一个logging集),第二个采取这个logging集并将数据写入Excel模板。

鉴于我可能想多个查询写入多个选项卡我认为最好的方法是定义一个ExportDocument对象包含公共参数和OrgReport对象,其中包含查询和选项卡特定的参数 – 然后收集多个OrgReport对象的集合。

我希望将这两个parameter passing给主子程序。 这在VBA中是一种痛苦(至less与ruby相比)。

在这里你可以看到我是如何定义自定义对象的

 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 

这给我一个问题:

只有在公共对象模块中定义的公共用户定义types可以用作类模块的公共过程的参数或返回types,或者可以用作公共用户定义types的字段

以下build议我改变了

 Dim Teamx_Doc As ExportDocument 

 Teamx_Doc = CreateObject("ExportDocument") 

但是,现在我明白了

运行时错误“429”:ActiveX组件不能创build对象VBA

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

我find的最好的领导是这一个 ,这似乎表明有更深的问题,我想要做什么,或者我可以通过调用Friend来解决部分问题,但我迷失在哪里以及如何。

有没有办法,我可以延迟我的表单代码中的UDT对象,藏在一个集合中,然后传递给子例程,将能够从第一个“文档”对象抓取参数,然后遍历第二个“报告”目的?

VBA> _ <

我没有理由明白为什么这不起作用:

 Dim Teamx_Doc As ExportDocument 

特别是如果你没有得到一个错误在线

 Dim TeamX_Report As OrgReport 

我以前使用过自定义的公共types – 不需要CreateObject

虽然文件似乎说这只是罚款,你可以尝试删除

 Option Private Module 

错误信息有点儿误导。 您只是不能将具有用户定义types的variables放入集合中。

选项1 :使用数组 。 这实际上听起来像它会适合你想要做的事情。

选项2 :为OrgReport创build一个类模块,而不是UDT。 然后实例化该类的对象,那些可以添加到集合的对象。

看到
Excel VBA集合和自定义数据types

http://www.mrexcel.com/forum/excel-questions/16849-adding-user-defined-types-collection.html