Переименование листов в макросе без переименования первых четырех листов

Я умею делать маркос, но в школе он никогда не учил меня всему, что с ними делать, в основном с димами. Мои вопросы заключаются в том, как мне сделать марку, которая переименует все мои листы, кроме первых четырех.

Sub RenameSheet()

    Dim rs As Worksheet

    For Each rs In Sheets
        rs.Name = rs.Range("D5")
    Next rs

End Sub

Работает для каждого листа, но я не хочу переименовывать каждый лист. Мои первые четыре — Documentation, Summary, RONATemplate, KaycanTemplate. Который я хочу оставить есть. Я не могу просто поместить эти имена в ячейку D5, чтобы заставить ее работать там, где это шаблон, и это испортит мои другие marcos.


person user2420382    schedule 25.05.2013    source источник


Ответы (3)


Чтобы изменить каждый лист после 4-го, используйте свойство индекса листов в операторе if:

Sub RenameSheet()

Dim rs As Worksheet

For Each rs In Sheets
    If rs.Index > 4 Then
        rs.Name = rs.Range("D5")
    End If
Next rs

End Sub 
person Ryan E    schedule 25.05.2013

Вы можете создать своего рода черный список и проверить, является ли rs.Name одним из имен, которые вы не хотите менять, или вы можете получить доступ к листам по индексу.

i.e.

For i = 5 to Worksheets.Count
    Worksheets(i).Name = rs.Range("D5")
Next
person user2420390    schedule 25.05.2013

Первый вариант - использовать другой тип цикла, который повторяется на основе индекса/номера листа. Вот код, работающий только для Worksheets Collection:

Sub RenameSheet()

    Dim rs As Long

    For rs = 5 To Worksheets.Count
        Worksheets(rs).Name = Worksheets(rs).Range("D5")
    Next rs

End Sub

Ваш цикл начинается с 5-го рабочего листа и работает до последнего.

Другой вариант - исключить все листы с именами, которые вы упомянули в своем вопросе. В этой ситуации вы можете запустить этот макрос:

Sub RenameSheet()

    Dim rs As Worksheet

    For Each rs In Sheets
        if rs.name <> "Summary" And rs.Name <> "RONATemplate" and rs.Name <> "KeycanTemplate" Then
            rs.Name = rs.Range("D5")
        end if
    Next rs

End Sub

Однако имейте в виду, что все условные проверки, такие как rs.Name <> "Summary", чувствительны к регистру, поэтому вам необходимо поместить в код соответствующие имена, включая верхний и нижний регистры. Или вы можете использовать функцию UCase для сравнения имен с заглавными буквами, например:

if UCase(rs.Name) <> "SUMMARY" And UCase(rs.Name) <> "RONATEMPLATE" And Ucase(rs.Name) <> "KEYCANTEMPLATE" Then

Я бы предложил использовать второй тип улучшенной процедуры. Если вы измените порядок своих листов (например, переместите первый лист на 6-ю позицию), вы получите неожиданные результаты, выполнив первый цикл For i=1. Нет такой проблемы с запуском второго типа цикла/подпрограммы.

person Kazimierz Jawor    schedule 25.05.2013
comment
For rs = 5 In Sheets.Count должно быть For rs = 5 to Sheets.Count конечно. - person Doug Glancy; 25.05.2013
comment
Еще одна вещь, на которую я хотел бы указать, это то, что если есть какая-либо диаграмма Sheets, вы получите ошибку 438 во время выполнения на первой, поскольку листы диаграмм не имеют объекта range. - person Doug Glancy; 25.05.2013
comment
это, очевидно, верно, поэтому вторая идея намного лучше, учитывая и другие проблемы (например, реорганизацию порядка листов). - person Kazimierz Jawor; 25.05.2013