2017-02-21 2 views
-1

Ich versuche, zwei verschiedene Arrays mit jeweils 20 Arbeitsblättern zu erstellen und zu durchlaufen. Die Arbeitsblätter stammen aus zwei verschiedenen Arbeitsmappen, "monatlich" und "wöchentlich".Schleife durch zwei Arbeitsblatt-Arrays in zwei Arbeitsmappen

Ich habe folgende (nach einigen Änderungen vorgeschlagen):

Dim Monthly As Excel.Workbook 
    Set Monthly = Workbooks("name of monthly workbook") 
    Dim Weekly As Excel.Workbook 
    Set Weekly = Workbooks.Open("path to weekly workbook") 

    Dim mWshtNames As Variant 
    Dim mWshtNameCrnt As Variant 
    Dim wWshtNames As Variant 
    Dim wWshtNameCrnt As Variant 

    mWshtNames = Array(Monthly.Worksheets("Reading Monthly"), Monthly.Worksheets("Writing Monthly"), Monthly.Worksheets("Science Monthly")) 
'and so on, to include 20 worksheets 
    wWshtNames = Array(Weekly.Worksheets("Reading Weekly"), Weekly.Worksheets("Writing Weekly"), Weekly.Worksheets("Science Weekly")) 
'and so on, to include 20 worksheets 

     For Each mWshtNameCrnt In mWshtNames 
      For Each wWshtNameCrnt In wWshtNames 
       MsgBox "Monthly sheet is " + mWshtNameCrnt.Name 
       MsgBox "Weekly sheet is " + wWshtNameCrnt.Name 
       'the real code will loop here; I am using MsgBox to test that the loop is working. 
      Next wWshtNameCrnt 
     Next mWshtNameCrnt 

Das Endziel für den Code ist, Daten von bestimmten Zellen in jeder Woche Arbeitsblatt kopieren und in eine entsprechende Zelle in einem entsprechenden Monat einfügen Arbeitsblatt; also müssen die Schleifen wie eine Eins-zu-eins-Beziehung sein.

Aktuelles Ergebnis (12 MsgBoxes):

  • "Monatsblatt Lesen Monthly", "Wochenblatt ist Lesen Weekly", "Wochenblatt Weekly schreibt",
  • "Wochenblatt Wissenschaft Weekly ist"
  • "Monatliches Blatt schreibt monatlich", "Wöchentliches Blatt liest wöchentlich", "Wöchentliches Blatt schreibt wöchentlich", "Wöchentliches Blatt ist Wissenschaft wöchentlich"
  • "Monatliches Blatt ist Wissenschaftlich monatlich", "Wöchentliches Blatt wird wöchentlich gelesen" , "Wöchentliches Blatt ist Wöchentlich schreiben", "Wöchentliches Blatt ist Wissenschaft Wöchentlich"

Erwartetes Ergebnis (6 MsgBoxes):

  • "Monatsblatt Lesen Monthly", "Wochenblatt ist Lesen Weekly"
  • "Monatsblatt Monat schreibt", "Wochenblatt schreibt Weekly"
  • „Monatsblatt ist Science Monthly“, „Wochenblatt ist Wissenschaft Weekly“

die Antwort von @Jeeped hat das gleiche effektive Ergebnis, wobei das Direktfenster neun Ergebnisse zurückgibt, wo sechs erwartet werden. Ich denke, ich brauche "Next wWshtNameCrnt" und "Next mWshtNameCrnt", um zur gleichen Zeit zu aktivieren, aber ich weiß nicht, wie man das schreibt.

+0

Sollte nicht '' und so weiter, um 20 Arbeitsmappen zu enthalten '' und so weiter, um 20 workSHEETs einzuschließen? – Jeeped

+0

Was genau soll deine Schleife *** *** machen? Wenn Sie nur die Namen anzeigen möchten, müssen Sie '.Name' auf Ihren Arbeitsblatt-Instanzen aufrufen. – Comintern

+1

Sie sollten eine For-Schleife verwenden, um Arrays zu iterieren, und eine For-Each-Schleife, um Sammlungen von Objekten zu iterieren. Ihre Kommentare zeigen an, dass die Arrays * Arbeitsmappen * enthalten, aber Ihr Code sagt etwas anderes, und die Arrays enthalten tatsächlich * Arbeitsblätter *. Auch Ihre Arrays speichern die 'Worksheet' Objekte, nicht nur ihre Namen, daher ist der Name der Variablen irreführend .... und' mWshtNames' vs 'wWshtNames' ist schwer zu lesen und leicht mit dem einen zu verwechseln. Wie wäre es stattdessen mit "Monatsblättern" und "Wochenblättern"? –

Antwort

2

so müssen die Schleifen wie eine Eins-zu-Eins-Beziehung sein.

