2009-10-19 11 views
7

मुझे पता है कि एक वर्कबुक की सभी वर्कशीट्स लूप करने के लिए, और कैसे एक बार बाहर निकलने के लिए मुझे एक 'अंत झंडा' कार्यपत्रक तक पहुँचने:मैं वर्कशीट्स के सबसेट के माध्यम से कैसे लूप कर सकता हूं?

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

हालांकि मैं नहीं मिल सकता है पाश एक 'प्रारंभ पर शुरू करने के लिए फ्लैग 'वर्कशीट (या स्टार्ट-फ्लैग वर्कशीट के ठीक बाद वर्कशीट पर भी बेहतर है। उदाहरण के लिए ध्वजांकित स्टार्ट/एंड वर्कशीट अन्य वर्कशीट्स के समूह के बीच में हैं, इसलिए शुरुआत या अंत ट्रैवर्सिंग काम करने योग्य नहीं है।

'फ्लैगस्टार्ट' शीट से पहले सैकड़ों वर्कशीट हो सकती हैं, इसलिए मुझे वास्तव में दाएं शीट पर शुरू करने की आवश्यकता है।

की कोशिश की:

Set ThisWorkSheet = Sheets("FlagNew") 

और

For Each Sheets("FlagNew") In Worksheets 

विचार?

समाधान: माथीस बहुत करीब था, लेकिन डेंडरारी कस्टम एंडिंग इंडेक्स के साथ छोटा कदम था। मैंने वास्तव में अपने अंतिम समाधान का पता लगाया, लेकिन क्रेडिट देना चाहता था। यहां मेरा अंतिम समाधान था:

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

किर्क, तो आप इस के बारे में पता नहीं हो सकता है, लेकिन अगर आप अंत में एक प्रकार के साथ एक ही लाइन पर 3 चर घोषित, केवल पिछले चर वास्तव में, उस प्रकार लेता है दूसरों वेरिएंट के रूप में अंत। यदि आपके पास एक ही पंक्ति पर आपकी सभी घोषणाएं हैं, तो आपको "डिम स्टार्ट इंडेक्स को इंटीजर, एंडइन्डेक्स इंटीजर, लूपइंडेक्स इंटीजर के रूप में" निर्दिष्ट करने की आवश्यकता है। – dendarii

+0

दोह, फिर से शॉर्टकट के साथ खुद को जला दिया! धन्यवाद, मुझे इसके बारे में पता नहीं था, मैं इसे बदल दूंगा। –

उत्तर

2

यदि यह विशेष रूप से परिवर्तनीय कार्यपुस्तिका नहीं है (यानी वर्कशीट्स को हर समय जोड़ा और हटाया नहीं जा रहा है), तो आप वर्कशीट्स के नाम छिपे हुए शीट पर और नाम से उनके माध्यम से लूप पर स्टोर कर सकते हैं।

हालांकि, यह लग रहा है जैसे वे कार्यपुस्तिका में लगातार जमा हो जाती है तो, मैथियास 'समाधान पर निर्माण, आप एक समारोह इस्तेमाल कर सकते हैं आरंभ और अंत कार्यपत्रकों के सूचकांक और फिर पाश के माध्यम से वापस जाने के लिए:

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

माथीस बहुत करीब था, लेकिन यह कस्टम एंडिंग इंडेक्स के साथ छोटा कदम था। मैंने वास्तव में अपने अंतिम समाधान का पता लगाया, लेकिन यहां क्रेडिट देना चाहता था। ।। 1 के लिए - निजी उप CommandButtonLoopThruFlaggedSheets_Click() 'वर्तमान सीमा मंद STARTINDEX, ENDINDEX, LoopIndex पूर्णांक के रूप में STARTINDEX = शीट ("FlagNew") सूचकांक + 1 ENDINDEX = शीट ("FlagEnd") सूचकांक का निर्धारण LoopIndex = STARTINDEX MsgBox ENDINDEX करने के लिए "इस कार्यपत्रक है:" और पत्रक (LoopIndex) .Name 'कोड यहाँ अगला LoopIndex End Sub –

+0

(समाधान कोड स्वरूपण के साथ ऊपर मूल प्रश्न में संपादित) –

+0

मुझे लगता है कि आप की स्थापना की है एक अच्छा काम हालांकि मैं कुछ चीजों का सुझाव देना चाहता हूं। मेरा सुझाव है कि आप उस शीट का नाम लें जिसके लिए आप इंडेक्स को फ़ंक्शन में तर्क के रूप में ढूंढना चाहते हैं। कोई तर्क नहीं लेते, आपने फ़ंक्शन स्थिर बना दिया है; आपने अपने मुख्य उप में उन दो पंक्तियों को भी लिखा होगा। फिर, इंडेक्स प्राप्त करने के लिए शीट संग्रह का उपयोग करें, क्योंकि, कार्यपुस्तिका चार्ट चार्ट शीट्स के साथ कोड की अपेक्षा नहीं कर सकती है। –

1

कैसे?

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 

यह कोड काफी सही नहीं हो सकता है। मैं इसे एसओ संपादक में लिख रहा हूं वीबीए नहीं, लेकिन आपको विचार मिलता है।

+1

मुझे उल्लेख करना चाहिए था कि मैंने इसके बारे में सोचा था, लेकिन यह पर्याप्त कुशल नहीं है। फ्लैगस्टार्ट वर्कशीट के सामने सैकड़ों वर्कशीट हो सकती हैं। मैं वास्तव में सही वर्कशीट पर सही शुरू करूंगा। हालांकि धन्यवाद! –

+0

@ किर्क हिंग्स - समयपूर्व अनुकूलन आपको काट देगा! मैं पहले एक समाधान समाधान प्राप्त करने का सुझाव दूंगा, फिर इसे अनुकूलित करने के तरीकों को देखें। इसके अलावा मैं सैकड़ों चादरों से चिंतित हूं। क्या एक्सेल सबसे अच्छा उपकरण है? –

+0

अच्छे अंक, मैं वास्तव में उस समाधान को अनुकूलित कर रहा हूं जिसका वे पहले से उपयोग कर रहे हैं। वर्तमान में वे इस सामान का एक गुच्छा पेस्ट कॉपी करते हैं और हम इसे स्वचालित करने की कोशिश कर रहे हैं। मुझे लगता है कि मैं सैकड़ों में अतिरंजित हूं, लेकिन दर्जनों चादरें हो सकती हैं, और दुर्भाग्यवश वे संख्या और शीट नामों में भिन्न होते हैं। मैं अभी इन समाधानों का प्रयास कर रहा हूं। मैंने इस समस्या को पोस्ट करने के बाद कल इंडेक्स का उपयोग करने पर मारा। –

2

मेरा मानना ​​है कि यदि आप "foreach" का उपयोग करते हैं तो आपके पास प्रारंभिक शीट पर कोई नियंत्रण नहीं होगा। उस मामले के लिए, मुझे यह भी यकीन नहीं है कि आप उस क्रम की गारंटी दे रहे हैं जिसमें पुनरावृत्ति होगी।
मुझे लगता है कि आपको क्या करना चाहिए सबसे पहले, उस शीट की अनुक्रमणिका प्राप्त करें जिसमें आप रुचि रखते हैं (नाम से शीट प्राप्त करें, और इसकी अनुक्रमणिका प्राप्त करें), और उसके बाद शुरू होने वाली चादरों के इंडेक्स पर, लूप के लिए पुनरावृत्त करें फ्लैग शीट सूचकांक।
:

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

आप सही हैं। वर्कशीट शीट का संग्रह है। आप नहीं जानते कि यह कहां है। –

0

[संपादित करें मैं एक त्वरित उदाहरण के माध्यम से काट दिया] शीट तुम पर पुनरावृति एक आम नाम प्रारूप है? अगर यह एक चादर आप का संदर्भ लेना चाहते है

पूर्व)

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" 

यदि हां, तो अपनी प्रत्येक पाश के लिए, बस एक Left(ThisWorkSheet.name, 4) = "emp" कर सत्यापित करने के लिए।

-1
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

बस कोड पोस्ट न करें, कृपया एक स्पष्टीकरण भी प्रदान करें। – Chad

0

एक्सेल वीबीए 2013 में यदि आपके पास वर्कशीट्स हैं जो आप "ब्लैंकफर्स्ट" और "ब्लैंकलास्ट" टैब के बीच अपडेट करना चाहते हैं।

परीक्षण के लिए नीचे दिए गए कोड का उपयोग करके अपने टैब नाम वापस लाएंगे और फिर MsgBox wks.Name भाग के स्थान पर अपने मैनिपुलेटिंग कोड को प्रतिस्थापित करें।

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 
संबंधित मुद्दे