ワークシートのコピー – ExcelVBAの散策とruby

2016/04/09

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


《目次》


1. 概要

 ワークシートのコピーは、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 を使うことはあまりないと思いますが、念のため。

目次に戻る


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

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

目次に戻る


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").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

    

目次に戻る


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").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

前のページ:ワークシートの移動

次のページ:ワークシートの削除

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