2013-05-25 34 views
0

我知道如何使马科斯,但在校期间,他从来没有教我的一切与他们无关,主要是与点心。 我的问题是我如何制作一个marco,它将重新命名我的所有表格,并预期前四个表格。重命名表不重命名前四片

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 

我会建议使用第二种改进的过程中。如果您更改工作表的顺序(例如,将第一个工作表移至第六个工作位置),您将得到意外结果,首先运行For i=1循环。运行第二种类型的循环/子程序时没有这样的问题。

+0

'用于RS = 5在Sheets.Count'应'对于rs = 5到Sheets.Count'当然。 –

+0

对,谢谢:) –

+1

另一件事,我要指出的是,如果有任何图表'Sheets',你将在第一个图表上得到438运行时错误,因为图表中没有'range'对象。 –

0

您可以创建一种具有黑名单,并检查是否rs.Name是你不想改变,或者你可以通过索引访问表的名字之一。

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

向第四使用后的片材的index属性在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