和風スパゲティのレシピ

日本語でコーディングするExcelVBA

アクティブシートを変えずにシートを追加・コピーする

アクティブシートを変えずに、シートを追加・コピー・移動する方法を解説します。


シートの追加・コピー・移動をそれぞれ行うAdd/Copy/Moveメソッドは、
完了後に出来上がったシートをアクティブにする性質があります。


この性質を利用し、

Worksheets("○○テンプレート").Copy
ActiveSheet.Name = "○○_△△"

とアクティブシートをそのまま編集したり、
 

Worksheets("○○テンプレート").Copy

Dim 作成シート As Worksheet
Set 作成シート = ActiveSheet

作成シート.Name = "○○_△△"
作成シート.Cells(1, 1) = 1

と、アクティブシートを変数にSetして、その後の処理を書いたりします。


これはこれで便利なのですが、
(というかこうしないと出来上がったシートを取得できない)

実務では、「今のアクティブシートを変えたくない」ということもあります。


この方法ですが、アクティブシートを全く変えることなくメソッドを実行する方法はありませんので、以下のコードで地道に達成します。

Dim 元のアクティブシート As Worksheet
Set 元のアクティブシート = ActiveSheet

Worksheets("○○テンプレート").Copy

Dim 作成シート As Worksheet
Set 作成シート = ActiveSheet

元のアクティブシート.Activate

作成シート.Name = "○○_△△"
作成シート.Cells(1, 1) = 1

 
コードを読んだ通りですが、

  1. 今アクティブのシートを変数に記憶しておく
  2. コピーを実行
  3. コピー後にアクティブになったシートを2個目の変数に記憶しておく
  4. 元のアクティブシートをアクティブに戻す
  5. 2個目の変数に記憶していたコピーシートへ処理を書いていく

という流れで処理を行っていきます。

これで見かけ上は、処理開始時のシートが終了時にもアクティブになっていますね。


なお、「処理している間はコピーシートをアクティブにしておき、処理が終わってから元のアクティブシートに戻したい」場合は、

元のアクティブシート.Activate

この部分を、マクロの一番下に移動すればOKです。

おまけ:慣れるまでは丁寧な変数名に

上のコードをプログラマっぽくかっこつけて書くと、

Dim tmp As Worksheet
Set tmp = ActiveSheet

Worksheets("○○テンプレート").Copy

Dim ws As Worksheet
Set ws = ActiveSheet

tmp.Activate

ws.Name = "○○_△△"
ws.Cells(1, 1) = 1

こうなります。
変数名を変えただけですね。


tmpとは、temporaryの略で、「一時的な」という意味です。

カウンタに使う「i」とかと同じ、プログラミングの文化的な変数名です。


個人的には、このシート変数が一時的であることは「手段」であり、
「目的」に関する記述が無いという点で、この名づけは好ましくないと思います。

読み手に「何を一時保管したのか」は伝わりませんからね。


コードを読めばわかるレベルの上級者同士で、
プログラミングの文化的、暗黙の了解的な意思疎通が取れるなら、
サッと書けていい変数名ということはありますが。


特に注意したいのが、

' 元のアクティブシートを記憶
Dim tmp As Worksheet
Set tmp = ActiveSheet

みたいに書いてしまうことです。

tmpをコメントで説明するくらいなら、変数名に説明させた方が良いです。

そもそもこれだと、サッと書けてませんしね。


と、ここで解説に使ったコードをもう一度。

Dim 元のアクティブシート As Worksheet
Set 元のアクティブシート = ActiveSheet

Worksheets("○○テンプレート").Copy

Dim 作成シート As Worksheet
Set 作成シート = ActiveSheet

元のアクティブシート.Activate

作成シート.Name = "○○_△△"
作成シート.Cells(1, 1) = 1

わかりやすいですよね。ノーコメントなのに。


プログラムは書く時間よりも読む時間、書き替える時間の方が長く、
そして苦戦します。

よって、変数名はサボらず丁寧に書いた方が、トータルでは時間短縮になります。


別に日本語変数が嫌いなら、PrevActShとかでもいいのです。

何か意図をもって作る変数は、名前に意図を反映してあげましょう


ロジックを明確にして変数を扱えるようになるので、
コーデイングの上達が早くなると思いますよ(´∀`)