2017-10-28 14 views
0

안녕하세요 아래의 LotusScript에서 2 차원 배열을 사용하고 있습니다.LotusScript 및 2 차원 배열 및 구독 초과 또는 범위 오류

Counter = 0 
While Not (ProcessingViewDoc Is Nothing) 
    Redim Preserve AllRecrods(Counter,0) 
    AllRecrods(Counter,0) = ProcessingViewDoc.Test1(0) 
    Redim Preserve AllRecrods(Counter,1) 
    AllRecrods(Counter,1) = ProcessingViewDoc.Test2(0) 
    Redim Preserve AllRecrods(Counter,2) 

    Set ProcessingViewDoc = ProcessingView.GetNextDocument(ProcessingViewDoc) 
    Counter = Counter +1 
Wend 

다음 문서를 처리 할 때 카운터 1에 도달하고 두 번째 문서에 도달하면 오류 구독이 범위를 벗어납니다. 배열의 전역 선언입니다.

Dim AllRecrods() As Variant 

다음은 두 번째 루프로 넘어갈 때 오류가있는 줄입니다.

Redim Preserve AllRecrods(Counter,0) 

답변

1

리처드의 훌륭한 대답 외에도 몇 가지 제안 할 것입니다.

1) While Not (ProcessingViewDoc Is Nothing) (두 개의 음화가 포함되어있어 읽기가 더 어려워 짐) 대신 Do Until doc Is Nothing을 사용하십시오. 그것은 훨씬 명확하다.

2) 목록을 사용하는 경우 배열의 redim에 대해 걱정할 필요가 없습니다. 사용자 지정 데이터 형식의 목록으로 만들 수 있으며 문서의 UNID를 키로 사용하면 값을 원본 문서에 빠르게 연결할 수 있습니다.

내 코드는 다음과 같을 것이다 :

--- Declarations --- 
Type recordData 
    value1 As String 
    value2 As String 
End Type 


--- Main Code --- 
Dim allRecords List As recordData 
Dim unid as String 
Do Until ProcessingViewDoc Is Nothing 
    unid = ProcessingViewDoc.UniqueID 
    allRecords(unid).value1 = ProcessingViewDoc.Test1(0) 
    allRecords(unid).value2 = ProcessingViewDoc.Test2(0) 
    Set ProcessingViewDoc = ProcessingView.GetNextDocument(ProcessingViewDoc) 
Loop 
1

Preserve 옵션과 함께 ReDim을 사용하고 두 가지 치수를 모두 변경하고 있습니다. 너는 그렇게 할 수 없다. documentation for the ReDim statement에서

: 지정 보존 경우

, 당신은 마지막 배열 차원의 상한을 변경할 수 있습니다. 다른 바운드 결과를 에서 변경하려고하면 오류가 발생합니다.

또한 로직이 엉망입니다. 당신은 모든 반복에서 세 번째 redim을하고 있습니다. 첫 번째 것은 모든 반복에서 두 번째 차원을 0으로 줄입니다. 첫 번째 차원을 변경하지 않더라도 보존 옵션을 사용하면 이미 사용한 크기보다 작은 차원으로 데이터를 유지할 수 없으므로 AllRecrods (n, 1)에 저장된 데이터가 손실됩니다. !

2 차원을 서로 바꾸고 할당에서 되돌리고 첫 번째 차원을 2로 유지하고 2 개의 ReDim Preserve 문을 제거하는 것이 좋습니다. 즉, 루프를 반복 할 때마다 하나만 수행하십시오 (ReDim Preserve AllRecrods(2,counter)).

+0

덕분에 둘을 :) – hdc