2009-04-10 3 views

답변

3

좋은 질문이지만, 할 수 없다고 생각합니다.

+2

일을 매우 인상적이다. 다중 스레드 구성 요소를 작성하거나 기존 구성 요소를 사용하여 VBA에서 호출 할 수 있지만 VBA 자체는 다중 스레드가 아닙니다. – Joe

0

내가 생각할 수있는 가장 빠른 방법은 양식을 만들고 기존 또는 스스로 조절할 수있는 컨트롤을 넣는 것입니다.

4

VBA에서이 작업을 직접 수행 할 방법이 없습니다. Here is a MSDN forum discussion 이것에 대해 자세히 이야기합니다. Office는 멀티 스레딩을 위해 VBA 확장을 노출하지 않았습니다.

그러나 Windows API를 호출하거나 다중 스레드 호출을 수행하는 VBA (다른 곳에 작성)에서 고유 한 COM 개체를 만들어이 작업을 수행 할 수 있습니다. 어떻게 든 호출 스레드로 모든 것을 다시 마샬링해야합니다 (아마도 COM 개체 또는 유사한 것으로 폴링).

또한 COM threading에 대한 bendewey의 링크를 확인하고 싶을 수도 있습니다. 이는이 문제와 관련이 있기 때문입니다.

-1

MS Access VBA를 사용하여 양식을 사용할 수있는 경우 폼에 타이머를 놓고 지연을 10ms와 같이 매우 낮은 값으로 설정하십시오. 그런 다음 타이머 이벤트 함수에 코드를 삽입하면 별도의 스레드에서 실행됩니다.

+5

VBA의 폼에있는 타이머는 주 스레드에서 발생합니다. 이 양식은 별도의 스레드가 아닌 Windows 메시지를 사용하여 예약합니다. –

+0

Reed, 저는 VB6에서 이것이 사실임을 확신합니다. VBA와 다른가요? – andrewrk

+0

아니요, 같은 스레드에서 실행됩니다. – Onkelborg

1

ShellOpen()과 같은 것을 사용하여 쉘 스크립트를 시작하는 방법 (예 : Visual Basic Script x 번)으로 파일을 통해 스크립트와 통신 (결과가 도착할 때를 감지하는 풀링 메커니즘) COM 구성 요소를 작성하는 것보다 쉽다고 생각합니다. 또한 VB Script는 VBA와 매우 유사합니다. 나쁜 쪽은 꽤 많지만 - 파일을 쓰고 읽는 것이 메모리를 공유하는 것보다 시간이 많이 걸리고 풀을하면 VBA 스크립트가 응답하지 않는 것처럼 보일 수 있습니다.

-1

DoEvents 프로 시저를 사용하면 시스템에서 이벤트. 이 서브를 때때로 호출하고 메인 쓰레드는 멈추지 않습니다.

+4

그건 좋은 해결책이 아니에요, 정말 나쁘고, 나쁜 것입니다. – Onkelborg

+0

왜 그렇게 나쁜 해결책입니까? 스크립트에서이 방법을 사용 했으므로 효과적이었습니다. 방금 DoEvents를 1000ms 또는 1 초 간격으로 호출했습니다. – Ionut

+0

음, 효과가 있었지만 그게 전부입니다. 초당 1 회 메시지에 응답하는 인터페이스는 응답하지 않습니다. 그리고 폴링을 위해서만 코드를 실행하는 프로그램을 만드는 것은 나쁜 습관입니다. 아무 것도 일어나지 않을 때 프로그램을 잠자 게하는 것이 더 좋습니다. 다른 프로그램은 컨텍스트 스위치가 적게 발생하고 전력 소비가 줄어들 기 때문에 이러한 이점을 얻을 수 있습니다. 정말로 폴링을해야한다면 DoEvents 접근 방식을 사용하지 말고 적어도 타이머를 사용하면 메시지 대기열이 엉망이되어 응용 프로그램이 응답하지 않게됩니다 – Onkelborg

4

당신이 해결 체크 아웃 할 수 있습니다 http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html

그것은 엑셀입니다하지만 실질적으로 동일해야합니다. 올바른 : 그것은 VBScript를 "에이전트"를 구축하고 그들이 .. 작업을 실행 예제를 확인해야 방식으로 작동, 그것은

-Viggo

관련 문제