セルの挿入

カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作

2016/08/13

今回は、セルの挿入(Insert)を取り上げます。

番地の相対的な考え方にも触れます。

△ 関連の Program Page


《このページの目次》


    

1. 概要

 セルを挿入するには Insertメソッドを使います。指定したセル範囲に空白のセルを挿入します。

 元々そこにあったセルは、下側か右側にずれます。印象としては、隙間をこじ開けるといった感じです。

    

(1) 行と列の挿入

 Range("A2").EntireRow.Insert とすれば、第2行目に空白行が設けられます。それまで第2行目だったものは第3行目になります。

 Range("A2:A3").EntireRow.Insert とした場合は、第2行目と第3行目に空白行が設けられます。既存の行は2行分だけ下側にシフトします。

 Range("C1").EntireColumn.Insert とすれば第3列目に空白列が挿入されます。それまで第3列だったものは第4列に移動します。

    

(2) セルの挿入

 A1:B1に2個分を挿入するとか、A1セルに1個分だけ挿入した時はどうなるでしょうか。

 具体的なイメージとして、3×3の9個のセルを考えます。セル番地でいうと A1:C3 です。各セルには「1番」 「2番」などを書き込んでおきます。電話機のプッシュフォンの数時ボタンと同じ並びです。

 ここで Range("A1:B1").Insert とすればA1とB1に空白セルを挿入することになりますが、その場合、縦のラインA1:A3とB1:B3が1個分だけ下側にずれます。

3番
1番 2番 6番
4番 5番 9番
7番 8番

    

 Range("A1").Insert とすればA1に空白セルを挿入することになりますが、その場合は、縦のラインA1:A3が1個分だけ下側にずれてA2:A4に移動します。

2番 3番
1番 5番 6番
4番 8番 9番
7番

    

 Range("A1").Insert xlShiftToRight とパラメータを指定した時は、横のラインA1:C1が右側にずれてB1:D1に移動します。

1番 2番 3番
4番 5番 6番
7番 8番 9番

    

 Insertメソッドのパラメータは次の二つです。

 このどちらかを指定することにより、挿入後のずれ方を明確に指示することができます。

 しかし、わざわざ長い定数名を書くのは面倒です。そこで、定数を指定しない場合の挙動をもう少し見てみましょう。

    

 定数の指定を省略した時の挙動には次のルールがあります。仮に、各々のセルが正方形であるとイメージしてお読み下さい。

 1番目と2番目のルールは、直感に合致するのではないかと思います。

 3番目のルールは覚えておくしかないでしょうか。

 セルを削除する Deleteメソッドの場合と類似のルールといえます。

目次に戻る


    

2. マクロ

 3×3の9個のセルを一つの組と見立てて、それに挿入の操作を加えます。3×3は、電話機の数字ボタンの並びです。

 3×3の組を、一つのワークシートに四つ設けます。田形に配置。
具体的には A1:C3, A11:C13, K1:M3, K11:M13 です。

 それぞれの組に対して異なる挿入操作を施します。

 マクロを掲げると下のとおり。

    

-------- ここから
Sub TestInsert()
    ActiveSheet.UsedRange.Clear
    PutData Range("A1")
    Range("A1").Insert  ' 1個だけ挿入:下に移動
    PutData Range("A11")
    Range("A11").Insert xlShiftToRight  ' 1個だけ挿入:右シフトを指示
    PutData Range("K1")
    Range("K1:K2").Insert  ' 縦長を挿入:右にシフト
    PutData Range("K11")
    Range("K11:L11").Insert  ' 横長を挿入:下にシフト
End Sub

Sub PutData(base)
    With base
        .Range("A1:C1").Value = Array("1番", "2番", "3番")
        .Range("A2:C2").Value = Array("4番", "5番", "6番")
        .Range("A3:C3").Value = Array("7番", "8番", "9番")
    End With
End Sub
-------- ここまで

    

 PutData というサブプロシージャは、3×3のデータを書き込むためのものです。パラメータとして起点を与えます。起点より右側・下側に3×3のデータを書き込みます。

 TestInsert では、PutDataを呼び出すことによって3×3のデータを書き込み、それに対して挿入操作を行っています。

    

◇ 番地の相対的な考え方

 通常、Range("A1") のように書いてセルオブジェクトを表現しますが、このとき、A1を相対的なものだと意識することはあまりないと思います。ワークシートの一番左上端を指すというのが自然なとらえ方です。

 しかし、厳密にいうと Range というのは一定の領域を表すための単語です。

 そして、Range("A1") は、その一定の領域の左上端を表します。ワークシート上の左上端とは限りません。

 ちょっと奇妙な感じだと思いますが、Range("A11").Range("A1") と書くことができます。これは、A11を起点とする領域における左上端を示します。

 Range("A11").Range("B1") とすれば、A11を起点とする領域における左上端右隣を示します。つまりは B11 のことです。

    

 PutData というサブプロシージャでは3×3のデータを書き込みます。番地でいうと A1:C3 です。

 ただ、PutDataは、起点をパラメータとして受け取ることができるようになっています。起点は base という変数で取り扱います。

 起点を A11 とすれば、それより右下の領域に3×3のデータを書き込みます。つまり A11:C13 に書き込みます。

 起点を K1 とすれば、それより右下の領域に3×3のデータを書き込みます。K1:M3 に書き込みます。

 ちょっと邪道っぽい感じのやり方ですが、「こんな方法もある」ということで……

    

 こうしたやり方の背景には、番地の絶対参照と相対参照の考え方と共通する部分はありますが、直接の関係はありません。

 試しに PutData の中の A1:C1$A$1:$C$1 などと絶対参照の形に変更しても同じ結果になります。

目次に戻る


    

3. OLEを利用するVBScript

 前述のマクロと同じ働きをする VBScript を掲げます。

 PutData の部分の記述は、マクロと全く同じです。

△ vovXL07.vbs

 1Option Explicit
 2Dim FSO, BookPath
 3Dim EXLapp, WBobj, WSobj
 4Const xlWorkbookNormal = -4143
 5Const xlShiftDown = -4121
 6Const xlShiftToRight = -4161
 7
 8Set FSO = CreateObject("Scripting.FileSystemObject")
 9BookPath = FSO.GetAbsolutePathName("Book1.xls")
10If (FSO.FileExists(BookPath) = True) Then FSO.DeleteFile(BookPath)
11Set EXLapp = CreateObject("Excel.Application")  ' Excelの起動
12EXLapp.Visible = True  ' Excelを見える状態に
13Set WBobj = EXLapp.Workbooks.Add()  ' Workbookの新規作成
14Set WSobj = WBobj.ActiveSheet
15With WSobj
16    PutData .Range("A1")
17    .Range("A1").Insert  ' 1個だけ挿入:下に移動
18    PutData .Range("A11")
19    .Range("A11").Insert xlShiftToRight  ' 1個だけ挿入:右シフトを指示
20    PutData .Range("K1")
21    .Range("K1:K2").Insert  ' 縦長を挿入:右にシフト
22    PutData .Range("K11")
23    .Range("K11:L11").Insert  ' 横長を挿入:下にシフト
24End With
25WBobj.SaveAs BookPath, xlWorkbookNormal
26EXLapp.quit
27
28Sub PutData(base)
29    With base
30        .Range("A1:C1").Value = Array("1番", "2番", "3番")
31        .Range("A2:C2").Value = Array("4番", "5番", "6番")
32        .Range("A3:C3").Value = Array("7番", "8番", "9番")
33    End With
34End Sub

〜 以上 〜