Переименование рабочих листов на основе списка (Microsoft Excel)
У Гилберта есть рабочий лист (с именем «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.