カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
セルの削除(Delete)を取り上げます。
サブプロシージャを定義して、その呼び出しを行う例を含みます。
セルを削除するには Deleteメソッドを使います。
Range("A2").EntireRow.Delete
とすれば第2行目全体を削除します。
Range("C1").EntireColumn.Delete
とすれば第3列目全体の削除です。
では、A1セル1個だけを削除した時はどうなるでしょうか。これは少々ややこしいです。
3×3の9個のセルを考えます。セル番地でいうと A1:C3 です。各セルには「1番」 「2番」などを書き込んでおきます。電話機のプッシュフォンの数時ボタンと同じ並びです。
1番 | 2番 | 3番 |
4番 | 5番 | 6番 |
7番 | 8番 | 9番 |
今、「1番」を削除したとします。その時の挙動がどうなるかですが、2通り考えられます。
4番 | 2番 | 3番 |
7番 | 5番 | 6番 |
□ | 8番 | 9番 |
2番 | 3番 | □ |
4番 | 5番 | 6番 |
7番 | 8番 | 9番 |
Range("A1").Delete
とすると、4番・7番が上に繰り上がります。
Range("A1").Delete xlShiftUp
としても同じように4番・7番が繰り上がります。
Range("A1").Delete xlShiftToLeft
とすれば、2番・3番が左にずれてきます。
Deleteメソッドのパラメータに指定されている xlShiftToLeft(整数値 -4159), xlShiftUp(整数値 -4162)は、あらかじめ整数の値がセットされている定数です。
このどちらかを指定することにより、削除後のずれ方を明確に指示することができます。
しかし、わざわざ長い定数名を書くのは面倒です。そこで、定数を指定しない場合の挙動をもう少し見てみましょう。
定数の指定を省略した時の挙動には次のルールがあります。仮に、各々のセルが正方形であるとイメージしてお読み下さい。
1番目と2番目のルールは、直感に合致するのではないかと思います。
3番目のルールは覚えておくしかないでしょうか。
削除するセルが1個だけのケースは、3番目の正方形の場合に該当します。
3×3のデータ(電話機の数字ボタン)を書き込んでから、セルの削除を行うというパターンを4通り実行します。
A1:C3、A5:C7、それから A9:C11、そして A13:C15の領域に3×3のデータを書き込みます。
PutData() というサブプロシージャは、3×3のデータを書き込むものです。
パラメータで渡された数値を行番号とみなして、その行以降に3×3のデータを書き込みます。
Macro1というプロシージャの中で、まずはPutDataを呼び出すてデータを書き込み、それからセルの削除を行っています。その作業を4回行います。
Sub Macro1()
Call PutData(1)
Range("A1").Delete ' 1個だけ削除:上に繰り上がり
Call PutData(5)
Range("A5").Delete xlShiftToLeft ' 1個だけ削除:左シフトを指示
Call PutData(9)
Range("A9:A10").Delete ' 縦長を削除:左にシフト
Call PutData(13)
Range("A13:B13").Delete ' 横長を削除:上に繰り上がり
End Sub
Sub PutData(i As Integer)
Range(Cells(i,1), Cells(i,3)).Value = Array("1番","2番","3番")
Range(Cells(i+1,1), Cells(i+1,3)).Value = Array("4番","5番","6番")
Range(Cells(i+2,1), Cells(i+2,3)).Value = Array("7番","8番","9番")
End Sub
PutDataを呼び出すのに Call を使っていますが、Callを用いずに単に PutData 1
のように書いてもかまいません。
サブプロシージャを呼び出していることが分かりやすくなるかと思って Call を使ってみたものです。
先のマクロと同じ処理を行うVBScriptを掲げます。
大半はVBAのマクロと類似ですが、PutDataというサブプロシージャのパラメータとしてワークシートオブジェクト(WSobj)も渡すようになっています。マクロと違って行番号だけという訳にはいきません。
「アクティブシートを暗黙の前提にする」というのが通用しないため、明示的にWSobjを渡します。
1Option Explicit 2Dim FSO, BookPath 3Dim EXLapp, WBobj, WSobj 4Const xlWorkbookNormal = -4143 5Const xlShiftToLeft = -4159 6Const xlShiftUp = -4162 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 15 Call PutData(WSobj, 1) 16WSobj.Range("A1").Delete ' 1個だけ削除:上に繰り上がり 17 Call PutData(WSobj, 5) 18WSobj.Range("A5").Delete xlShiftToLeft ' 1個だけ削除:左シフトを指示 19 Call PutData(WSobj, 9) 20WSobj.Range("A9:A10").Delete ' 縦長を削除:左にシフト 21 Call PutData(WSobj, 13) 22WSobj.Range("A13:B13").Delete ' 横長を削除:上に繰り上がり 23WBobj.SaveAs BookPath, xlWorkbookNormal 24EXLapp.quit 25 26Sub PutData(WSobj, Ri) 27 With WSobj 28 .Range(.Cells(Ri,1), .Cells(Ri,3)).Value = _ 29 Array("1番", "2番", "3番") 30 .Range(.Cells(Ri+1,1), .Cells(Ri+1,3)).Value = _ 31 Array("4番", "5番", "6番") 32 .Range(.Cells(Ri+2,1), .Cells(Ri+2,3)).Value = _ 33 Array("7番", "8番", "9番") 34 End With 35End Sub
サブプロシージャの PutData を呼び出すのに、マクロのときと同じように Call を使っています。
Callを使わない場合は、括弧を外して PutData WSobj, 1
のようにします。括弧をつけるとエラーになるようです。
〜 以上 〜