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