我正在尝试从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并将它们全部带回一个对象。然后我可以将这些值放在电子表格中的位置。
答案 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数据库,例如: