visual programacion para macro lenguaje ejemplos ejecutar desde codigos codigo vba excel-vba ms-access access-vba

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.