Gilbertには、セルA1:A12に必要なワークシート名のリストを含むワークシート(「Control」という名前)があります。彼は、マクロで、そのセル範囲に基づいてブック内の他の12個のワークシートのそれぞれの名前を変更する方法を必要としています。ワークシート名は動的である必要はありません。彼がマクロを実行するときに、名前を変更する必要があります。

このニーズに対応するマクロ開発の中核は、名前を変更する各ワークシートのNameプロパティに依存することです。たとえば、次のような非常に単純なマクロを使用できます。

Sub RenameSheets()

Dim c As Range     Dim J As Integer

J = 0     For Each c In Range("A1:A12")

J = J + 1         If Sheets(J).Name = "Control" Then J = J + 1         Sheets(J).Name = c.Text     Next c End Sub

マクロはセル範囲A1:A12をステップスルーするだけで、次のワークシートの名前が「Control」でない場合は、ワークシートの名前をセル値に変更します。

前述のように、このマクロは非常に単純であり、おそらく、はるかに堅牢である必要があります。たとえば、現在のワークブックに13を超える(または少ない)ワークシートがある場合はどうすればよいですか? A1:A12の範囲に空のセルがある場合はどうすればよいですか?誰かがマクロを実行し、「コントロール」がアクティブなワークシートではない場合はどうすればよいですか?

A1:A12に2つの同じ値がある場合はどうすればよいですか? A1:A12の範囲の1つ以上の名前に先頭または末尾のスペースがある場合はどうなりますか?これらおよび(ほとんどの場合)他のさまざまな質問が、マクロの最終的な外観に影響を与える可能性があります。これは、今述べた可能性のいくつかを考慮に入れたマクロのコメント付きバージョンです:

Sub RenameSheets()

Dim c As Range     Dim J As Integer     Dim K As Integer     Dim sName As String     Dim w(12) As String     Dim bGo As Boolean     Dim sTemp As String

bGo = True     If Worksheets.Count <> 13 Then         ' Check to make sure exactly 13 worksheets in workbook         bGo = False         sTemp = "There are more than 13 worksheets."

End If     If ActiveSheet.Name <> "Control" Then         ' Check to make sure Control is active         bGo = False         sTemp = "Control worksheet is not active."

Else         ' Check for empty and duplicate cells in range         J = 0         For Each c In Range("A1:A12")

sName = Trim(c.Text)

If sName <> "" Then                 For K = 1 to J                     If LCase(w(K)) = LCase(sName) Then                         bGo = False                         sTemp = "Duplicate sheet names in list."

End If                 Next K                 If bGo Then                     ' Everything still good; add name                     J = J + 1                     w(J) = sName                 End If             End If         Next c     End If

If bGo Then         K = 0         For J = 1 To 12             K = K + 1             If Sheets(K).Name = "Control" Then K = K + 1             Sheets(K).Name = w(J)

Next J     Else         MsgBox(sTemp)

End If End Sub

マクロの2番目のバージョンが最初のバージョンよりどれだけ長いかに注意してください。マクロに複数のチェックを追加し始めると、チェックがない場合よりもはるかに長くなる可能性があります。もちろん、チェックを追加することの利点は、マクロがあなた以外の人によって使用されるため、問題が発生する可能性が低いことです。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(1506)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。