カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
今回は、セルの挿入(Insert)を取り上げます。
番地の相対的な考え方にも触れます。
セルを挿入するには Insertメソッドを使います。指定したセル範囲に空白のセルを挿入します。
元々そこにあったセルは、下側か右側にずれます。印象としては、隙間をこじ開けるといった感じです。
Range("A2").EntireRow.Insert
とすれば、第2行目に空白行が設けられます。それまで第2行目だったものは第3行目になります。
Range("A2:A3").EntireRow.Insert
とした場合は、第2行目と第3行目に空白行が設けられます。既存の行は2行分だけ下側にシフトします。
Range("C1").EntireColumn.Insert
とすれば第3列目に空白列が挿入されます。それまで第3列だったものは第4列に移動します。
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メソッドの場合と類似のルールといえます。
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
などと絶対参照の形に変更しても同じ結果になります。
前述のマクロと同じ働きをする VBScript を掲げます。
PutData の部分の記述は、マクロと全く同じです。
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
〜 以上 〜