【EXCEL・VBA】シート名に連番を追加して重複しないようにする

Microsoft365

データベースからデータを抽出したり、集計ツールを作成していたりすると、実行する毎に新しいシートで結果を出力したりするのですが、「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ものレシピが紹介されていますので、漠然と学習するよりも「この機能を実装したい」と目的をもって学習できます。経験者向けではありますが、初心者にもおすすめできる一冊です。

おわりに

シート名に連番を追加して重複しないようにする方法を紹介しました。採番管理などは行っていない簡易のものになります。シート数が多い場合は処理時間が増えますのでご注意ください。

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