У Гилберта есть рабочий лист (с именем «Control»), содержащий список желаемых имен рабочих листов в ячейках A1: A12. Ему нужен макрос, чтобы переименовать каждый из 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 есть пустые ячейки? Что делать, если кто-то запускает макрос, а «Control» не является активным листом?

Что делать, если в A1: A12 два одинаковых значения? Что делать, если в одном или нескольких именах в диапазоне A1: A12 есть начальные или конечные пробелы? Эти и (скорее всего) целый ряд других вопросов могут повлиять на окончательный вид макроса. Вот закомментированная версия макроса, в которой учтены некоторые из только что упомянутых возможностей:

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

Обратите внимание, насколько длиннее вторая версия макроса, чем первая? Каждый раз, когда вы начинаете добавлять несколько проверок в макрос, это действительно может сделать его намного дольше, чем без проверок. Преимущество добавления проверок, конечно, заключается в том, что ваш макрос с меньшей вероятностью столкнется с проблемами, поскольку он используется другими людьми, кроме вас.

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (1506) применим к Microsoft Excel 2007, 2010, 2013 и 2016.