二次元配列で任意の一行に空白挿入 xlUP or xlDown

昨日は、二次元配列で任意の一行に対し、以下を行うことに挑戦した。

  1. コピー または カット
  2. 挿入 または 貼り付け

infoment.hatenablog.com

一見上手くいったような結果を得たが、残念。最後尾に挿入する場合、上手くいかない。そりゃ、そうだ。現時点では、挿入した場合の挙動がすべて「xlDown」なのだから。最後尾は自動的に押し下げられるため、どう頑張っても最後尾にデータを付すことが出来ない。うむむ、どうしてくれようか。

そこで、作成済みのコードに、挿入時のデータシフト方向を付すことにした。
f:id:Infoment:20190902220943p:plain

まず、問題を単純化するために、次のように考えた。

  • 基本的には、xlDownとする。従って指定行に挿入指示した場合、元からあった行は押し下げられる。
  • xlUpであることは、指定+1行目xlDownで挿入指示するのと同じこと。

つまり、xlDownで0,xlUpで1になるような関数があれば良い訳だ。
これを踏まえて、「空白を挿入」を作り直してみた。

' row_index 行目に空白挿入。
Public Function RowInsert(ByVal row_index As Long, _
                 Optional row_shift As Excel.XlDirection = xlDown) As Variant
    
    ' 右と左へのシフトは無視。
    If row_shift <> xlToLeft And row_shift <> xlToRight Then
        row_index = row_index + (xlDown - row_shift) / (xlDown - xlUp)
    End If
    
    RowInsert = RowEdit(row_index, piInsert)
End Function

早速実験だ。まずは、xlDownの場合。
f:id:Infoment:20190902225511g:plain

次いで、xlUpの場合。
f:id:Infoment:20190902225623g:plain

ここまでは、意図したとおり。
後はこれを、昨日のコードに反映するわけだが・・・

今日はここで、時間切れ。明日に続きます。

参考まで。