2016-04-20 4 views
0

Ich arbeite an einem Makro, das eine visuelle Darstellung der 4 verschiedenen Produktionsphasen eines Produkts, das wir produzieren, bietet. Die Tabelle ist so angelegt, dass sie als linearer Kalender erscheint, der alle 365 Tage des Jahres anzeigt und sie in Kalenderwochen gruppiert. Jede Produktionsphase hat eine andere Farbe. Die vier Bauphasen sind: 1) Montage: 1 Tag (gelb) 2) Erstanalyse: 1 Tag (lila) 3) Tiefenanalyse: 7 Tage (grün) 4) Versand: 1 Tag (rot)Ein Makro, das Einschränkungen in der Planung nicht richtig erkennt

Nr Arbeiten werden an Wochenenden oder Feiertagen in der Einrichtung durchgeführt. Samstage und Sonntage werden durch schwarz gefärbte Zellen dargestellt, während Feiertage durch orangefarbene Zellen mit einem Kreuzmuster dargestellt werden. Das Makro wird entwickelt, um diese Feiertage überspringen die mit folgenden wenn dann Anweisung:

Dim i As Integer 

i = Analysis days 

for i = 1 to 7 

ActiveCell.Select 

If Selection.Interior.Pattern = x1CrissCross And Selection.Interior.Color = orange Then 

    ActiveCell.Offset(0, 1).Select 

Else: ActiveCell.Select 

End If 

If Selection.Interior.Color = black Then 

    ActiveCell.Offset(0, 2).Select 

Else: ActiveCell.Select 

End If 

Die If Then-Anweisung, die das Makro sagt überspringen Samstag und Sonntag jedes Mal funktioniert. Aber die Aussage, die dem Makro sagt, dass Ferien ausgelassen werden sollen, arbeitet nur einen Teil der Zeit, und wenn die Ferien länger als ein paar Tage dauern (Weihnachtsferien dauern neun Tage), fügt das Makro Produktionsarbeitstage während des Urlaubs ein. Ich habe festgestellt, dass das Kopieren und Einfügen der obigen Anweisungen direkt hintereinander mehrere Male eine schnelle Lösung des Problems bietet. Aber ich bin mir sicher, dass es einen effizienteren Weg dafür geben muss. Kennt jemand eine Art, wie ich das Problem beheben kann, ohne die gleichen Codezeilen mehrfach kopieren und einfügen zu müssen?

Vielen Dank im Voraus!

+0

Das ist ziemlich ehrgeizig^_ ^; – findwindow

+0

Es ist mühsam, es von Hand zu färben, aber das ist viel weniger mühsam als die für ein Makro erforderliche Logik? – findwindow

+0

Ahh, ich *** sehr *** schlagen Sie vor, lesen Sie durch [Wie zu vermeiden '.Select '] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel -vba-macros), erspart Ihnen viele Kopfschmerzen und hilft Ihnen zu lernen, wie VBA funktioniert/denkt. – BruceWayne

Antwort

0

Eines Ihrer Probleme ist mit der Logik Ihrer Schleife zu tun, weil Sie immer die nächste Zelle "verarbeiten", ohne sie zu testen (für die Feiertage). Wie oben erwähnt, sollte der x1crisscross auch xlcrisscross sein, und ich denke nicht, dass orange eine "definierte" Farbe ist, also müssen Sie möglicherweise den Wert dafür ermitteln und dagegen testen (siehe unten myorange).

Eine Schleife wie dies würde das vermeiden:

' I think you need to need to define what color orange is - as its not one of the "standard" named ones 
myOrange = 4626167 

For i = 1 To 7 
    Debug.Print Selection.Interior.Color 
    Debug.Print Selection.Interior.Pattern 

    If (Selection.Interior.Color = black Or (Selection.Interior.Color = myOrange And Selection.Interior.Pattern = xlCrissCross)) Then 
     ' skip this one so decrement counter 
     i = i - 1 
    Else 
     ' Do the "stuff" for a valid cell here - for testing I just put the counter in the cell 
     ActiveCell.Value = i 
    End If 
    ' move to next cell 
    ActiveCell.Offset(0, 1).Select 
Next i 

Persönlich habe ich nie mit dem „Zähler“, wie dies wie das Hantieren, es ist nur unordentlich scheint es zu verringern.

Die andere Möglichkeit, den gleichen Effekt zu erzielen, besteht darin, innerhalb der for/next-Schleife eine Schleife zu haben, die solange prüft, bis eine gültige Zelle gefunden wird.

myOrange = 4626167 

For i = 1 To 7 
    found1 = False 
    While Not found1 
     If Not (Selection.Interior.Color = black Or (Selection.Interior.Color = myOrange And Selection.Interior.Pattern = xlCrissCross)) Then 
      found1 = True 
     Else 
      ' move to next cell as this one isnt available 
      ActiveCell.Offset(0, 1).Select 
     End If 
    Wend 
    ' Do the "stuff" for a valid cell here 
    ActiveCell.Value = i 
    ' move to next cell 
    ActiveCell.Offset(0, 1).Select 

Next i 

Ich habe auch den Test für Wochenenden (schwarz) und Feiertagen in die gleiche If-Anweisung (die Klammern bemerken, dass die oder zu machen und und verarbeitet werden, richtig). Ich neige dazu, sie immer nur zu setzen, um sie klarer zu machen.

Natürlich könnten Sie all dies mit einem Zähler und "Bereich" usw. tun ... und nicht die Zelle auswählen, aber das Endergebnis wird gleich sein.

Beide Methoden können für immer "loopen", wenn es keine gültigen Zellen mehr gibt. Es lohnt sich also, die maximale Anzahl von Spalten zu testen und auszubrechen, wenn Sie das erreichen.

+0

Danke NanoTera. Ich denke, das ist, was ich suche. Ich weiß es zu schätzen, dass Sie sich die Zeit genommen haben –

Verwandte Themen