2016/04/02
参考サイト: Excel VBA 入門講座 ワークシートの追加
ワークシートの追加は Worksheets.Add
で行います。これを実行すると、アクティブシートの前に新しいワークシートが挿入されます。そして、その新しいワークシートがアクティブシートになります。
新規のワークブックでは、Sheet1, Sheet2, Sheet3 の三つのワークシートがあり、Sheet1 がアクティブシートになっています。
その状態で Worksheets.Add
を実行すると、Sheet1 の前に新しいワークシートが作られます。結果、Sheet1 は第2ワークシートになります。
新しいワークシート(第1ワークシート)の名前は Sheet4 です。自動的にそのワークシート名が割り当てられます。
Worksheets.Add
では四つのオプションを指定することができます。Before, After, Count, Type です。
Worksheets.Add Before:=Worksheets("Sheet3")
とすれば、Sheet3 の前に新しいワークシートが挿入されます。
Worksheets.Add After:=Worksheets("Sheet3")
とすれば、Sheet3 の後に新しいワークシートが追加されます。
Worksheets.Add Count:=3
とすれば、アクティブシートの前に新しいワークシートが3枚挿入されます。3枚のワークシートの3番目のシートがアクティブシートになります。
また、Worksheets.Add After:=Worksheets("Sheet3"), Count:=3
とすれば、Sheet3 の後に新しいワークシートが3枚追加されます。つまり Sheet4, Sheet5, Sheet6 が追加されます。そして、Sheet6 がアクティブシートになります。
オプションのTypeは、ワークシートのタイプを指定するためのものです。通常のワークシートを挿入するのなら省略です。チャートのシートとかダイアログシートを挿入したい時に指定します。
「概要」で述べてきた事柄をVBAマクロとして登録するためのスクリプトを掲げます。
これまでと同様に、マクロには Control + j
というショートカットキーを割り当てます。
ワークシートを追加したら、その新設されてアクティブシートになったところのA1セルに、実行されたVBAのコードを書き込みます。新設の要因となったコードを記す訳です。
1# encoding: Windows-31J 2require "./exlap" 3 4macro_str = <<'EOS' 5Sub Macro1() 6 Worksheets(1).Activate 7 Worksheets.Add 8 Range("A1").Value = "Worksheets.Add" 9 Worksheets.Add Before:=Worksheets("Sheet3") 10 Range("A1").Value = "Worksheets.Add Before:=Worksheets(""Sheet3"")" 11 Worksheets.Add After:=Worksheets("Sheet3"), Count:=3 12 Range("A1").Value = "Worksheets.Add After:=" & _ 13 "Worksheets(""Sheet3""), Count:=3" 14End Sub 15EOS 16 17macro_name = "Macro1" 18File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 19Exlap.new("Book1.xls") do |wb| 20 wb.macro_add(macro_str) 21 wb.Application.MacroOptions("Macro"=>macro_name, "ShortcutKey"=>"j") 22 wb.save 23end
VBAの文字列表現について補足します。VBAに慣れている人には言わずもがなでしょうが、ruby利用者には注意が必要な点です。
まず、文字列の連結ですが、VBAでは半角の ‘&’ を用います。rubyでは ‘+’ です。
VBAでは "abc" & "xyz"
のように書きます。rubyだと "abc" + "xyz"
です。
次に、引用符 ‘”’ の使い方です。引用符を文字列中に含めたい場合、VBAでは ""abc""
のように引用符を2重にします。これが "abc"
という5文字の文字列になります。
一方、rubyでは円マーク ‘\’ を特殊文字として用い、"\"abc\""
のように書きます。引用符の中では ‘\”’ が引用符を表します。
前述のマクロと同じ処理を行うwin32oleのスクリプトは下のようになります。
1# encoding: Windows-31J 2require "win32ole" 3 4def fullpath(filename) 5 fso = WIN32OLE.new("Scripting.FileSystemObject") 6 return fso.GetAbsolutePathName(filename) 7end 8 9File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 10app = WIN32OLE.new("Excel.Application") 11wb = app.Workbooks.Add() 12wb.Worksheets(1).Activate 13ws = wb.Worksheets.Add 14ws.Range("A1").Value = "Worksheets.Add" 15ws = wb.Worksheets.Add("Before"=>wb.Worksheets("Sheet3")) 16ws.Range("A1").Value = "Worksheets.Add Before:=Worksheets(\"Sheet3\")" 17ws = wb.Worksheets.Add("After"=>wb.Worksheets("Sheet3"), "Count"=>3) 18ws.Range("A1").Value = "Worksheets.Add After:=" + 19 "Worksheets(\"Sheet3\"), Count:=3" 20wb.SaveAs(fullpath("Book1"), -4143) 21app.Quit
ほとんどはVBAマクロと共通ですが、ワークシートを追加する Worksheets.Add
の戻り値を変数 ws に代入している点が異なるでしょうか。
Addメソッドは、戻り値として新設されたワークシートオブジェクトを返します。複数のワークシートを追加した場合は、新設の最後のワークシートオブジェクトを返します。
VBAマクロでは、Addメソッドの戻り値がアクティブシートになるので、それを受け止めて変数に代入しなくても大丈夫でした。
しかし、rubyでは「暗黙のうちにアクティブシートを前提にする」といったことが通用しないので、Addメソッドの戻り値を変数に代入する必要があります。
同じ処理を行うexlapのスクリプトを掲げます。
基本的には win32のスクリプトと同じですが、ちょっとだけexlap独自のメソッドもあります。
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 wb.ss(1).Activate 7 ws = wb.Worksheets.Add 8 ws.Range("A1").Value = "Worksheets.Add" 9 ws = wb.insert_sheet("Sheet3") 10 ws.Range("A1").Value = "wb.insert_sheet(\"Sheet3\")" 11 ws = wb.Worksheets.Add("After"=>wb.Worksheets("Sheet3"), "Count"=>3) 12 ws.Range("A1").Value = "Worksheets.Add After:=" + 13 "Worksheets(\"Sheet3\"), Count:=3" 14 wb.save 15end
wb.insert_sheet("Sheet3")
というのは、Sheet3の前にワークシートを1枚挿入するものです。insert_sheet() は exlap独自のメソッドです。引数に 3 などの整数値を与えることもできます。
この他、ワークシート追加の関連では wb.add_sheet
というのもあります。ワークブックの最後に新しいワークシート1枚を追加します。