2009-10-19 19 views
7

Bir çalışma kitabındaki tüm çalışma sayfalarını nasıl değiştireceğimi ve bir 'uç bayrak' çalışma sayfasına eriştikten sonra nasıl çıkacağımı biliyorum:Bir çalışma sayfası alt kümesini nasıl çözebilirim?

For Each ThisWorkSheet In Worksheets 
    If ThisWorkSheet.Name = "FlagEnd" Then Exit For 
    MsgBox "This worksheet name is: " & ThisWorkSheet.Name 
Next 

Ancak, bir başlangıç ​​bayrağına başlamak için döngü alamıyorum 'çalışma sayfası (veya başlangıç ​​bayrağı çalışma sayfasından hemen sonra çalışma sayfasında daha iyi. Örneğin, işaretlenmiş başlangıç ​​/ bitiş çalışma sayfaları, diğer çalışma sayfalarının ortasındadır, yani başlangıç ​​veya bitiş geçişi uygulanabilir değildir.

"FlagStart" sayfasından önce yüzlerce çalışma sayfası olabilir, bu yüzden gerçekten sağdaki sayfadan başlamalıyım.

Deneme:

Set ThisWorkSheet = Sheets("FlagNew") 

ve

For Each Sheets("FlagNew") In Worksheets 

Fikirler?

Çözüm: Mathias çok yakındı, ama dendarii özel bitiş endeksi ile o kadar küçük bir adımdı ki, son çözümümü kendi başıma buldum, ama kredi vermek istedim. İşte benim son çözümüm:

Private Sub CommandButtonLoopThruFlaggedSheets_Click() 
    ' determine current bounds 
    Dim StartIndex, EndIndex, LoopIndex As Integer 
    StartIndex = Sheets("FlagNew").Index + 1 
    EndIndex = Sheets("FlagEnd").Index - 1 

    For LoopIndex = StartIndex To EndIndex 
     MsgBox "this worksheet is: " & Sheets(LoopIndex).Name 
     ' code here 
    Next LoopIndex 
End Sub 
+3

Kirk, bunun farkında olmayabilir, ancak sonunda bir tip ile aynı hat üzerinde 3 değişken bildirirseniz, sadece son değişken aslında başkalarının varyantları olarak sona, bu tür alır. Tüm bildirimlerinizi tek bir satırda yapacaksanız, "Dim StartIndex Tamsayı, EndIndex Tamsayı, LoopIndex Tamsayı" olarak belirtmeniz gerekir. – dendarii

+0

Doh, kendimi tekrar kısayollarla yaktım! Teşekkürler farkında değildim, onu değiştireceğim. –

cevap

2

Bu özellikle değiştirilebilen bir çalışma kitabı değilse (yani çalışma sayfaları her zaman eklenmez ve silinmez), çalışma sayfalarının adlarını gizli bir sayfada bir aralıkta saklayabilir ve adlarına göre bunlarla döngü yapabilirsiniz.

Public Function GetStartIndex() As Integer 
    On Error Resume Next 
    GetStartIndex = ThisWorkbook.Worksheets("MyStartingWorksheet").Index + 1 
End Function 

Public Function GetEndIndex() As Integer 
    On Error Resume Next 
    GetEndIndex = ThisWorkbook.Worksheets("MyEndingWorksheet").Index - 1 
End Function 

Sub LoopThrough() 

    Dim wks As Worksheet 
    Dim i As Integer 
    Dim iStart As Integer 
    Dim iEnd As Integer 

    iStart = GetStartIndex() 
    iEnd = GetEndIndex() 

    If iStart > 0 And iEnd > 0 And iEnd > iStart Then 
     For i = iStart To iEnd 
      Set wks = ThisWorkbook.Worksheets(i) 
      MsgBox wks.Name 
     Next i 
    End If 

End Sub 
+0

Mathias çok yakındı, ancak bu özel bitiş endeksine daha yakın bir adımdı. Son çözümümü kendi başıma buldum, ama burada kredi vermek istedim. .. 1 için - Private Sub CommandButtonLoopThruFlaggedSheets_Click() 'mevcut sınırları Dim startIndex'ten, endIndex, LoopIndex Integer startIndex'ten = Tablolar ("FlagNew") Ana + 1 endIndex = Tablolar ("FlagEnd") Dizin belirleme LoopIndex = startIndex MsgBox endIndex için "Bu çalışma sayfası şudur:" Sayfaları (LoopIndex) .Name 'burada kod Sonraki LoopIndex End Sub –

+0

(çözüm kod biçimlendirme ile yukarıda orijinal gündeme düzenlenmiş) & Ben kurdunuz görüyoruz –

+0

iyi bir işlev. Yine de birkaç şey önermek isterim. Dizin bulmak istediğiniz sayfanın adını işlevde bir argüman olarak almanızı öneririm. Hiçbir argüman almadan, işlevi statik yaptınız; Ana hattınızda bu iki satırı da yazmış olabilirsiniz. Ardından, indeks almak için sayfa koleksiyonunu kullanın, çünkü çalışma kitabının grafik sayfaları olduğunda, kod beklediğiniz gibi çalışmayabilir. –

1

Ne dersin?

