セルの削除

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

2016/08/13

セルの削除(Delete)を取り上げます。

サブプロシージャを定義して、その呼び出しを行う例を含みます。

△ 関連の Program Page


《このページの目次》


    

1. 概要

 セルを削除するには 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番」と「7番」が上に繰り上がるパターン
4番 2番 3番
7番 5番 6番
8番 9番
○ 右側にある「2番」と「3番」が左にずれるパターン
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番目の正方形の場合に該当します。

目次に戻る


    

2. マクロ

 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 を使ってみたものです。

目次に戻る


    

3. OLEを利用するVBScript

 先のマクロと同じ処理を行うVBScriptを掲げます。

 大半はVBAのマクロと類似ですが、PutDataというサブプロシージャのパラメータとしてワークシートオブジェクト(WSobj)も渡すようになっています。マクロと違って行番号だけという訳にはいきません。

 「アクティブシートを暗黙の前提にする」というのが通用しないため、明示的にWSobjを渡します。

    

△ vovXL05.vbs

 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 のようにします。括弧をつけるとエラーになるようです。

〜 以上 〜