2016/04/09
参考サイト: Excel VBA 入門講座 ワークシートの移動
ワークシートの移動(順序の入れ替え)は、Moveメソッドで行います。ターゲットのワークシートをどこに移動させるかは、Moveメソッドの Before または After パラメータで指示します。
アクティブシートを Sheet3 の前に移動したい時は下のとおり。
ActiveSheet.Move Before:=Worksheets("Sheet3")
Sheet2をSheet3の後ろに移動したい時は次のようにします。
Worksheets("Sheet2").Move After:=Worksheets("Sheet3")
上を実行すると、結果、アクティブシートは Sheet2 になります。
Moveメソッドの戻り値は True, False のどちらかです。移動に成功した時は True を返します。
Moveは、Addメソッドのようにワークシートオブジェクトを返す訳ではありません。
Moveメソッで Before, After のどちらのパラメータも指定しない場合は、ターゲットのワークシートが別のワークブックに移動するようです。別のワークブックというのは、新しく設けられるワークブックです。
Worksheets("Sheet2").Move
とすれば、Sheet2が消えてしまいます。
といっても、完全に失われてしまう訳ではなく、新規のワークブックが設けられて、そちらに Sheet2 が移動します。
その新しいワークブックにはワークシートが1枚しかありません。
また、新しいワークブックには名前がないので、保存するなら何か名前を指定する必要があります。
パラメータなしで Move を使うことはあまりないと思いますが、念のため記しました。
「概要」で述べてきた事柄をVBAマクロとして登録するためのスクリプトを掲げます。
これまでと同様に、マクロには Control + j
というショートカットキーを割り当てます。
Worksheets.Add
を実行すると、Sheet1の前にSheet4が追加されます。そのSheet4をSheet3の後ろに移動します。
最後に、アクティブシートのA1セルにそのワークシート名を書き込みます。
1# encoding: Windows-31J 2require "./exlap" 3 4macro_str = <<'EOS' 5Sub Macro1() 6 Worksheets.Add 7 Worksheets("Sheet4").Move After:=Worksheets("Sheet3") 8 Range("A1").Value = ActiveSheet.Name 9End Sub 10EOS 11 12macro_name = "Macro1" 13File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 14Exlap.new("Book1.xls") do |wb| 15 wb.macro_add(macro_str) 16 wb.Application.MacroOptions("Macro"=>macro_name, "ShortcutKey"=>"j") 17 wb.save 18end
前述のマクロと同じ処理を行う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.Add 13wb.Worksheets("Sheet4").Move("After"=>wb.Worksheets("Sheet3")) 14ws = wb.ActiveSheet 15ws.Range("A1").Value = ws.Name 16wb.SaveAs(fullpath("Book1"), -4143) 17app.Quit
VBAマクロをほぼそのままrubyに置き換えた形になっています。
同じ処理を行うexlapのスクリプトを掲げます。
基本的に win32oleのスクリプトと同じです。
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.Worksheets.Add 7 wb.Worksheets("Sheet4").Move("After"=>wb.Worksheets("Sheet3")) 8 ws = wb.ActiveSheet 9 ws.Range("A1").Value = ws.Name 10 wb.save 11end