在尝试调用外部VBA函数时,只能强制公共对象模块中定义的用户定义类型

时间:2014-07-30 20:42:18

标签: vba excel-vba access-vba excel

我正在尝试从Excel调用Access函数并收到此错误:

  

编译错误:仅公共对象中定义的用户定义类型   模块可以被强制转换为变体,也可以传递给变体   功能

我试图采用我发现的solution,但没有运气。这是我的代码:

在Excel Module ExternalStatistics

Option Explicit

    Public Type MyExternalStatistics
        esMyInvites As Single
        esMyInvitePerTalk As Single
    End Type

Public MyExtRecStats As MyExternalStatistics

在Sheet1(A-Crunched Numbers)对象中:

Option Explicit

Public appRecruitingAccess As Access.Application

Public Sub Worksheet_Activate()
    Dim MyExtRecStats As MyExternalStatistics
    Dim RecruitWindow As Integer
    Dim test As String 

    Set appRecruitingAccess = New Access.Application
    With appRecruitingAccess
        .Visible = False
        .OpenCurrentDatabase "C:\Dropbox\RECRUITING\Remote0\Recruiting 0.accdb"
        RecruitWindow = DateDiff("d", Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveStart").Value), Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveEnd").Value))
        RecruitWindow = DateDiff("d", Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveStart").Value), Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveEnd").Value))
        MyExtRecStats = .Run("ExternalRecruitingStats", RecruitWindow) '*** ERROR HERE ***
        .CloseCurrentDatabase
        .Quit
    End With
    Set appRecruitingAccess = Nothing
End Sub

在Access Module ExternalStatistics

Option Compare Database
Option Explicit

Public Type MyExternalStatistics
    esMyInvites As Single
    esMyInvitePerTalk As Single
end Type

Public Function ExternalRecruitingStats(StatWindow As Integer) As MyExternalStatistics 
    Dim MyRecStats As MyExternalStatistics
    Dim Invites As Integer, Talks As Integer

    Invites = 1
Talks = 2

    With MyRecStats
        .esMyInvites = CSng(Invites)
        .esMyInvitesPerTalk = CSng(Invites/Talks)
    End With
    ExternalRecruitingStats = MyRecStats 'return a single structure
End Function

它不喜欢MyExtRecStats = .Run("ExternalRecruitingStats", RecruitWindow)语句。我想最终在Access函数中分配几个set并将它们全部带回一个对象。然后我可以将这些值放在电子表格中的位置。

1 个答案:

答案 0 :(得分:4)

VBA中的类型定义非常本地化,当您尝试将它们用于可能无法访问Type类型的确切定义的对象时,它们不能正常工作(这可能就是这种情况)。

有时,使用Class可能会有效。您需要将该类设置为public并在传递之前对其进行实例化,但我有一些疑问它实际上会起作用(出于同样的原因,类定义不会从一个应用程序看到另一个应用程序)。

另一个简单的解决方案是使用简单的Collection对象,将值作为项添加到集合中。当然,添加/检索项目的确切顺序非常重要。

User Defined Type (UDT) As Parameter In Public Sub In Class Module中有类似问题的一些有趣答案。它是关于VB6的,但它也应该在很大程度上适用于VBA。

说完这一切后,您可以通过将访问代码导入Excel来解决所有问题 您可以使用Excel中的DAO或ADO并像操作Excel一样操作Access数据库,例如: