ワークシートの移動 – ExcelVBAの散策とruby

2016/04/09

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


《目次》


1. 概要

 ワークシートの移動(順序の入れ替え)は、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 を使うことはあまりないと思いますが、念のため記しました。

目次に戻る


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

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

目次に戻る


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.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に置き換えた形になっています。

目次に戻る


4. exlapのスクリプト

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

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

次のページ:ワークシートのコピー

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