2016-09-04 2 views
2

동적 배열에 이상한 동작이 있습니다. VBA가 변수에 값을 할당하는 것을 거부하는 것처럼 보입니다. 다음은 코드입니다.VBA 동적 배열은 하나의 차원 만 할당합니다.

Private Sub Report_Load() 
    Dim db As Database 
    Dim reportArray() As Variant 
    Dim structre As Recordset 
    Dim columns, rows, i As Integer 

    'Open recordset 
    Set db = CurrentDb 
    Set structure = db.OpenRecordset("SELECT * FROM [tblstructure] ORDER BY [Rank]") 

    'Change array size dynamically 
    rows = structure.RecordCount 
    columns = 4 
    ReDim reportArray(rows, columns) 

    'Populate array 
    i = 0 
    Do Until structure.EOF 
     reportArray(i, 0) = structure![Name] 
     i = i + 1 
     structure.MoveNext 
    Loop 
End Sub 

보고서를 열면 아래 첨자가 범위를 벗어난 오류가 발생합니다. 내 코드를 디버깅 할 때 루프의 i 값이 2임을 알 수 있으므로 배열의 크기가 작아야합니다. 변수 rows 위로 마우스를 가져 가면 해당 값이 1이라는 것을 알 수 있습니다. 따라서 실제로 범위를 벗어난 값에 액세스하려고합니다. 내가 크기의 배열을 얻을 수 (1, 4)

ReDim reportArray(structure.RecordCount, columns) 

:이 같은 코드를 사용하더라도 enter image description here

:하지만 이상한 부분은 structure.RecordCount의 값이 스크린 샷 (23) 때문이다 . VBA가 변수 "행"에 값 23을 할당하지 않는 이유 또는 ReDim이 첫 번째가 아닌 두 번째 차원에 올바른 값을 할당하는 이유는 무엇입니까?

+0

당신은'GetRows()는 DAO.Recordset의'방법을 연구해야 작동합니다. – Gustav

답변

2

를 읽으 : 레코드 및 스냅 샷에 대한 https://support.microsoft.com/en-us/kb/105976

원인

은 Microsoft Access에서 자동으로 레코드에 존재하는 레코드 수를 반환하지 않습니다. 오히려 액세스 된 레코드 수를 리턴합니다.

해결

는 은 RecordCount 속성을 확인하기 전에 MoveLast 메서드를 사용하여 레코드 또는 스냅 샷 레코드의 정확한 수를 결정합니다.

이 동작

상태 의도적으로 설계된 동작입니다.

Microsoft 에서처럼 RecordCount는 총 레코드 수가 아닌 액세스 한 레코드 수를 반환합니다.

따라서, 귀하의 경우,이

structure.MoveLast 
rows = structure.RecordCount 
structure.MoveFirst 
2

Access를 사용하고 나서 꽤 오랜 시간이 걸렸지 만 실제로 structure.MoveLast과 같은 작업을 수행하지 않으면 RecordCount가 제대로 작동하지 않는다는 것을 상기 한 것 같습니다 (반복하기 전에 structure.MoveFirst을 기억하십시오).). 물론 그것은 양방향으로 이동할 수있는 레코드 세트를 필요로합니다.

또는 ReDim을 루프에 넣고 매번 하나씩 늘리면됩니다.

관련 문제