二次元配列で任意の一行を削除

例えば、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

それでは、こちらの表で試してみよう。
f:id:Infoment:20190829222502p:plain

この表を配列に格納し、表の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

結果は、以下のとおり。
f:id:Infoment:20190829223011p:plain

意図した動きは実現できたのだが、何だかとても、モヤモヤしている。
もっとスッキリしたものにならないか、引き続き挑戦です。

参考まで。