2016-07-16 4 views
1

Ich schreibe gerade ein einfaches Makro, um zu bestimmen, wer in welchem ​​Zeitfenster geplant ist, und dieses Zeitfenster auf einem anderen Blatt aufzuzeichnen. Alles funktioniert gut, bis der Name der Person, die sich auf dem letzten Zeitfenster befindet, mit dem letzten Zeitfenster verglichen wird. An diesem Punkt geht die for-Schleife "j" auf -1 und bewirkt, dass das Makro ausläuft.Einfache verschachtelte For-Loops, die mit 1004 Fehler ausstoßen

Ich habe meinen gesamten Code unten enthalten, aber das ist die Linie, die die Punkte Debugger watchStation = ActiveSheet.Cells (j, k) .Value

Dim mySheet As Worksheet, masterSheet As Worksheet, myBook As Workbook 'Define your workbooks and worksheets as variables 

    Option Compare Text 'Makes string comparisons case IN-sensitive 

    Sub Watch_Bill() 

    Set myBook = Excel.ActiveWorkbook 
    Set masterSheet = Sheets("Musters") 
    MsgBox masterSheet.Name 

    Dim memberName, memberFirstWatch, memberSecondWatch As String 
    Dim lastRow As Integer 
    Dim watchStation, watch As String 

    lastRow = masterSheet.Range("A1").CurrentRegion.Rows.Count 
    'lastColumn = ActiveSheet.Range("A1").CurrentRegion.Columns.Count 

    'Cycle through each member of the duty section 
    For i = 2 To lastRow 
     memberName = masterSheet.Cells(i, 2).Value 

     'Cycle through watch bill to find member's watches 
     For j = 9 To 18  'Row 9 starts the section of the watchbill that contains watches 
      'MsgBox j 
      For k = 2 To 9 'Column 2 through 9 contain watches 
       watchStation = ActiveSheet.Cells(j, k).Value 

       'MsgBox watchStation 
       If InStr(watchStation, memberName) <> 0 Then 

        'Determine what watch station member is on 
        If j = 9 Or j = 10 Then 
         watch = "0700-1200" 
        ElseIf j = 11 Or j = 12 Then 
         watch = "1200-1700" 
        ElseIf j = 13 Or j = 14 Then 
         watch = "1700-2200" 
        ElseIf j = 15 Or j = 16 Then 
         watch = "2200-0200" 
        Else: j = 17 Or j = 18 
         watch = "0200-0700" 
        End If 
        'MsgBox "Found member" 

        'Check if member already had watch 
        If memberFirstWatch = "" Then 
         'MsgBox "member's first watch" 
         memberFirstWatch = watch 
        Else 
         'MsgBox "member's second watch" 
         memberSecondWatch = watch 
        End If 

        'Fill in member's watch times on muster sheet 
        masterSheet.Cells(i, 11).Value = memberFirstWatch 
        masterSheet.Cells(i, 12).Value = memberSecondWatch 
       End If 
      Next k 
     Next j 

     memberFirstWatch = "" 
     memberSecondWatch = "" 

    Next i 

    End Sub 

Vielen Dank für jede Hilfe jedermann sind zur Verfügung stellen kann. Das macht mich verrückt und ich habe es seit Stunden nicht mehr herausgefunden.

+0

Ich denke, Sie müssen die Else am Ende zu einem anderen ElseIf ändern. Wie es jetzt ist, setzen Sie j auf True (17 ODER j = 18). –

Antwort

1

Doug hat Recht. Ich werde versuchen zu erklären, was passiert. Jeder fühlt sich frei, mich zu korrigieren.

Als Doug wies darauf hin, das Problem ist die Linie

j = 17 Or j = 18 

Da es keine If ist, versucht VBA es als eine Zuordnung von j

j = (17 Or j = 18) 

Nun, was 17 Or j = 18 ist zu bewerten? Die rechte Seite j = 18 ist True, weil j in diesem Moment 18 ist. So haben wir

j = (17 Or True) 

Nun könnte man sagen, dass anything Or True immer wahr ist, aber wir können ein wenig tiefer gehen. Wie benutzt man einen Or mit Zahlen? Sie verwenden den bitweisen Vergleich der Binärzahlen, z.

00001011 
Or 00010010 
----------- 
= 00011011 

Wir machen das gleiche im Umgang mit Zahlen und booleans. False wird als alle 0s gespeichert und True wird als alle 1s gespeichert, was genau das gewünschte Verhalten mit Not, And, Or, XOr ergibt. Z.B. anything Or True wird:

xxxxxxxx 
Or 11111111 
----------- 
= 11111111 

Natürlich nur 1 Bit verwenden würde auch zeigen das gleiche Verhalten, aber wir haben keine 1-Bit-Datentypen. Also 17 Or j = 18 ist True, die als 11...11 gespeichert ist, die -1 ist, wenn als eine ganze Zahl gelesen.

Beachten Sie, dass ich unterschiedliche Bytegrößen der Datentypen ignoriert habe.

VBA macht eine Menge implizite Konvertierung für Sie, die schön sein kann, vor allem für Zahlen < -> Strings, aber es kann zu Problemen führen, die erst später im Code ersichtlich werden. Zum Beispiel wird versehentlich eine Zahl als String gespeichert und dann zu einer tatsächlichen Zahl hinzugefügt (die Zeichenfolge wird konvertiert). Wenn Sie jedoch zwei numerische Strings hinzufügen, verketten Sie diese.

+1

Deshalb liebe ich euch. Sie geben nicht nur schnell die richtige Antwort, sondern nehmen sich auch die Zeit zu erklären, warum es so ist. Super einfache Lösung, zu der ich nie hätte gehen müssen. Danke nochmal! –

Verwandte Themen