2012-04-02 15 views
0

ループ内の配列にカスタムオブジェクトを追加する方法があります。問題は、配列に最後に追加されたオブジェクトが配列内の他のすべてのオブジェクトを上書きするように見えることです。私は正しいオブジェクトが最初に追加されていることを確認するコードをステップしましたが、私は最後のオブジェクトが他のオブジェクトをすべて上書きする理由を理解できないようです。私はそれがメモリポインターと私のCallNumオブジェクトと関係があると感じているが、私はこれを理解することができなかった。オブジェクトを追加して元のオブジェクトを配列した後に

Function getCallNumObjects(TotalCol As Integer) As Lib_CallNum 
' 
' Find all the call numbers and their coresponding total 
' 
    Dim CallNumObjs() As Lib_CallNum 
    Dim i As Integer 

    i = 0 
    Do Until ActiveCell.Value = "$<total:U>" 
     If i <> 1 Or i <> 0 Then 
      ReDim Preserve CallNumObjs(i) As Lib_CallNum 
     End If 
     Dim CallNum As New Lib_CallNum 
     CallNum.Title = Replace(ActiveCell.Value & ActiveCell.Offset(1, 0).Value, " ", "") 
     CallNum.Total = ActiveCell.Offset(0, TotalCol - 1).Value 
     Set CallNumObjs(i) = CallNum 
     ActiveCell.Offset(2, 0).Activate 
     Debug.Print CallNumObjs(i).Title 
     i = i + 1 
    Loop 

    Debug.Print CallNumObjs(0).Title 
    Debug.Print CallNumObjs(1).Title 
    Debug.Print CallNumObjs(2).Title 



    Set getCallNumObjects = CallNumObjs 
End Function 

この関数の出力である:

DS0000701-DS000800

LH-PK

PL001001-PL003300

ループ後の印刷物は、次のとおり

PL001001-PL003300

PL001001-PL003300

PL001001-PL003300

+0

ことの一つは、その行である:I <> 1または私は<> 0そして、常にtrueになります場合は、これは良いです。また、私はその変数の繰り返しインスタンス化はあなたの問題を引き起こしているかもしれないと思いますそうでなければ、それらの要素は満たされません。私はあなたがそれを削除できると思う。 –

+0

これらは常に真と評価されるとは限りません。ループは多くの場合2回以上実行されます。だからときどき私> 1 – ferics2

+0

私が意味するのは、常に1に等しくないか0に等しくないということでした。もしiが1ならば、0と等しくなく、その逆でもないので、ステートメントは常にTrueと評価されます。私はあなたがANDステートメントを使用することを意味すると信じています。しかし、そうした場合、配列が2になるまで配列の大きさは決まらず、コードは行上で失敗します:Set CallNumObjs(i)= CallNum、i = 0またはi = 1の場合 –

答えて

1

CallNumObjsはLib_CallNumの配列です。関数はその配列を配列ではなくLib_CallNumの単一のインスタンスに割り当てます。

Function getCallNumObjects(TotalCol As Integer) As Lib_CallNum() 

EDITを:おそらく、あなたの関数は次のように定義されていた場合、私はコメントからの変化を組み込み、中間CallNum変数を削除しました。これは少なくとも、デバッグのために不要なものを取り除くかもしれない。注意すべき

Function getCallNumObjects(TotalCol As Integer) As Lib_CallNum() 
    Dim CallNumObjs() As Lib_CallNum 
    Dim i As Integer 

    i = 0 
    Do Until ActiveCell.Value = "$<total:U>" 
     ReDim Preserve CallNumObjs(i) As Lib_CallNum 
     CallNumObjs(i).Title = Replace(ActiveCell.Value & ActiveCell.Offset(1, 0).Value, " ", "") = CallNum 
     CallNumObjs(i).Total = ActiveCell.Offset(0, TotalCol - 1).Value 
     ActiveCell.Offset(2, 0).Activate 
     i = i + 1 
    Loop 
    Set getCallNumObjects = CallNumObjs 
End Function 
+0

私の問題は解決していませんでしたが、Lib_CallNum()を返すように変更する必要がありました。 – ferics2

関連する問題