二次元配列で任意の一行を削除 の続き
昨日は、二次元配列で任意の一行を削除して、上に詰めることに挑戦した。
infoment.hatenablog.com
しかし、どうもスッキリしない。
そこで今日は、昨日の続きに挑戦する。
もともと、シートに対してならば、このような表記ができる。
Range("A4").EntireRow.Delete
配列でも、このような表記ができないものか。
よし。無いならば、作ってしまおう。
ということで、無理やり作ったのがこちら。
一つ目のクラスモジュール(SeaquenceClass)
Option Explicit Public Function TargetArray() As ArrayEditClass Set TargetArray = New ArrayEditClass End Function
二つ目のクラスモジュール(ArrayEditClass)
こちらには、昨日作成したユーザー定義関数を丸っと移植。
Option Explicit Public Function RowDelete(ByVal source_array As Variant, _ row_index As Long) As Variant Dim rMin As Long: rMin = LBound(source_array, 1) Dim rMax As Long: rMax = UBound(source_array, 1) Dim cMin As Long: cMin = LBound(source_array, 2) Dim cMax As Long: cMax = UBound(source_array, 2) Dim TempArray As Variant ReDim TempArray(rMin To rMax - 1, cMin To cMax) Dim r As Long Dim i As Long: i = rMin Dim c As Long For r = rMin To rMax - 1 For c = cMin To cMax TempArray(r, c) = source_array(i, c) Next If r + 1 = row_index Then i = i + 2 Else i = i + 1 End If Next RowDelete = TempArray End Function
それでは、テストコードを作成してみる。
作成経過は、こんな感じだ。
Sub Test() Dim SQC As SeaquenceClass Set SQC = New SeaquenceClass Dim arr() As Variant arr = Range("A1:D8").Value arr = SQC.TargetArray.RowDelete(arr, 4) Range("A10").Resize(7, 4) = arr End Sub
テスト結果は、↓ こちら。
動いた。動いたが・・・間に一個クラスモジュールを咬ませる意味があるのか?と問われると、自信が無い。拡張の方向次第だとは思うのだが。
という訳で、引き続き模索してみます。
参考まで。