2016/03/26
参考サイト: Excel VBA 入門講座 セルの挿入
セルを挿入するには Insertメソッドを使います。指定したセル範囲に空白のセルを挿入します。
元々そこにあったセルは、下側か右側にずれます。印象としては、隙間をこじ開けるといった感じです。
Range("A2").EntireRow.Insert
とすれば、第2行目に空白行が設けられます。それまで第2行目だったものは第3行目になります。
Range("A2:A3").EntireRow.Insert
とした場合は、第2行目と第3行目に空白行が設けられます。既存の行は2行分だけ下側にシフトします。
Range("C1").EntireColumn.Insert
とすれば第3列目に空白列が挿入されます。それまで第3列だったものは第4列に移動します。
では、A1セル1個だけを挿入した時はどうなるでしょうか。
具体的なイメージとして、A1:D4の4×4のセル範囲において、どのセルにも test という文字が書き込まれているものとします。
Range("A1").Insert
とすればA1に空白セルを挿入することになりますが、その場合、縦のラインA1:A4が1個分だけ下側にずれてA2:A5に移動します。
Range("A1").Insert xlShiftToRight
とした時は、横のラインA1:D1が右側にずれてB1:E1に移動します。
Insertメソッドのパラメータは次の二つです。
このどちらかを指定することにより、挿入後のずれ方を明確に指示することができます。
しかし、わざわざ長い定数名を書くのは面倒です。そこで、定数を指定しない場合の挙動をもう少し見てみましょう。
定数の指定を省略した時の挙動には次のルールがあります。仮に、各々のセルが正方形であるとイメージしてお読み下さい。
1番目と2番目のルールは、直感に合致するのではないかと思います。
3番目のルールは覚えておくしかないでしょうか。
セルを削除する Deleteメソッドの場合と類似のルールといえます。
「概要」で述べてきた事柄をVBAマクロとして登録するためのスクリプトを掲げます。
これまでと同様に、マクロには Control + j
というショートカットキーを割り当てます。
4×4の16個のセルを一つの組と見立てて、それに挿入の操作を加えます。
4×4の組を、一つのワークシートに四つ設けます。田形に配置。具体的には A1:D4, A11:D14, K1:N4, K11:N14 です。
それぞれの組に対して異なる挿入操作を施します。
1# encoding: Windows-31J 2require "./exlap" 3 4macro_str = <<'EOS' 5Sub TestInsert() 6 ActiveSheet.UsedRange.Clear 7 Range("A1:D4").Value = "test" 8 Range("A1").Insert ' 1個だけ挿入:下に移動 9 Range("A11:D14").Value = "test" 10 Range("A11").Insert xlShiftToRight ' 1個だけ挿入:右シフトを指示 11 Range("K1:N4").Value = "test" 12 Range("K1:K2").Insert ' 縦長を挿入:右にシフト 13 Range("K11:N14").Value = "test" 14 Range("K11:L11").Insert ' 横長を挿入:下にシフト 15End Sub 16EOS 17 18macro_name = "TestInsert" 19File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 20Exlap.new("Book1.xls") do |wb| 21 wb.macro_add(macro_str) 22 wb.Application.MacroOptions("Macro"=>macro_name, "ShortcutKey"=>"j") 23 wb.save 24end
前述のマクロと同じ処理を行うwin32oleのスクリプトは下のようになります。
1# encoding: Windows-31J 2require "win32ole" 3 4def fullpath(filename) 5 fso = WIN32OLE.new("Scripting.FileSystemObject") 6 return fso.GetAbsolutePathName(filename) 7end 8 9module XlConstant 10end 11include XlConstant 12 13File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 14app = WIN32OLE.new("Excel.Application") 15WIN32OLE.const_load(app, XlConstant) 16wb = app.Workbooks.Add() 17ws = wb.Worksheets("Sheet1") 18ws.Range("A1:D4").Value = "test" 19ws.Range("A1").Insert # 1個だけ挿入:下に移動 20ws.Range("A11:D14").Value = "test" 21ws.Range("A11").Insert(XlShiftToRight) # 1個だけ挿入:右シフトを指示 22ws.Range("K1:N4").Value = "test" 23ws.Range("K1:K2").Insert # 縦長を挿入:右にシフト 24ws.Range("K11:N14").Value = "test" 25ws.Range("K11:L11").Insert # 横長を挿入:下にシフト 26wb.SaveAs(fullpath("Book1"), XlWorkbookNormal) 27app.Quit
VBAマクロの部分は、ほぼそのまま取り入れています。特別の変更・工夫はしていません。
同じ処理を行うexlapのスクリプトを掲げます。
中核部分は win32のスクリプトと同じです。
1# encoding: Windows-31J 2require "./exlap" 3 4File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 5Exlap.new("Book1.xls") do |wb| 6 ws = wb.ss("Sheet1") 7 ws.Range("A1:D4").Value = "test" 8 ws.Range("A1").Insert # 1個だけ挿入:下に移動 9 ws.Range("A11:D14").Value = "test" 10 ws.Range("A11").Insert(XlShiftToRight) # 1個だけ挿入:右シフトを指示 11 ws.Range("K1:N4").Value = "test" 12 ws.Range("K1:K2").Insert # 縦長を挿入:右にシフト 13 ws.Range("K11:N14").Value = "test" 14 ws.Range("K11:L11").Insert # 横長を挿入:下にシフト 15 wb.save 16end