【初心者向けエクセルVBA】ワークシートをコピーする方法とそのシート名を変更する方法


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者向けにエクセルVBAで請求データ一覧から請求書を作成するマクロの作り方についてお伝えしています。

前回の記事はこちら。

【初心者向けエクセルVBA】日付データから月末日と翌月末日を自動算出する
初心者向けエクセルVBAのシリーズとして請求データから請求書を作るマクロの作り方についてお伝えしています。 今回はDateSerial関数を使って月末日または翌月末日を自動算出する方法についてお伝えします。

日付データから月末を求める方法についてお伝えしました。

さて、今回ですがちょっと新展開です。

というのも、一般的に請求書を作るのは複数の取引先であるべきです。

が、これまでは単一の取引先を想定して請求書の作り方をお伝えしてきましたので、その点をパワーアップしていきたいと思います。

まず、今回は「請求書ひな形」シートをコピーして取引先分のシートを作成することを目指していきます。

エクセルVBAでワークシートをコピーする方法とそのシート名を変更する方法です。

なお、この記事は以下のYouTube動画と連動していますので、合わせてご覧くださいませ。

では、行ってみましょう!

スポンサーリンク

今回のお題:取引先ごとに別のシートを複製したい

まず、今回やりたいことについて説明をしておきます。

いくつかのシートがありまして、まず一つ目は、以下の取引先別の請求データを一覧にしている「請求データ」シートです。オブジェクト名はwsDataとしています。

エクセルVBAで操作する請求データシート

次に、取引先ごとの情報を記録している「取引先マスタ」シート、オブジェクト名はwsClientです。

エクセルVBAで操作する取引先マスタシート

そして、最終的に作成する請求書のひな形となる「請求書ひな形」シート、オブジェクト名はwsTemplateとしています。

エクセルVBAで操作する請求書ひな形シート

マクロとして組みたい処理は、文章で説明すると

  • 取引先別に請求書を作りたい。その場合のテンプレートとして「請求書ひな形」シートを使う
  • それらの請求書には「請求データ」シートから該当の取引先のもののみを抽出して転記する

というような処理にあります。

前回までのマクロを参考にするにしても、いくつかの新しいテクニックを使う必要がありますので、順を追って解説をしていきます。

「請求書ひな形」シートをコピーして取引先ごとのシートを作成する

まず今回は、「請求書ひな形」シートをコピーして、取引先分のシートを作成することを目標にしていきます。

ベースとプログラムとして、一部コメントによる説明となっていますが、以下のようなプログラムを用意しました。

Sub 取引先ごとのシートをコピー()

Dim rowsClient As Long
rowsClient = wsClient.Cells(Rows.Count, 1).End(xlUp).Row '取引先マスタの最終行数

Dim n As Long
For n = 2 To rowsClient
    
    Dim client As String
    client = wsClient.Cells(n, 1).Value
    'wsTemplateをコピーする
    'コピーして作成したシート名をclientとする
    
Next n
End Sub

4行目で「取引先マスタ」シートの行数を確認していて、これは7行目のFor文の最終値として使用します。

そのFor文内ですが、10行目で取引先名を変数clientに格納します。

その後「請求書ひな形」シートをコピーして、そのシートのシート名をclientとすれば、今回の目標は達成です。

Copyメソッドでワークシートをコピーする

まず、ワークシートをコピーですが、Copyメソッドを使います。

Worksheetオブジェクト.Copy

任意ですが、引数として以下を指定することができます。

  • Before:指定したWorksheetオブジェクトの前にコピーしたシートを挿入する
  • After:指定したWorksheetオブジェクトの後にコピーしたシートを挿入する

今回は、Afterを使って、11行目を以下のようにしましょう。

wsTemplate.Copy After:=wsTemplate

これで、「請求書ひな形」シートをその直後にコピーすることができます。

Nameプロパティでワークシートの名前を取得する

ワークシートの名前を取得するには、Nameプロパティを使います。

書き方はこちらです。

Worksheetオブジェクト.Name

前述のプログラムでいうと、12行目は以下のようにしてあげれば、ワークシートのシート名を変数clientに変更することができます。

Worksheetオブジェクト.Name = client

ただ、Worksheetオブジェクトはコピー元のwsTemplateとは別のワークシートオブジェクトになりますよね。

「コピーしたワークシート」って、どのように取得すればよいでしょうか?

Activesheetプロパティでアクティブなワークシートを取得する

そんな時に便利なのが、Activesheetプロパティです。

Acitvesheetプロパティは、その名の通りアクティブなシートを取得するプロパティです。

本来は、Applicationオブジェクトのメンバーなのですが、Applicationオブジェクトは省略可能なので、一般的に

Activesheet

とだけ記述すれば、アクティブなシートを取得することができます。

なんで、Activesheetプロパティが使えるかというと、コピーして新たに生成されたシートはその時点ではアクティブになるのです。

