2017-08-08 113 views
0

我的问题其实很简单,但我找不到解决方案。 我有很多可以由用户修改不同名称的工作表。我给每一个这些纸张的背景名字,所以我的第一个两片,它们在我的VBA项目的名字是这样的:循环(名称)表

enter image description here

事实是,我希望做一个宏遍历所有那些特定的表(我有他们的14),我不通过,我使用的不同的东西其他的人要循环,像这样的:

enter image description here

这是很容易使用可以由用户修改的名称(在我的示例中为“常规”和“遗产”)遍历我的表格。不过,我希望用户能够随时修改该名称,如果他这么做,我的宏将不会识别该表的新名称。对我来说非常重要的是,用户不必按下按钮或使用不同的文本框来重命名他的工作表,我不想通过这种方式避免这个问题。

我想要的是能够遍历背景名称(在我的例子中的S1和S2),做这样的事情(我知道下面的代码不好,但它只是给你一个例如):

Sub Example1() 

Dim wksht As Worksheet 

For i = 1 To 14 
    Set wksht = "S" & i 
    wksht.Cells(1, 1).Value = 1 
Next i 

End Sub 

我知道下面的代码适用于1页:

Sub Example2() 

Dim wksht As Worksheet 
Set wksht = S1 
wksht.Cells(1, 1).Value = 1 
Next i 

End Sub 

的问题是S1在我前面的代码是不是一个字符串,所以我不能循环使用“ S“& i。有没有解决我的问题?

+4

使用工作表对象的CodeName来检查您给出的名称:if wksht.CodeName =“S1”then ... end if – Sorceri

+0

Thanks!这确实是我正在寻找的CodeName –

回答

7

您正在使用表单代码名称,所以可以这样做。顺便说一句,这将匹配S后跟一个数字,这可能或可能不足以满足您的需求。 (顺便说一下,这是“通过”,而不是“扔”。)

Sub Example1() 

Dim wksht As Worksheet 

For Each wksht In Worksheets 
    If wksht.CodeName Like "S#" Then 
     'do something 
    End If 
Next wksht 

End Sub 
+0

非常感谢!对不起拼写错误.. –

+0

我的荣幸,也没有必要道歉。 – SJR

+1

@ M.Tailleur:请接受答案。 –

0

根据我的研究,似乎没有办法根据自己的代号字符串参考表,但是,你可以得到的代号作为来自工作表的字符串。

Sub test() 

    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim ws_temp As Worksheet 
    Dim i As Long 

    Set wb = ThisWorkbook 
    For i = 1 To 4 
     For Each ws_temp In wb.Sheets 
      If ws_temp.CodeName = "S" & i Then 
       Set ws = ws_temp 
      End If 
     Next 
     Debug.Print ws.Name & " " & ws.CodeName 
    Next 

End Sub 

该代码将按顺序遍历所有S#表单,并允许您将每个表单作为ws工作。