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

Rod*_*Rod 5 excel vba excel-vba access-vba

我试图从Excel调用Access函数并出现以下错误:

编译错误:只能将公共对象模块中定义的用户定义类型强制到变量或从变量强制,或传递给后期绑定函数。

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

在Excel模块ExternalStatistics中

Option Explicit

    Public Type MyExternalStatistics
        esMyInvites As Single
        esMyInvitePerTalk As Single
    End Type

Public MyExtRecStats As MyExternalStatistics
Run Code Online (Sandbox Code Playgroud)

在Sheet1(A紧缩数字)对象中:

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
Run Code Online (Sandbox Code Playgroud)

在访问模块中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
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*uis 5

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

有时,使用 aClass可能会起作用。您需要将类公开并实例化它,然后再传递它,但我怀疑它是否真的有效(出于同样的原因,类定义从一个应用程序到另一个应用程序不可见)。

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

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

说了这么多,您也许可以通过将 Access 代码导入 Excel 来解决所有问题。
您可以在 Excel 中使用 DAO 或 ADO 并操作 Access 数据库,就像在 Excel 中一样,例如: