こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
普段Excelを使っていると、こんな悩みありませんか?
- 「月報シートをコピーして『5月』ってシート名変えたのに、シートの中のタイトル(A1セルとか)を『4月』のままにしちゃった…」
- 「取引先ごとにシートを分けてるけど、シート名とセルに入力した会社名が微妙に違ってて、後で混乱する…」
- 「シートが30枚もあると、名前と中身を全部チェックするだけで時間が溶ける…もうヤダ…」
その「うっかりミス」や「面倒な二度手間」、本当にストレスですよね。
この記事では、そんな「シート名と特定のセルの値を、いちいち手作業で合わせないといけない」という悩みを解決します。
VBA(Excelに搭載されているプログラミング機能)を使いますが、大丈夫です。今回はコピペして、あなたが使いたいシートに貼り付けるだけで動くコードをご紹介します。
忌まわしき「修正漏れ」を撲滅しましょう!
パターン1:シート名を変更したら、セル(A1)の値も自動で変わる
これが一番多いニーズかもしれません。「シート名」を正として、セルの値を自動で合わせる方法です。
例えば、「4月」シートをコピーして「5月」というシート名に変更したとします。その「5月」シートを開いた(クリックした)瞬間に、A1セルにも自動で「5月」と入力されるようにします。
実行手順
- Excelを開き、Alt + F11 キーを同時に押して、「VBE(VBAエディタ)」という別のウィンドウを開きます。
- 画面の左側に「プロジェクトエクスプローラー」という欄があります。そこで、この機能を設定したいシート名(例: Sheet1(4月)とか)をダブルクリックします。
- 真っ白なコードウィンドウが開きます。
- 以下のコードを、その真っ白な部分にそのままコピーして貼り付けてください。
🔽 コピペ用コード(特定のシートだけ動かす場合)
Private Sub Worksheet_Activate()
' このシートがアクティブになった時(開かれた時)に実行されます
' ここの "A1" を好きなセル番地に変更OK
' A1セルに、このシートの名前(Me.Name)を書き込みます
Me.Range("A1").Value = Me.Name
End Sub
コードの簡単な解説
- Worksheet_Activate(): 難しい言葉ですが、「このシートが選ばれた(アクティブになった)瞬間に実行しますよ」という合図です。
- Me: 「このコードが書かれているシート自身」のことです。
- Me.Name: このシートの名前(例: “5月”)を取得します。
- Me.Range(“A1”).Value = …: A1セルの値(Value)に、取得したシート名を上書きします。
もし「A1セルじゃなくて、B2セルに反映させたい!」という場合は、コード内の “A1” の部分を “B2” に書き換えるだけでOKです。
(応用)すべてのシートで「シート名 → A1セル」を連動させたい場合
「新しく作るシート全部に、この機能が自動で適用されてほしい!」という場合は、こちらが便利です。
実行手順
- 先ほどと同じく VBE を開きます (Alt + F11)。
- 左側のプロジェクトエクスプローラーで、シート名ではなく ThisWorkbook という項目をダブルクリックします。
- 開いたウィンドウに、以下のコードをコピペします。
🔽 コピペ用コード(ブック全体で動かす場合)
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
' いずれかのシートがアクティブになった時に実行されます
' Sh には、アクティブになったシートそのものが入ります
' ★ここの "A1" を好きなセル番地に変更OK
Sh.Range("A1").Value = Sh.Name
End Sub
これだけで、どのシートを開いても、そのシート名がA1セルに自動で反映されるようになります。特定のシート(目次ページなど)だけ反映したくない場合は設定が少し複雑になるので、まずは「全部反映する」で試してみてください。
パターン2:セル(A1)の値を変更したら、シート名も自動で変わる
今度は逆のパターンです。「A1セル」を正として、シート名を自動で変更します。
A1セルに「株式会社A社 見積書」と入力したら、シート名も自動で「株式会社A社 見積書」に変わるイメージです。(ただし、シート名には文字数制限や使えない文字があるので注意が必要です)
実行手順
- VBE を開きます (Alt + F11)。
- この機能を設定したいシート名(例: Sheet1)をダブルクリックします。
- 開いたウィンドウに、以下のコードをコピペします。
🔽 コピペ用コード(セル → シート名)
Private Sub Worksheet_Change(ByVal Target As Range)
' このシートのセルが変更された時に実行されます
' ここの "A1" を監視したいセル番地に変更OK
Dim WatchCell As Range
Set WatchCell = Me.Range("A1")
' 変更されたセル(Target)と、監視したいセル(WatchCell)が
' 重なっていない(A1以外が変更された)場合は、何もしないで終了
If Intersect(Target, WatchCell) Is Nothing Then
Exit Sub
End If
' --- A1セルが変更された場合の処理 ---
' もしA1セルが空欄にされたら、エラーになるので何もしない
If WatchCell.Value = "" Then Exit Sub
Dim newName As String
newName = WatchCell.Value
' シート名に使えない文字を削除します( \ / ? * [ ] )
newName = Replace(newName, "/", "")
newName = Replace(newName, "\", "")
newName = Replace(newName, "?", "")
newName = Replace(newName, "*", "")
newName = Replace(newName, "[", "")
newName = Replace(newName, "]", "")
' シート名は31文字以内というルールがあります
If Len(newName) > 31 Then
newName = Left(newName, 31)
End If
' 万が一、同じシート名が既にあるとエラーになるので、エラーが起きても無視する
On Error Resume Next
' このシートの名前(Me.Name)を、加工したA1セルの値(newName)に変更
Me.Name = newName
' エラー処理を元に戻す
On Error GoTo 0
End Sub
コードの簡単な解説
- Worksheet_Change(ByVal Target As Range): シートのセルが変更されたら動く合図です。Target には「変更されたセル」が入っています。
- Intersect(…) Is Nothing: 「A1セル(WatchCell)」と「変更されたセル(Target)」が重なっていないか、つまり「A1以外が変更されたか」をチェックしています。
- 重要な注意点:
- シート名には「 / \ ? * [ ] 」といった記号は使えません。コード内でこれらを自動で削除(Replace)しています。
- シート名は31文字以内という制限があります。コード内で自動で31文字にカット(Left(…, 31))しています。
- すでに同じシート名があるとエラーになります。On Error Resume Next という手法で、エラーが出てもExcelが止まらないようにしています(変更が無視されます)。
まとめ
今回は、Excelのシート名とセルの値を自動で連動させるVBAコードを2パターン(+応用1)ご紹介しました。
- パターン1: シートを開くと、A1セルがシート名に自動で変わる。
- パターン2: A1セルを変更すると、シート名が自動で変わる。
VBAと聞くと「難しそう…」「エラーが出たら怖い」と感じるかもしれませんが、まずはコピペで試してみてください。
小さな自動化が、あなたの「面倒くさい」「ミスしたくない」というストレスを確実に減らしてくれます!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、ぜひ参考にしてみてください。


コメント