2

現在、Excel で動的な名前付き範囲を取り込んで 2D 配列に変換するメソッドがあります。

データに対していくつかの反復を行い、特定の列に値が含まれている場合は削除機能を実行する必要があります。転置と一時配列を使用して 2 次元配列の行を削除するためのオプションを調べました。データがかなり大きいため、行全体を簡単に削除できる他のデータ構造を調べています。

動的な名前付き範囲を vba のコレクションに変換したいと考えています。このコレクションには行番号のキーがあり、項目としてその行のすべてのデータが必要です。基本的には、2D 配列でできるようにその範囲内の各値を反復処理する機能が必要ですが、行を効率的に削除し、2D 配列を使用するより手間がかからない機能も必要です。

どうすればこれを達成できるかについて誰にも考えがありますか?

Dim srcArray () As Variant
Dim srcRange As Range
srcRange = ThisWorkbook.Worksheets("Main").Range("myNamedRange")
srcArray = srcRange.Value
Dim rowNr As Long
dim colNr As Long

 for rowNr = 1 to UBound(srcArray,1)
         if srcArray(rowNr, 9) = "testString" Then Call DeleteRowSub(srcArray, rowNr)
  Next rowNr

DeleteRowSub は、その行のインデックスに基づいて特定の行を削除するサブになります。私はそれから離れて、インデックスが行番号である srcCollection.Remove(index) のようなことを言うことができるようにしたい.

どんな助けでも大歓迎です。

4

1 に答える 1

3

これには秘密はありません。それはただの家事です。

Function ReadRangeRowsToCollection(r As Range) As Collection
    Dim iRow As Long
    Dim iCol As Long
    Dim rangeArr As Variant
    Dim rowArr As Variant
    Dim c As Collection

    'Read range content to Variant array
    rangeArr = r.Value 

    'Now transfer shit to collection
    Set c = New Collection
    For iRow = 1 To r.Rows.Count
        ReDim rowArr(1 To r.Columns.Count)
        For iCol = 1 To r.Columns.Count
            rowArr(iCol) = rangeArr(iRow, iCol)
        Next iCol
        c.Add rowArr, CStr(iRow)
    Next iRow

    Set ReadRangeRowsToCollection = c
End Function

使用例:

Dim c As Collection
Set c = ReadRangeRowsToCollection(Range("myNamedRange"))
c.Remove 1 ' remove first row from collection

注: エッジ ケースは見ていません。たとえば、範囲が 1 つのセルのみの場合、これは失敗します。それを修正するのはあなた次第です。

于 2014-09-09T10:53:38.250 に答える