Daher wird eine geschachtelte Schleife nicht tun. Wenn Sie jedes Element in der äußeren Schleife durchlaufen, iteriert die innere Schleife alle ihre Elemente jedes Mal, wenn die äußere Schleife eine neue Iteration macht, die, um das Vokabular für Tabellenbeziehungen auszuleihen, eine 1: Beziehung wäre.

Wenn es "eins zu eins" ist, dann brauchen Sie nur 1 Schleife, und Ihre beiden Arrays haben die gleiche Größe. So machen Sie eine For Schleife, die von LBound(anyOfTheseArrays) To UBound(anyOfTheseArraysButPreferablyTheSameYouUseToGetTheLBound) geht:

Dim index As Long 
For index = LBound(mWshtNames) To UBound(mWshtNames) 
    Debug.Print mWshtNames(index).Name, wWshtNames(index).Name 
Next 

Für 3 Elemente in jedem Array, dass Sie 3 Zeilen Ausgabe an den sofort Scheibe (Strg + G) geben, die praktische viel mehr ist als MsgBox Aufrufe, zumindest zum Debuggen.

+1

Ninja'd mich um 47 Sekunden! : D – YowE3K

1

Es scheint so, als wollten Sie die monatlichen Arbeitsblätter durchlaufen und für jede einzelne die wöchentlichen Arbeitsblätter durchlaufen. Diese

Option Explicit 

Sub bleh() 
    Dim Monthly As Excel.Workbook, Weekly As Excel.Workbook 

    Set Monthly = Workbooks("name of monthly workbook") 
    Set Weekly = Workbooks.Open("path to weekly workbook") 

    Dim m As Long, w As Long 
    Dim mWshtNames As Variant, wWshtNames As Variant 

    'define 20 monthly workSHEET names 
    mWshtNames = Array("Lorem", "Ipsum", "Dolor", "sit", "amet", _ 
         "consectetur", "adipiscing", "elit", "Sed", "vel", _ 
         "cursus", "purus", "Vivamus", "nec", "ex", _ 
         "et", "lorem", "fringilla", "consectetur", "Fusce") 
    'define 20 weekly workSHEET names 
    wWshtNames = Array("Pellentesque", "quis", "viverra", "lorem", "ac", _ 
         "sodales", "turpis", "Morbi", "in", "vulputate", _ 
         "lectus", "Donec", "aliquam", "suscipit", "nunc", _ 
         "eget", "bibendum", "augue", "interdum", "porta") 

     For m = LBound(mWshtNames) To UBound(mWshtNames) 
      With Monthly.Worksheets(mWshtNames(m)) 
       Debug.Print .Name 
       For w = LBound(wWshtNames) To UBound(wWshtNames) 
        With Weekly.Worksheets(wWshtNames(w)) 
         Debug.Print .Name 
        End With 
       Next w 
      End With 
     Next m 

End Sub 

Schleifen durch jede monatliche Arbeitsblatt und sendet seine .Name property an die VBE des Immediate window. Während dieses monatliche Arbeitsblatt "aktiv" ist, durchläuft es alle wöchentlichen Arbeitsblätter und sendet ihren .Name an das Direktfenster.

Während der Code nichts Sinnvolles tut, ruft er den Namen von einem Prozess, der den Namen verwendet, so dass zumindest der Name überprüft wird.

1

Überspringen Sie die verschachtelten Schleifen vollständig. Die Arbeitsblätter entsprechen einander durch Betreff, aber nur zufällig mit Namen. Anstatt all die vollständigen Namen (und \ oder Arbeitsblatt) zu erzeugen, bevor Sie Ihre Schleife eingeben, erstellen Sie das Indizes durch den Gegenstand und die Art des Arbeitsblatts kombinieren und erhält die Worksheet Referenz innerhalb der Schleife:

Dim Monthly As Excel.Workbook 
Set Monthly = Workbooks("name of monthly workbook") 
Dim Weekly As Excel.Workbook 
Set Weekly = Workbooks.Open("path to weekly workbook") 

Dim subjects() As String 
subjects = Split("Reading,Writing,Science", ",") 
Dim weeklySheet As Worksheet 
Dim monthlySheet As Worksheet 

Dim subject As String 
For Each subject In subjects 
    Set weeklySheet = Weekly.Worksheets(subject & " Weekly") 
    Set monthlySheet = Montly.Worksheets(subject & " Monthly") 
    MsgBox "Monthly sheet is " + monthlySheet.Name 
    MsgBox "Weekly sheet is " + weeklySheet.Name 
    '"Real" code here. 
Next 

Beachten Sie, dass Sie damit auch stark typisierte Referenzen wie Worksheet und String verwenden können, anstatt alles als Variant deklarieren zu müssen.

Verwandte Themen