我正在制作补偿工作表。表和密钥信息位于访问数据库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)
时,它可以正常工作。
答案 0 :(得分:2)
请尝试使用 Application.Run 。类似的东西:
Application.Run ("AutoComp", WritingLevel)
我做过类似的事情,但不完全像你在做什么。在我的例子中,函数名是一个变量,传递给它的值是一个常量,但理论上我的代码应该可以工作。
答案 1 :(得分:0)
如果参数不是“REP”或“SRP”,AccessDB函数似乎也无法为自己分配返回值。
可能要添加:AutoComp =( - 1)
在功能开始时。