2010-02-12 4 views
1

VBA 초보자로서 일부 VBA 동작을 이해하는 데 문제가 있습니다.VBA의 작업이 이전 작업이 완료되기 전에 실행되는 이유는 무엇입니까?

db에서 activex 컨트롤로 행을 읽고이 값을 배열에 넣으려고하면 다음과 같은 코드가 나타납니다. vxdata1 ActiveX는 독점적이며 통찰력이 없습니다. 기본적으로 ADO 연결, SQL 명령 실행 및 결과 집합을 제어 요소로 처리합니다.

//put all records from the db into the vxData1 datagrid 
vxData1.SQLCommand = "SELECT x,y,z FROM t ORDER BY z" 

//put the datagrid values into an array 
Dim Array_Werte(500) As String 
vxData1.MoveFirst 
For i = 0 To 500 Step 1 
    Array_Werte(i) = vxData1.Column1 & ";" & vxData1.Column2 & ";" & vxData1.Column3 
    vxData1.MoveNext 
Next i 

다음과 같은 문제가 발생합니다. 배열에 항상 있어야하는 모든 데이터가 포함되는 것은 아닙니다 (예측할 수 없음).

코드를 디버그하고 루프를 통과하면 모든 것이 매력처럼 작동합니다. 그래서 나는 시간이 많이 걸리는 데이터베이스 쿼리 (큰 데이터 셋)가 루프에 들어갔을 때 아직 끝나지 않았다고 결론을 내렸다.

이제 궁금합니다. 코드에 문제가 있습니까? 아니면 일반적으로 vba 또는 스크립팅 언어의 '기능'입니까? 그물에 User.wait을 깔아 놓은 것처럼 보였습니다.하지만 내 쿼리가 얼마나 오래 걸릴지 결코 알 수 없으며, 정말 나쁜 스타일처럼 보입니다. 여기

+0

vxData1.MoveFirst를 채우기 전에 vxData1.MoveLast를 시도한 적이 있습니까? – Fionnuala

+0

안녕하세요. 예, 나는 그것을 시도했습니다 - 동일한 결과. -이 연습을 꽤 자주 보았습니다. 그러나 사실 저는 거기에 대한 이해가 부족합니다. MoveFirst를 할 때 내 recorset이 끝나지 않았을 때 MoveLast가 전혀 작동하지 않아야합니다! –

답변

0

확실하지,하지만 몇 가지 확인할입니다 :

  • 가 ActiveX 구성 요소이 .exe 또는 .dll 인인가? VB6에서 dll은 'in-process'로 실행되고 exe는 'out-of-process'즉 비동기 적으로 실행됩니다. 이것이 VBA에 어떻게 적용되는지 잘 모르겠습니다.
  • ActiveX 구성 요소가 해당 쿼리를 완료했다는 이벤트를 발생시키는 지 알고 있습니까? 루프로 이동하기 전에 해당 이벤트가 수신 대기 할 수 있습니다.
+0

안녕하세요. 감사합니다. 구성 요소는 .ocx이고 어떤 종류의 이벤트도 발생하지 않는 것 같습니다. 내가 자바 스크립트와 비슷한 문제가 있다는 것을 들었을 때 이것이 아마도 일반적인 스크립팅 관련 문제라고 생각했습니다. –

관련 문제