2013-05-25 4 views
0

Я знаю, как сделать маркос, но во время учебы он никогда не учил меня всему, что с ними делать, в основном с Dim. Мои вопросы - как сделать марку, которая переименует все мои листы, ожидая первых четырех.Переименование листов в Macro без переименования первых четырех листов

Sub RenameSheet() 

    Dim rs As Worksheet 

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

End Sub 

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

ответ

0

Первый вариант заключается в использовании различного типа цикла, который итерации основывается на индексе/номере листа. Вот код работает только для 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. Нет такой проблемы при запуске второго типа цикла/подпрограммы.

+0

'Для Rs = 5 В Sheets.Count' должен быть' Для rs = 5 to Sheets.Count' конечно. –

+0

Справа, спасибо :) –

+1

Другое дело, я бы указал, есть ли какой-либо график 'Sheets', вы получите ошибку времени выполнения 438 на первом, так как диаграммные листы не имеют объекта' range'. –

0

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

т.е.

For i = 5 to Worksheets.Count 
    Worksheets(i).Name = rs.Range("D5") 
Next 
0

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

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 
Смежные вопросы