For Each ThisWorkSheet In Worksheets 
    If ThisWorkSheet.Name = "FlagStart" Then output = true 
    If ThisWorkSheet.Name = "FlagEnd" Then Exit For 
    If output = true Then MsgBox "This worksheet name is: " & ThisWorkSheet.Name 
Next 

Bu kod düzgün olmayabilir. Ben VBA'da değil, editörde yazıyorum ama sen fikir edin.

+1

Bunu düşündüğümü söylemeliydim, ama yeterince verimli değil. FlagStart çalışma sayfasının önünde yüzlerce çalışma sayfası olabilir. Doğru çalışma sayfasında doğruca başlamayı tercih ederim. Yine de teşekkürler! –

+0

@Kirk Hings - erken optimizasyon sizi ısıtacak! Önce bir çalışma çözümü almanızı öneriyorum, daha sonra optimize etmenin yollarını araştırıyorum. Ayrıca yüzlerce sayfaya sahip olmaktan da endişelenebilirim. Excel en iyi araç mı? –

+0

iyi puanlar, aslında zaten kullandıkları çözümü optimize ediyorum. Şu anda bu malzemenin bir demetini yapıştırıyorlar ve onlar için onları otomatikleştirmeye çalışıyoruz. Sanırım yüzlerce abarttım, ama düzinelerce sac olabilir ve maalesef sayı ve sayfa isimlerine göre değişir. Şu anda bu çözümleri deniyorum. Dün bu sorunu yayınladıktan sonra endeksi kullanmaya başladım. –

2

Eğer "foreach" kullanıyorsanız, başlangıç ​​sayfası üzerinde herhangi bir kontrole sahip olmayacağınıza inanıyorum. Bu nedenle, iterasyonun gerçekleşeceği sırayı garanti ettiğinizden bile emin değilim.
Öncelikle yapmanız gereken şey, ilgilendiğiniz sayfanın dizinini almaktır (sayfayı isme göre alın ve dizinini alın) ve ardından bir for döngüsü kullanarak yinelenen sayfaların dizinleri üzerinde yineleyin. bayrak sayfası endeksi.
: Eğer üzerinde yineleme bir ortak ad biçime sahip sayfaları mı

Sub Iterate() 

Dim book As Workbook 
Dim flagIndex As Integer 
Dim flagSheet As Worksheet 

Set book = ActiveWorkbook 
Set flagSheet = book.Worksheets("Sheet3") 
flagIndex = flagSheet.Index 

Dim sheetIndex As Integer 
Dim currentSheet As Worksheet 

For sheetIndex = flagIndex To book.Worksheets.Count 
    Set currentSheet = book.Worksheets(sheetIndex) 
Next 

End Sub 
+0

Siz haklısınız. Çalışma sayfaları bir dizi sayfadır. Nerede olduğunu bilmiyorsun. –

0

[Düzenle Ben hızlı örnek üzerinden kesmek]? o başvurmak istediğiniz bir levha ise her döngü için, sadece Left(ThisWorkSheet.name, 4) = "emp" yapmak senin içinde

Ör)

Sheets(0).name > "Reports" 
Sheets(1).name > "Start Here" 
Sheets(2).name > "emp.0001" 
Sheets(3).name > "emp.0002" 
Sheets(4).name > "emp.0003" 
Sheets(5).name > "emp.0004" 
Sheets(6).name > "End Here" 

Eğer öyleyse, doğrulamak için.

-1
: bu kadar, Mathias' çözüm üzerinde inşa başlangıç ​​ve bitiş çalışma sayfalarının endekslerini ve sonra döngü boyunca dönmek için bir işlev kullanabilirsiniz çalışma kitabında ardışık saklanır gibi

Ancak, bu sesler

Public Sub ITERATE_WORKSHEETS() 
    On Error Resume Next  
    Dim x As Long 
     For x = 0 To 100 
       MsgBox Worksheets(x).Name 
     Next x 
    On Error GoTo 0 
    MsgBox "all done" 
End Sub 
+1

Sadece kod göndermeyin, lütfen bir açıklama da verin. – Chad

0

Excel VBA 2013'te, çalışma sayfaları varsa, "Blankfirst" ve "Blanklast" sekmeleri arasında güncelleştirmek istediğinizde bu çalışır.

Sekme adlarınızı geri getirip, ardından MsgBox wks.Name bölümü yerine işlem kodunuzu değiştirip test etmek için aşağıdaki kodu kullanın.

Sub Macro2() 

    On Error Resume Next 
    GetStartIndex = ThisWorkbook.Worksheets("Blankfirst").Index + 1 

    On Error Resume Next 
    GetEndIndex = ThisWorkbook.Worksheets("Blanklast").Index - 1 

    Dim wks As Worksheet 
    Dim i As Integer 
    Dim iStart As Integer 
    Dim iEnd As Integer 

    iStart = GetStartIndex 
    iEnd = GetEndIndex 


    If iStart > 0 And iEnd > 0 And iEnd > iStart Then 
     For i = iStart To iEnd 
      Set wks = ThisWorkbook.Worksheets(i) 
      MsgBox wks.Name 
     Next i 
    End If 

End Sub 
İlgili konular