データベースからデータを抽出したり、集計ツールを作成していたりすると、実行する毎に新しいシートで結果を出力したりするのですが、「Sheet○」の連番では味気ないので抽出条件の日付をシート名にしたい時があります。そのままではシート名が重複することが多々ありますので、シート名に連番を追加する処理を紹介します。
概要
紹介するコードは、シート名を変更する際に、同じシート名が存在するかチェックし、存在する場合は次の連番を振る処理を行います。
サンプルコードではシート名を「hogehoge」とした場合、「hogehoge_1」「hogehoge_2」「hogehoge_3」と出力します。
同じシート名を出力する必要があったり、同じシート名が出力される可能性があるときに便利な方法です。
実行環境
- Windows 11 pro
- Excel for Microsoft 365
- その他
- コマンドボタンをシート上に追加し、名前を「CommandButton1」としています。
サンプルコード
CommonMethods クラス
Option Explicit private Function ExistsSheet(name As String) As Boolean Dim sheet As Worksheet Dim exists As Boolean exists = False For Each sheet In Worksheets If sheet.name = name Then exists = True Exit For End If Next ExistsSheet = exists End Function Public Function GetUniqueSheetName(name As String) As String Dim uniqueName As String Dim Number As Long Number = 1 Do If ExistsSheet(name & "_" & Number) = False Then uniqueName = name & "_" & Number Exit Do End If Number = Number + 1 Loop GetUniqueSheetName = uniqueName End Function
CommonMethods クラスを利用したサンプルコード
Option Explicit Private methods As New CommonMethods Private Sub CommandButton1_Click() Dim count As Long count = 10 Dim sheet As Excel.Worksheet Dim i As Long For i = 0 To count Set sheet = Worksheets.Add(after:=Worksheets(Worksheets.count)) sheet.name = methods.GetUniqueSheetName("hogehoge") Next i End Sub
詳細
サンプルコードではクラスモジュールにコードを記載しています。
普段私はVBA でよく使用する機能を「CommonMethods」クラスにまとめているので、このサンプルコードもそのようにしています。お使いの環境に合わせて記述する場所を変更してください。
以下のコードは受け取ったシート名の存在確認を行うコードです。
受け取ったシート名が存在すれば True を返し、存在しなければ Falseを返します。
For Each ですべてのワークシートを網羅しています。途中で同じシート名があれば Exit For で処理を終了しています。
private Function ExistsSheet(name As String) As Boolean Dim sheet As Worksheet Dim exists As Boolean exists = False For Each sheet In Worksheets If sheet.name = name Then exists = True Exit For End If Next ExistsSheet = exists End Function
以下のコードは受け取ったシート名に連番を追加するコードです。
シート名の形式は「シート名_連番」になります。
ExistsSheet プロシージャで「シート名_連番」シートの存在を確認し、False が返ってくるまでこの処理をループします。False が返ってきたら重複しなかったシート名を「シート名_連番」の形式で返します。
Public Function GetUniqueSheetName(name As String) As String Dim uniqueName As String Dim Number As Long Number = 1 Do If ExistsSheet(name & "_" & Number) = False Then uniqueName = name & "_" & Number Exit Do End If Number = Number + 1 Loop GetUniqueSheetName = uniqueName End Function
以下のコードは上記のコードを利用する方法の例です。
「hogehoge_1」~「hogehoge_10」までのシートを出力するサンプルです。
「CommonMethods」クラス内に必要な処理を記述しているため、Private methods As New CommonMethods
で定義します。
sheet.name = methods.GetUniqueSheetName(“hogehoge”)で「シート名_連番」の形式のシート名を取得して、シートに設定します。サンプルではシート名に「hogehoge」を指定していますので、「hogehoge_連番」となります。
Private methods As New CommonMethods Private Sub CommandButton1_Click() Dim count As Long count = 9 Dim sheet As Excel.Worksheet Dim i As Long For i = 0 To count Set sheet = Worksheets.Add(after:=Worksheets(Worksheets.count)) sheet.name = methods.GetUniqueSheetName("hogehoge") Next i End Sub
おすすめ書籍
できる イラストで学ぶ 入社1年目からのExcel VBA
知識ゼロから Excel VBA を学ぶにはおすすめの一冊です。丁寧に図解付きで解説されていますので内容についてもわかりやすいです。この本で VBA のすべてを知ることはできませんが、知識ゼロから初級クラスへのステップアップにちょうどいいです。
Excel VBAコードレシピ集
いろいろ作って見たいけど、なれないうちは Excel VBA で何ができて何ができないのかがわからず、すぐに手をつけられないこともあると思います。この本には実際に使うことの多い650ものレシピが紹介されていますので、漠然と学習するよりも「この機能を実装したい」と目的をもって学習できます。経験者向けではありますが、初心者にもおすすめできる一冊です。
おわりに
シート名に連番を追加して重複しないようにする方法を紹介しました。採番管理などは行っていない簡易のものになります。シート数が多い場合は処理時間が増えますのでご注意ください。