2016-09-04 16 views
2

ダイナミックアレイでは奇妙な動作があります。 VBAが変数に値を割り当てることを拒否しているようです。コードは次のとおりです。VBAダイナミックアレイでは1つのディメンションしか割り当てられません

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が第1次元ではなく第2次元に適切な値を割り当てるのはなぜですか?

+0

を動作するはずです。 – Gustav

答えて

2

読む本:レコードセットとスナップショットのhttps://support.microsoft.com/en-us/kb/105976

原因

は、Microsoft Accessが自動的に レコードセット内に存在するレコードの数を返しませ ありません。むしろ、アクセスされたレコードの数を返します。 はRecordCountプロパティをチェックする前に、MoveLastメソッドを使用して、レコードまたはスナップショット内のレコードの正確な数を決定するために

解決

STATUS

この動作は仕様です。

Microsoftでは、RecordCountは、アクセスされたレコードの数を返します。合計レコードの数は返しません。

だから、あなたの場合には、これはあなたがDAO.Recordsetの `GETROWS()`メソッドを勉強する必要があり

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

は、私がアクセスを使用しましたので、しばらくしているが、私はあなたが実際のようなものをやって全体の結果セットを列挙していない限りのRecordCountが正常に動作しないことを思い出しているようだstructure.MoveLast最初の(ちょうどをループする前にstructure.MoveFirstを行うことを忘れないでください)。もちろん、両方向に移動できるレコードセットが必要です。

また、ReDimをループに配置し、そのたびに1ずつ増やすこともできます。

関連する問題