2017-08-08 12 views
0

私の質問は実際には単純ですが、私は解決策を見つけることができません。 私は、ユーザーが変更できる異なる名前のシートをたくさん持っています。私はマクロをしたい、シートのループ(名前)

enter image description here

事実がある:私は、私のVBAプロジェクトの名前は次のようになり、私の最初の2枚分のため、これらのシートの各背景名に与えてくれましたすべてのそれらの特定のシート(私はそれらの14を持っている)をループし、私はこの1つのように、私は別のもののために使用する他のものをループにしたくない:

enter image description here

それがしやすいですユーザーが変更できる名前(私の例では "General" et "Heritage")を使用してSheetsをループします。それにもかかわらず、ユーザーがいつでもこの名前を変更できるようにしたいと思っていれば、私のマクロはシートの新しい名前を認識しません。ユーザーがボタンを押したり、シートの名前を変更するために別のテキストボックスを使用したりする必要はないので、私はこの問題を回避したくありません。

バックグラウンド名(私の例では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を使用して、指定した名前を確認します。wksht.CodeName = "S1" then ... end if – Sorceri

+0

ありがとう!それは確かに私が探していたCodeName –

答えて

7

シートコード名を使用していますので、このようなことができます。ちなみに、これはSの後に1桁の数字が表示されますが、これはあなたのニーズに十分であるかもしれません。 (ちなみに、それは「を介して」だ、「投げ」ではない。)

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として扱うことができます。

関連する問題