从Excel调用Access VBA功能

时间:2014-07-08 01:25:07

标签: vba excel-vba ms-access access-vba excel

我正在制作补偿工作表。表和密钥信息位于访问数据库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)")

我尝试了多个版本的单引号和双引号以及围绕"&"的{​​{1}}但没有成功。

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

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

2 个答案:

答案 0 :(得分:2)

请尝试使用 Application.Run 。类似的东西:

Application.Run ("AutoComp", WritingLevel)

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

答案 1 :(得分:0)

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