programacion - vba access pdf
Llamar a la funciĆ³n Access VBA desde Excel (2)
Intenta usar Application.Run en su lugar. Algo como:
Application.Run ("AutoComp", WritingLevel)
He hecho algo similar, pero no exactamente como lo que estás haciendo. En mi caso, el nombre de la función era una variable y el valor que se le pasó fue una constante, pero teóricamente mi código debería funcionar.
Estoy construyendo una hoja de trabajo de compensación. Las tablas y la información clave están en una base de datos de acceso, Compensation.accdb
, que tiene una función para calcular la compensación en función del contrato del agente. Si el agente es un "REP", la función Access VBA realiza un cálculo y si el agente es un SRP, hace otro. Varios usuarios distintos desean llamar a esta función desde Excel (por cierto, MS Office 2013). La idea es que un usuario cambie o ingrese la cantidad en su hoja de cálculo y la hoja de cálculo llame a la función Compensation.accdb
VBA. Compensation.accdb
realiza el cálculo y transfiere el valor a la hoja de cálculo de origen.
Aquí está el código VBA Compensation.accdb
:
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
Aquí está el código 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
Cuando cambio el valor en B8 obtengo esto:
Error en tiempo de ejecución 2425: la expresión que ingresó tiene un nombre de función que Microsoft Access no puede encontrar.
No le gustan las siguientes declaraciones (el mismo error 2425 para las tres declaraciones):
Debug.Print statement
.Eval ("AutoComp(WritingLevel))") statement
test = appAccess.Eval("AutoComp(WritingLevel)")
He intentado varias versiones de comillas simples y dobles y "&"
alrededor de WritingLevel
sin éxito.
No estoy seguro de si este es el mejor enfoque. Esta es la primera vez que intento cruzar plataformas como esta, pero sería una gran ayuda para mucha gente si pudiera obtener una respuesta a este problema. Sería genial si pudiera llamar a la función de una manera más fácil, como lo hace para las funciones internas de Excel. He buscado días con diferentes versiones de mi cadena de búsqueda sin éxito.
Cuando reemplazo AutoComp(WritingLevel)
con AutoComp(SRP)
o AutoComp(REP)
funciona bien.
También parece que la función AccessDB no puede asignar un valor de retorno a sí misma si el argumento no es "REP" o "SRP".
Puede querer agregar: AutoComp = (-1) al comienzo de la función.