Excel VBA シート名をプログラムで自動的に変更する方法

 

Excel VBAで「シート名変更」で、シートの名前をプログラムで動的に変更できます。手動で変更するのではなく、VBAコードを使って名前を変更することで、自動化が可能です。具体的な使い方や、注意点やサンプルコードを紹介します。

 

自分の実力を客観的にチェックしたい…。そんな方のために、自分に合ったスタート地点がわかる無料のExcelVBAベーシック選択問題集をご用意しました。

👉無料ExcelVBAベーシック選択問題138問

 

Excel VBA シート名変更の利用

以下のようなシーンで利用されます。

・データをインポートするたびにシート名に日付を付けて管理

・複数のレポートを生成する際に、それぞれのシート名をプロジェクト名やカテゴリに変更

・多くのシートがある場合、目的に応じてシート名を整理して変更

 

Excel VBA シート名変更|使い方とポイント

使い方

シート名を変更するには、Nameプロパティを使います。対象となるシートを特定して、そのNameプロパティに新しい名前を代入します。

 

ポイント

・重複禁止
同じブック内でシート名が重複するとエラーが発生します。既に使用されている名前を避けましょう。

・長すぎる名前に注意
シート名は31文字までで、これを超えるとエラーになります。

・特殊文字の使用制限
シート名には、/、\、?、*、[、]などの特殊文字を使用できません。

 

Excel VBA シート名変更のサンプルコード

📌 「これ、自動化できたらラクなのに…」と思ったこと、ありませんか?
実はその作業、Excelマクロで簡単に自動化できるかもしれません。
「でもマクロって難しそう…」という方のために、完全初心者向けの入門記事をご用意しました!

👇実務で“そのまま使える”テンプレ付きで、コピペするだけ
初心者向けエクセルマクロの作り方を解説|コピペOK実務テンプレ付き

特定のシート名を変更

  1. Option Explicit
  2. Sub RenameSheet()
  3.     ' "Sheet1" のシート名を "データシート" に変更
  4.     Worksheets("Sheet1").Name = "データシート"
  5. End Sub

現在のシート名を日付に変更

  1. Option Explicit
  2. Sub RenameSheetToDate()
  3.     ' アクティブなシートの名前を現在の日付に変更
  4.     ActiveSheet.Name = Format(Date, "yyyy-mm-dd")
  5. End Sub

複数のシート名を順番に変更

  1. Option Explicit
  2. Sub RenameAllSheets()
  3.     Dim ws As Worksheet
  4.     Dim i As Integer
  5.     i = 1
  6.     
  7.     ' 全シートを順に名前を「シート1」、「シート2」...に変更
  8.     For Each ws In ThisWorkbook.Worksheets
  9.         ws.Name = "シート" & i
  10.         i = i + 1
  11.     Next ws
  12. End Sub

 

1.Worksheets("Sheet1").Name = "データシート"
"Sheet1" のシート名を "データシート" に変更します。

2.ActiveSheet.Name = Format(Date, "yyyy-mm-dd")
アクティブなシート名を、現在の日付("2024-09-07"のような形式)に変更します。

3.For Each ws In ThisWorkbook.Worksheets
全てのシートをループして、それぞれ順番に名前を変更しています。

検索文字列が含まれる複数シート名を置換文字列に変更する

マクロ実行で、別のExcelファイルを指定して、そのシート名を一括で変更する処理になります。

 

サンプルコードの処理内容

1.Excelファイルを指定する。
ファイルを開くダイアログボックスを表示して、シート名変更するExcelファイルを指定する

2.変更するシート名部分一致文字列を入力する。
インプットボックスから検索文字を入力する。

検索文字列に入力した値がないと終了する。

3.変更するシート名を置換する部分文字を入力する。
インプットボックスから置換文字を入力する。

置換シート名に特殊文字がある場合は、再入力させる。

4.Excelファイルを開いて、すべてのシートの置換処理が終了するまで繰り返す。

指定したExcelファイルのシート名を部分一致文字列で検索して、部分一致したシート名を
対象に置換文字列で置換する。

置換後のシート名が31文字を超える場合はエラーを表示して終了する。

置換後のシート名に重複名はある場合はエラーを表示して終了する。

5.Excelファイルのシートすべての処理終了で、置換件数をメッセージボックスに表示する。

6.メッセージボックスのボタンOKでExcelファイルを保存、閉じて終了する。

 

使うVBA命令の解説

Application.FileDialog
ファイルを開くダイアログを表示します。

InputBox
ユーザーに文字列入力を求めます。

InStr
文字列内に検索語が含まれるか調べます(部分一致)

