2009-04-10 34 views

Respuesta

3

Buena pregunta, pero creo que no se puede hacer.

+2

1: correcto. Puede escribir un componente multiproceso (o usar uno existente) y llamarlo desde VBA, pero VBA no es multiproceso. – Joe

0

La manera más rápida que puedo pensar es crear un formulario y poner un control existente o hágalo usted mismo en él.

4

No hay forma de hacerlo directamente en VBA. Here is a MSDN forum discussion hablando de esto en detalle. Office nunca expuso ninguna de las extensiones VBA para multihilo.

Sin embargo, puede hacer esto llamando a la API de Windows o creando su propio objeto COM en VBA (escrito en otro lugar) que realiza las llamadas multiproceso para usted. Solo asegúrate de ordenar todo de nuevo al hilo de llamada, de alguna manera (probablemente sondeando contra tu objeto COM, o algo similar).

Además, es posible que desee comprobar el enlace de bendewey en COM roscado, ya que es muy relevante para esto.

-1

Si MS Access VBA le permite usar formularios, coloque un temporizador en un formulario y establezca el retraso en un valor realmente bajo, como 10 ms. A continuación, coloque el código en la función de evento del temporizador y se ejecutará en un hilo separado.

+5

Los temporizadores en formularios en VBA ocurren en el hilo principal. El formulario usa mensajes de Windows para programar, no un hilo separado. –

+0

Reed, estoy bastante seguro de que esto es cierto para VB6. ¿Es diferente para VBA? – andrewrk

+0

No, se ejecuta en el mismo hilo – Onkelborg

1

¿Qué tal usar algo como ShellOpen() para iniciar un script de shell, por ejemplo Visual Basic Script x veces, que hará el trabajo, comunicándose con el script a través de un archivo (y un mecanismo de agrupamiento para detectar cuándo llegan los resultados)? Creo que es más fácil de hacer que escribir un componente COM. Además, VB Script es muy similar a VBA. Los lados malos son bastantes, aunque escribir y leer un archivo consume más tiempo que compartir memoria, la agrupación puede hacer que el script VBA parezca no responder, etc.

-1

También puede usar el procedimiento DoEvents que permite que el sistema maneje el archivo eventos. Simplemente llame a este sub de vez en cuando y el hilo principal no se congelará.

+4

No es una buena solución, es malo, realmente malo – Onkelborg

+0

¿Y por qué es una mala solución? He usado este enfoque en mi script y funcionó bien. Acabo de llamar a DoEvents en un intervalo de 1000 ms o un segundo. – Ionut

+0

Bueno, funcionó, pero eso es todo. Una interfaz que responde a los mensajes una vez por segundo no responde. Y es una mala práctica tener un código de ejecución de programa solo para sondeo. Empujar es mejor dejar que el programa duerma cuando no ocurre nada. Otros programas se benefician de esta causa, y están ocurriendo menos cambios de contexto, y el consumo de energía disminuye. Si realmente, realmente tiene que hacer un sondeo, no utilice el enfoque DoEvents, use un temporizador al menos, no estropeará su cola de mensajes y hará que su aplicación no responda – Onkelborg