二次元配列で任意の一行を削除
例えば、4行目を削除したい場合、この一行で事足りる。
Rows(4).Delete
しかし二次元配列の場合、任意の一行を削除して上に詰めることは出来ない。
本当は出来るのかもしれないが、私はその方法を知らない。
そこで、既に世の中にあるのかもしれないが、そのような関数を作成してみた。
Public Function ArrayRow_Delete(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 ArrayRow_Delete = TempArray End Function
それでは、こちらの表で試してみよう。
この表を配列に格納し、表の4行目に相当する部分を削除して上に詰めたうえで、シートに貼り付けてみた。
Sub test() Dim arr() As Variant arr = Range("A1:D8").Value arr = ArrayRow_Delete(arr, 4) Range("A10").Resize(7, 4).Value = arr End Sub
結果は、以下のとおり。
意図した動きは実現できたのだが、何だかとても、モヤモヤしている。
もっとスッキリしたものにならないか、引き続き挑戦です。
参考まで。