セルの挿入 – ExcelVBAの散策とruby

2016/03/26

参考サイト:  Excel VBA 入門講座 セルの挿入


《目次》


1. 概要

 セルを挿入するには 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メソッドの場合と類似のルールといえます。

目次に戻る


2. マクロを登録するスクリプト

 「概要」で述べてきた事柄を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

目次に戻る


3. win32oleのスクリプト

 前述のマクロと同じ処理を行う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マクロの部分は、ほぼそのまま取り入れています。特別の変更・工夫はしていません。

目次に戻る


4. exlapのスクリプト

 同じ処理を行う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

前のページ:セルのクリア

次のページ:セルの別の箇所への複写

「ExcelVBAの散策とruby」トップページ