ワークシートの追加 – ExcelVBAの散策とruby

2016/04/02

参考サイト:  Excel VBA 入門講座 ワークシートの追加


《目次》


1. 概要

 ワークシートの追加は 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は、ワークシートのタイプを指定するためのものです。通常のワークシートを挿入するのなら省略です。チャートのシートとかダイアログシートを挿入したい時に指定します。

目次に戻る


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

 「概要」で述べてきた事柄を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とrubyの文字列の記述法の違い

 VBAの文字列表現について補足します。VBAに慣れている人には言わずもがなでしょうが、ruby利用者には注意が必要な点です。

 まず、文字列の連結ですが、VBAでは半角の ‘&’ を用います。rubyでは ‘+’ です。

 VBAでは "abc" & "xyz" のように書きます。rubyだと "abc" + "xyz" です。

 次に、引用符 ‘”’ の使い方です。引用符を文字列中に含めたい場合、VBAでは ""abc"" のように引用符を2重にします。これが "abc" という5文字の文字列になります。

 一方、rubyでは円マーク ‘\’ を特殊文字として用い、"\"abc\"" のように書きます。引用符の中では ‘\”’ が引用符を表します。

目次に戻る


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
 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メソッドの戻り値を変数に代入する必要があります。

目次に戻る


4. exlapのスクリプト

 同じ処理を行う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枚を追加します。


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

次のページ:ワークシートの名前の変更

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