Replace
検索語を別の文字列に置き換えます。

Len
文字列の長さをチェック(31文字制限)

Dictionary
シート名の重複チェック用に使用する。

関数で禁止文字( `/ \ ? * [ ]`)が含まれていないかチェックします。

 

以下コードを標準モジュールに貼り付けて実行してください。

 

  1. Sub シート名一括置換()
  2.     Dim fd As FileDialog
  3.     Dim filePath As String
  4.     Dim wb As Workbook
  5.     Dim ws As Worksheet
  6.     Dim searchStr As String
  7.     Dim replaceStr As String
  8.     Dim i As Long
  9.     Dim sheetName As String
  10.     Dim newName As String
  11.     Dim replaceCount As Long
  12.     Dim sheetNamesDict As Object
  13.     Dim isValid As Boolean
  14.     
  15.     ' ファイル選択
  16.     Set fd = Application.FileDialog(msoFileDialogFilePicker)
  17.     With fd
  18.         .Title = "Excelファイルを選択してください"
  19.         .Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm", 1
  20.         If .Show <> -1 Then Exit Sub
  21.         filePath = .SelectedItems(1)
  22.     End With
  23.     ' 入力受付(検索文字列)
  24.     searchStr = InputBox("シート名の検索文字列を入力してください", "検索文字列")
  25.     If searchStr = "" Then Exit Sub
  26.     ' 入力受付(置換文字列)+バリデーション付き再入力ループ
  27.     Do
  28.         replaceStr = InputBox("シート名の置換文字列を入力してください", "置換文字列")
  29.         
  30.         If replaceStr = "" Then Exit Sub
  31.         
  32.         If ContainsInvalidChars(replaceStr) Then
  33.             MsgBox "置換シート名に特殊文字( / \ ? * [ ] )は使用できません。", vbExclamation
  34.             isValid = False
  35.         Else
  36.             isValid = True
  37.         End If
  38.     Loop Until isValid
  39.     ' ワークブックを開く
  40.     Set wb = Workbooks.Open(filePath)
  41.     
  42.     Set sheetNamesDict = CreateObject("Scripting.Dictionary")
  43.     replaceCount = 0
  44.     ' 一括処理
  45.     For Each ws In wb.Sheets
  46.         sheetName = ws.Name
  47.         If InStr(sheetName, searchStr) > 0 Then
  48.             newName = Replace(sheetName, searchStr, replaceStr)
  49.             
  50.             ' 長さ制限チェック
  51.             If Len(newName) > 31 Then
  52.                 MsgBox "シート名が31文字を超えています:" & vbCrLf & newName, vbCritical
  53.                 wb.Close SaveChanges:=False
  54.                 Exit Sub
  55.             End If
  56.             
  57.             ' 重複チェック
  58.             If sheetNamesDict.exists(newName) Then
  59.                 MsgBox "シート名が重複します:" & vbCrLf & newName, vbCritical
  60.                 wb.Close SaveChanges:=False
  61.                 Exit Sub
  62.             End If
  63.             
  64.             sheetNamesDict.Add newName, True
  65.             ws.Name = newName
  66.             replaceCount = replaceCount + 1
  67.         Else
  68.             sheetNamesDict(ws.Name) = True
  69.         End If
  70.     Next
  71.     MsgBox replaceCount & " 件のシート名を置換しました。", vbInformation
  72.     wb.Save
  73.     wb.Close
  74. End Sub
  75. ' 特殊文字チェック関数
  76. Function ContainsInvalidChars(str As String) As Boolean
  77.     Dim invalidChars As Variant
  78.     Dim ch As Variant
  79.     invalidChars = Array("/", "\", "?", "*", "[", "]")
  80.     For Each ch In invalidChars
  81.         If InStr(str, ch) > 0 Then
  82.             ContainsInvalidChars = True
  83.             Exit Function
  84.         End If
  85.     Next
  86.     ContainsInvalidChars = False
  87. End Function

 

ExcelVBAを使ったシート名の変更は、シート管理の自動化やプロジェクトに応じた動的な処理に役立ちます。手動で名前を付ける手間を省き、エラーを防ぐためにも、シート名の変更をVBAで適切に処理することが重要です。

 

以下、業務に役立つマクロ10選を選びました。※ここをクリックで一覧表示します

 

Excel VBAエキスパートベーシックとスタンダード、どちらを選べばいいか判断が難しい…。そんな方のために、自分に合ったスタート地点がわかる無料のExcelVBAベーシック選択問題集を用意しました。

👉無料ExcelVBAベーシック選択問題138問