es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Esperando una fórmula asíncrona (Excel / Funciones personalizadas)

Tengo un complemento de Excel llamado ‘Funciones personalizadas’ al que hago referencia en mi proyecto. Admite funciones que obtienen contenido web de forma asíncrona.

Cuando evalúo una función desde una celda de hoja de cálculo, por ejemplo, ‘=MI_FUNCION(…)’, el valor de la celda inicialmente cambia a ‘#OCUPADO!’, seguido del resultado devuelto por la promesa subyacente.

Me gustaría entender cómo ejecutar estas funciones de forma síncrona, en vez de forma asíncrona. Tengo una macro de VBA que aplica la función a varias celdas en mi proyecto, sin embargo, estas celdas solo se evalúan una vez que la macro ha terminado. ¿Hay un patrón que pueda implementar para ‘escuchar’ o esperar a que se calcule el resultado subyacente?

Documentos de funciones personalizadas para referencia:
https://learn.microsoft.com/en-us/office/dev/add-ins/excel/custom-functions-web-reqs

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para ejecutar las funciones personalizadas de manera síncrona, puedes utilizar la palabra clave “Await” en VBA, lo cual te permite pausar la ejecución de la macro hasta que la función asíncrona haya sido completada. Puedes envolver la llamada a la función en un procedimiento “Async” y utilizar la palabra clave “Await” antes de asignar el resultado al valor de la celda.

    Aquí tienes un ejemplo:

    Sub LlamarFuncionPersonalizada()
        Dim resultado As Variant
    
        'Procedimiento "Async" para llamar a la función personalizada
        Async Sub ObtenerResultado()
            resultado = Await Application.RunAsync("MI_FUNC", "argumento")
        End Sub
    
        'Llamar al procedimiento "Async" y esperar la finalización
        Call ObtenerResultado
        'Asignar el resultado al valor de la celda
        Range("A1").Value = resultado
    End Sub
    

    Este código llama a la función personalizada “MI_FUNC” y asigna el resultado a la celda A1 una vez que la función haya sido completada. La palabra clave “Await” pausa la ejecución de la macro hasta que la función haya terminado de calcular. Puedes modificar este código para recorrer múltiples celdas y llamar a la función personalizada para cada una de ellas, con la macro esperando el resultado de cada llamada a la función antes de pasar a la siguiente.

    Es importante destacar que esto hará que la macro se ejecute de manera síncrona y puede resultar en un rendimiento más lento si estás llamando a la función personalizada para un gran número de celdas. Considera implementar una barra de progreso u otros indicadores para alertar al usuario de que la macro todavía se está ejecutando.

Comments are closed.