アクティブシートを変えずに、シートを追加・コピー・移動する方法を解説します。
シートの追加・コピー・移動をそれぞれ行う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
コードを読んだ通りですが、
- 今アクティブのシートを変数に記憶しておく
- コピーを実行
- コピー後にアクティブになったシートを2個目の変数に記憶しておく
- 元のアクティブシートをアクティブに戻す
- 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とかでもいいのです。
何か意図をもって作る変数は、名前に意図を反映してあげましょう。
ロジックを明確にして変数を扱えるようになるので、
コーデイングの上達が早くなると思いますよ(´∀`)