1

次のコードでフォルダーをループしようとしています。ただし、添え字が範囲外のエラーを出し続けます。この問題を解決するために私ができることを誰か説明してもらえますか?

Sub LoopThroughFolder()

    Const FileSpec As String = "*.xls"
    Dim y As Integer
    Dim MyFolder As String
    Dim MyFile As String
    Dim iDot As Integer
    Dim FileRoot As String
    Dim FileExt As String

    Dim ArrayData() As Variant


    For y = 2009 To 2030

        ReDim Preserve ArrayData(y, 12)
        MyFolder = ActiveWorkbook.Path & "\" & y & "\"

        i = 1
        MyFile = Dir(MyFolder & FileSpec)
        Do While Len(MyFile) > 0
            iDot = InStrRev(MyFile, ".")

            If iDot = 0 Then
                FileRoot = MyFile
                FileExt = ""
            Else
                FileRoot = Left(MyFile, iDot - 1)
                FileExt = Mid(MyFile, iDot - 1)
            End If

            MyFile = Dir
            ArrayData(y, i) = FileRoot
            MsgBox ArrayData(y, i)
            i = i + 1
        Loop

    Next y

End Sub
4

3 に答える 3

4

この msdn linkによると、配列の最後の次元でのみReDim Preserve可能です。あなたの場合、 in のみを変更でき12ますReDim Preserve ArrayData(y, 12)。配列パラメーターの順序を変更すると、この問題が解決されます。

于 2013-04-18T04:12:07.267 に答える
0

まず、@TheGreatCo が言及しているように、配列の最後の次元のみをリダイムできます。

ReDim Preserve ArrayData(y, 12)最初の次元を再調整しようとしているため、エラーがスローされています。

次のように変更してみてください。

ReDim Preserve ArrayData(12,y)

を制限するには、次のように言うi行を変更します。Loop

Loop While i <=12

ただし、これはまだやり過ぎのようです。エラーは発生しないかもしれませんが、効率が悪いことは確かです。yArrayData(12,1955) など、何も割り当てないため、列 (2030 列!!!)は必要ありません。

アイテムを反復処理し、より効率的に配列に割り当てる方法を修正する必要があります。

私は提案します:

ReDim Preserve ArrayData(12,y-2009)

次に、次のように変更する必要があります。

ArrayData(i,y) = FileRoot
MsgBox ArrayData(i,y-2009)
于 2013-04-18T04:12:09.813 に答える
0

の最大値がどうなるかわかっているのに、そもそもyなぜ を使用するのReDimでしょうか? 使用可能な追加の (連続した) スペースがない場合はすべてのデータを再配置し、内容をコピーする必要があるため、非常に非効率的です。代わりに、

ArrayData(2009 To 2030, 1 To 12) As Variant

再次元化を行わないでください。

の値iは実際には無期限に増加するものであり、次元ReDimの変更を考慮していないためです(常に12です)。i

やりたいことに応じて、「コレクション」の使用を検討できます。コレクションでは、任意の文字列をインデックスとして指定できます。CStr(y)&"-"&CStr(i)したがって、 ...でインデックスを付けることができます

または、Variant 型の配列を初期次元 (2,12) で宣言します。ファイル ルートが見つかったら、対応する年を (1,i) に、ファイル ルートを (2,i) に割り当てます。これで、多数の空の要素を含まず (効率的)、(2 番目の次元に沿って) 再次元化でき、元のすべてのデータをキャプチャする配列ができました。実際には、独自の「スパース配列」を作成しました。

もう1つ:

上記のコメントで述べたこととは反対に、ToExcel VBA でコンストラクトを使用してから変数を調べたところ、期待どおりの結果が得られたように見えましたが、一度配列をリダイムすることはできませんでした。上限と下限で宣言されます。

于 2013-04-18T06:22:31.063 に答える