だから、コピーした瞬間にアクティブなシートをつかんでしまえば、それがコピーしたワークシートになります。

ですから、12行目を完成させると以下のようになります。

ActiveSheet.Name = client

ワークシートのコピーを実行する

まとめると、以下のようなプロシージャになります。

Sub 取引先ごとのシートをコピー()

Dim rowsClient As Long
rowsClient = wsClient.Cells(Rows.Count, 1).End(xlUp).Row '取引先マスタの最終行数

Dim n As Long
For n = 2 To rowsClient
    
    Dim client As String
    client = wsClient.Cells(n, 1).Value
    wsTemplate.Copy After:=wsTemplate
    ActiveSheet.Name = client
    
Next n
End Sub

実行してみましょう。

エクセルVBAでワークシートをコピーしてシート名を変更した

このように、取引先別のシートをコピーして生成することができました。

まとめ

以上、エクセルVBAでワークシートをコピーしてそのシート名を変更する方法についてお伝えしました。

  • WorksheetオブジェクトをコピーするCopyメソッド
  • Worksheetオブジェクトの名前を取得するNameプロパティ
  • アクティブなシートを取得するActivesheetプロパティ

など、何も非常に重要なテクニックについてお伝えしていますので、ぜひマスターしておいてください。

次回は、オブジェクト変数とSetステートメントについてお伝えします。

【初心者向けエクセルVBA】オブジェクトを変数にセットして取り扱う方法
初心者向けエクセルVBAのシリーズとして請求データから請求書を作成するマクロの作り方をお伝えしています。 今回はWorksheetオブジェクトを変数にセットして取り扱う方法についてお伝えします。

どうぞ楽しみに!

連載目次:データ一覧から請求書を自動で作る

お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。
  1. 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
  2. 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
  3. 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
  4. 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
  5. 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
  6. 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
  7. 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
  8. 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
  9. 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
  10. 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
  11. 【初心者向けエクセルVBA】For~Next文でセル範囲を一行ずつ移動させる
  12. 【初心者向けエクセルVBA】セル範囲のクリア~ClearContentsメソッドとClearメソッド
  13. 【初心者向けエクセルVBA】ワークシート・セルを選択する方法の色々について
  14. 【初心者向けエクセルVBA】入力ダイアログを表示するInputBoxメソッドの使い方
  15. 【初心者向けエクセルVBA】日付データから月末日と翌月末日を自動算出する
  16. 【初心者向けエクセルVBA】ワークシートをコピーする方法とそのシート名を変更する方法
  17. 【初心者向けエクセルVBA】オブジェクトを変数にセットして取り扱う方法
  18. 【初心者向けエクセルVBA】Openメソッドで新たなブックを開く方法
  19. 【初心者向けエクセルVBA】現在マクロを書いているブックのフォルダパスを取得する
  20. 【初心者向けエクセルVBA】開いたブックとそのワークシートをオブジェクト変数にセットする
  21. 【初心者向けエクセルVBA】ワークブックを別名で保存して閉じる方法
  22. 【初心者向けエクセルVBA】取引先別に請求書を作成するマクロを作る

コメント

  1. 小川  より:

    たいへん わかりやすくて、楽しく勉強させて頂いてます。
    実務で使えるVBAだと思います。

    8.【初心者向けエクセルVBA】Worksheetのコピーを活用して複数の請求書を作る
    「おさらい」のサンプルをコピペして動作確認したら、変数nの値がゼロでした。
    バグ探しで大変勉強になりました。ありがとうございます。
    これからも、もっともっと多くのサンプルを載せてほしいです。
    ———————————————————– 

    Sub 請求書作成()

    Dim i, j, k, n As Long ‘For~Nextカウント用整数型変数
    Dim dayData As Date ‘納品日格納用変数
    Dim dayCutoff As Date ‘締月入力用変数
    Dim strClient As String ‘取引先格納用変数
    ‘————————————————————–
    Call シート初期化  ’<=ここにも入れないと動きません。
              ’ ↓rowsClientに値が設定されていませんから
    ‘————————————————————–
    dayCutoff = InputBox(“締月を入力してください(例:2015/5)”)

    For n = 2 To rowsClient

     Call シート初期化

    wsInvoice.Copy after:=wsInvoice ‘請求書ひな形シートを右隣りにコピーする
    ‘——————————————————————————
    ‘ n の値が0でした。
    —————– =====
    ActiveSheet.Name = wsClient.Cells(n, 1).Value ‘シート名を取引先名に変更する
    ‘———————————-====————————————–
    Set wsInvoice = ActiveSheet ’※シートコピーをすると新たにできたシートがアクティブ

    • コメントありがとうございます!
      確かにおっしゃる通りでしたね…ご指摘助かります。
      本文修正いたしました。

      今後ともどうぞよろしくお願いいたします!

タイトルとURLをコピーしました