从 Excel 调用 Access VBA 函数

Posted

技术标签:

【中文标题】从 Excel 调用 Access VBA 函数【英文标题】:Calling Access VBA function from Excel 【发布时间】:2014-07-08 01:25:07 【问题描述】:

我正在制作一份薪酬工作表。表格和关键信息位于访问数据库Compensation.accdb 中,该数据库具有根据代理合同计算补偿的功能。如果代理是“REP”,则 Access VBA 函数会执行一次计算,如果代理是 SRP,则执行另一次计算。几个不同的用户想从 Excel 调用这个函数(顺便说一句,MS Office 2013)。这个想法是用户在他们的电子表格中更改或输入数量,电子表格调用Compensation.accdb VBA 函数。 Compensation.accdb 进行计算,并将值传递回原始电子表格。

这是Compensation.accdb VBA 代码:

Option Compare Database

Function AutoComp(WritingRepContract As String) As Integer 'Auto insurance
    'Debug.Print WritingRepContract
    If WritingRepContract = "REP" Then
        AutoComp = 1 'Compensation formula for Rep will go here
    End If

    If WritingRepContract = "SRP" Then
        AutoComp = 2 'Compensation formula for Senior Rep will go here, etc.
    End If

End Function

这是 Excel VBA 代码:

Public Sub Worksheet_Change(ByVal Target As Range) 
    'Is there a better way than this???
    Dim WritingLevel As String
    If Target.Address = "$B$8" Then 
    'This is the cell where one would enter Auto value.
        If Target.Value = 1 Then 'just a test to see if working
            WritingLevel = "REP"
        Else
            WritingLevel = "SRP"
        End If
        CallAutoComp (WritingLevel)
    End If

End Sub

Sub CallAutoComp(WritingLevel)
    Dim appAccess As Access.Application
    Dim test As Integer

    Set appAccess = New Access.Application
    Debug.Print appAccess.Eval("AutoComp(WritingLevel)") 
    'A test to see what is happening
    With appAccess
        .OpenCurrentDatabase "C:\Mypath\Compensation.ACCDB"
        .Visible = False ' Useful for debugging when true
        .Eval ("AutoComp(WritingLevel)")
    End With
    test = appAccess.Eval("AutoComp(WritingLevel)")
    With appAccess
        .CloseCurrentDatabase
        .Quit
    End With

End Sub

当我更改 B8 中的值时,我得到这个:

运行时错误 2425:您输入的表达式具有函数名称 Microsoft Access 找不到。

它不喜欢以下语句(所有三个语句都出现相同的 2425 错误):

Debug.Print statement
.Eval ("AutoComp(WritingLevel))") statement
test = appAccess.Eval("AutoComp(WritingLevel)")

我尝试了几个版本的单引号和双引号以及 "&" 包围 WritingLevel 都没有成功。

我不确定这是否是最好的方法。这是我第一次尝试像这样跨平台,但如果我能得到这个问题的答案,对很多人来说将是一个很大的帮助。如果我能以更简单的方式调用该函数,例如对内部 Excel 函数的调用,那就太好了。我用不同版本的搜索字符串搜索了几天,但没有成功。

当我将 AutoComp(WritingLevel) 替换为 AutoComp(SRP)AutoComp(REP) 时,它工作正常。

【问题讨论】:

这是否有效? appAccess.Eval("AutoComp(" & Chr(34) & WritingLevel & Chr(34) & ")")?为什么将代码移交给 Access?它是否需要其表中的一些数据?计算是如何完成的?您可以将其移至记录集解决方案。 WritingLevel是excel中的一个变量,access中不存在。这就是访问不愉快的原因。您将需要传递“SRP”或“REP”(又名"AutoComp(" & WritingLevel & ")"),或者只是将自动压缩作为 excel 文件的一部分并使用记录集来访问访问数据库。 您的 Chr(34) 解决方案有效,非常感谢!代码交给 Access,因为 Access 包含大表和遍历这些表的函数,这就是函数返回补偿结果的方式。 【参考方案1】:

尝试改用 Application.Run。比如:

Application.Run ("AutoComp", WritingLevel)

我做过类似的事情,但不完全像你正在做的事情。在我的例子中,函数名是一个变量,传递给它的值是一个常量,但理论上我的代码应该可以工作。

【讨论】:

这行得通,非常感谢!它很容易阅读。此解决方案将需要扩展到传递给完全开发的字符串和整数类型的 Access VBA AutoComp 函数的多个参数。我假设我可以使用“,”分隔参数,这样就可以了。 我不肯定,你必须用谷歌搜索。如果不是,理论上您可以将变量连接成一个字符串(可能使用冒号作为分隔符),将其传递给函数,然后在进入函数时将字符串拆分回来。【参考方案2】:

如果参数不是“REP”或“SRP”,AccessDB 函数似乎也无法为其自身分配返回值。 可能要添加: AutoComp = (-1) 在函数的开头。

【讨论】:

以上是关于从 Excel 调用 Access VBA 函数的主要内容,如果未能解决你的问题,请参考以下文章

从 Java 调用 Access 中的 VBA 函数

使用VBA将VBA模块从Access项目导出到Excel项目

从 C# 访问 VBA 函数

从 vba 代码调用 Excel 的工作表函数

从 VBA (Excel) 中的另一个函数调用一个函数

从 Access 2010 VBA 打开 Excel 2010 文件