2016-05-31 6 views
0

Ich habe einen Code geschrieben, um das Farbformat bestimmter Zellen jedes Blattes zu ändern (ich habe 12 ähnliche Blätter [Blätter (1) -Sheets (12)] und ein Übersichtsblatt (Tabellen (13))Warum Makro für Blätter (13) bedeutet, die auf Blättern ausgeführt werden (12)

Wenn ich es ausführe, wird der Code, der auf Sheets (13) ausgeführt werden soll, in Sheets (12) ausgeführt.Natürlich kann ich den Code trennen und den Code für 13 Blatt ausschließlich ausführen, aber ich würde gerne verstehen, warum es nicht funktioniert.

Sub forEachWs() 
Dim x As Long 
Dim ws As Sheets 

For x = 1 To 12 
ThisWorkbook.Sheets(x).Activate 
    Call changecolormonths 
    Range("A2").Select 
Next x 

If x = 13 Then 
Call changesummarycolor 'this is the code that is wrongly executed at sheet 12 
End If 
End Sub 
+1

Jetzt, da Sie den Code geändert haben, macht mein Kommentar keinen Sinn. aber mit dem neuen Code aktivieren Sie Blatt 13 nicht, so dass es das letzte aktive Blatt verwendet, das 12 ist. –

+3

Sie sollten das Blatt als Variable in den Unterordner 'changesummarycolor' übergeben und die gesamte Aktivierung vermeiden. –

+1

x = 13 wegen der 'for' Schleife. Das nächste x nach 12 ist 13 und die Schleife endet. Aber selbst wenn x 13 ist, lief der Code innerhalb der Schleife nicht für x = 13 (nur für x von 1 bis 12). Am einfachsten ist es, ein 'thisworkbook.Sheets (13) .activate 'vor dem Aufruf von' oldesummarycolor' hinzuzufügen, auch wenn ich nicht mit der Übersteuerung von 'select' oder' activate' arbeite. –

Antwort

0

Sie explizit Code sollten. die Verwendung von Select und ActiveWorksheet vermeiden. verweisen Sie nicht ein Bereich ohne Angabe des Bogens vorne (auf dem Sie einen bestimmten Bereich verwenden möchten). Erlauben Sie VBA nicht, Annahmen für Sie zu treffen, sondern teilen Sie VBA mit, was Sie wollen. Sei genau.

Hier ist Ihr Code mit expliziten Referenzen umgeschrieben. Dies sollte dein Problem lösen.

Option Explicit 

Sub forEachWs() 

Dim ws As Worksheet 
Dim wsSUM As Worksheet 
Dim bolfound As Boolean 

bolfound = False 
For Each wsSUM In ThisWorkbook.Worksheets 
    If wsSUM.Name = "Summary" Then 
     bolfound = True 
     Exit For 
    End If 
Next wsSUM 
If bolfound = False Then 
    MsgBox "Couldn't find the summary sheet." & Chr(10) & "Aborting..." 
    Exit Sub 
End If 

For Each ws In ThisWorkbook.Worksheets 
    If ws.Name <> wsSUM.Name Then 
     Call changecolormonths(ws, wsSUM) 
     ws.Activate 
     ws.Range("A2").Select 
    Else 
     Call changesummarycolor(wsSUM) 
    End If 
Next ws 

End Sub 

'below code are meant for Sheets(1) to Sheets(12) 
Sub changecolormonths(ws As Worksheet, wsSUM As Worksheet) 

Dim headercolor As Long 
Dim proccolor As Long 

headercolor = wsSUM.Range("B24").Value 
proccolor = wsSUM.Range("B25").Value 

With ws 
    .Range("A1:H1,L8:M8,K16:M16,L32:N32,L40:N40").Interior.Pattern = xlSolid 'header,total color 
    .Range("A1:H1,L8:M8,K16:M16,L32:N32,L40:N40").Interior.ColorIndex = headercolor 

    .Range("A1:H1,L8:M8,K16:M16,L32:N32,L40:N40").Font.ColorIndex = 2 

    .Range("K9:K15,K33:K39").Interior.Pattern = xlSolid 'procedure 
    .Range("K9:K15,K33:K39").Interior.ColorIndex = proccolor 
End With 

End Sub 

'below code are meant for Sheets(13) 
Sub changesummarycolor(wsSUM As Worksheet) 

Dim headercolor As Long 
Dim proccolor As Long 

With wsSUM 
    headercolor = .Range("B24").Value 
    proccolor = .Range("B25").Value 

    .Range("B4:N4 , A12: N12 , N5: N11").Interior.Pattern = xlSolid 'summary header,total color 
    .Range("B4:N4 , A12: N12 , N5: N11").Interior.ColorIndex = headercolor 

    .Range("B4: N4 , A12: N12 , N5: N11").Font.ColorIndex = 2 'summary procedure 

    .Range("A5:A11").Interior.Pattern = xlSolid 
    .Range("A5:A11").Interior.ColorIndex = proccolor 
End With 

End Sub 

Beachten Sie, dass ich Ihre Excel-Datei nicht und kann daher nicht den obigen Code testen konnte. Ich habe es nur von oben aufgeschrieben. Daher könnte es notwendig sein, etwas zu optimieren. Die Änderungen waren jedoch minimal und ich bin mir ziemlich sicher, dass es wie geplant laufen sollte. Aber zögern Sie nicht, mir zu sagen, wenn etwas schief geht. :)

+0

Endlich Kann es versuchen, Ihren Code .. Es gibt Fehler "Kompilierfehler: Methode oder Datenelement nicht gefunden", wenn es an die Unterroutine sub changecolormonths (ws als Arbeitsblatt, wsSUM als Arbeitsblatt), auch, tut Ihnen etwas zu erklären, wann sollten wir schreibe so [changecolormonths (ws, wsSUM)] - rufe das Unterprogramm auf und habe etwas in Klammern dahinter? –

+0

Ich habe nur zwei kleine Anpassungen am Code vorgenommen. Jetzt funktioniert es einwandfrei. Ich bin mir jedoch nicht sicher, ob Sie 'headercolor = .Range (" B24 ") schreiben möchten. Value' oder' headercolor = .Range ("B24"). Interior.ColorIndex'. Ich werde es Ihnen überlassen, es bei Bedarf anzupassen. Die eckigen Klammern, die Sie vorschlagen, sind nicht notwendig (wie Sie im obigen Code sehen können). Deine Frage: "... etwas in Klammern dahinter?" Verstehe ich nicht ganz. Bitte erläutern Sie, was Sie damit erreichen wollen. – Ralph

Verwandte Themen