2016-04-20 25 views
0

我正在研究一個宏,它提供了我們生產的產品的4個不同生產階段的可視化表示。電子表格設置爲線性日曆,顯示一年中的所有365天,並將其分組到日曆周。每個生產階段都有與之相關的不同顏色。 4)組裝:1天(黃色)2)初始分析:1天(紫色)3)深入分析:7天(綠色)4)運輸:1天(紅色)宏在調度中沒有正確識別約束

否工作在週末或節假日進行。星期六和星期日由黑色的單元格表示,節假日由橙色單元格表示,並具有十字形格局。宏設計爲通過跳過這些假期,如果再聲明如下:

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 

的如果Then語句,它告訴宏跳過週六和週日屢試不爽。但是,讓宏觀跳過節假日的聲明只是部分時間,如果假期持續時間超過幾天(聖誕節假期持續九天),宏將插入整個節假日穿插的生產工作日。我發現,將上述語句直接複製並粘貼到彼此之下好幾次似乎能夠快速解決問題。但我相信必須有一個更有效的方式來做到這一點。有沒有人知道我可以解決這個問題,而不必複製和粘貼多行代碼的方法?

在此先感謝!

+0

這是非常雄心勃勃的^ _ ^; – findwindow

+0

手工着色很乏味,但這可能比宏觀所需的邏輯少得多? – findwindow

+0

啊,我***高度***建議你通讀[如何避免'.Select'](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel -vba-macros),它將爲您節省很多麻煩,並且將幫助您瞭解VBA如何工作/認爲。 – BruceWayne

回答

0

你的問題之一是你的循環的邏輯,因爲你總是「處理」下一個單元而不測試它(假期)。同樣如上所述,x1crisscross應該是xlcrisscross,我不認爲橙色是一種「定義」的顏色,因此您可能需要獲取該值並對其進行測試(請參閱下面的myorange)。

像這樣的循環會避免:

' 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 

個人而言,我從來沒有像與「反」像這樣的擺弄,它只是似乎凌亂遞減它。

獲得相同效果的另一種方法是在for/next循環中有一個循環,該循環會一直檢查直到找到有效的單元格。

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 

我還增加了對週末(黑色)和節假日考不上相同的,如果語句(注意括號,以確保或和,並正確處理)。我總是傾向於把它們放在更清楚的地方。

當然,你可以使用計數器和「範圍」等來做所有這些,而不是選擇單元格,但最終結果將是相同的。

如果沒有更多的有效單元格,這兩種方法都會「永久」循環,所以它可能值得測試某些最大列數,如果達到那個值就會出現。

+0

謝謝NanoTera。我認爲這是我正在尋找的。我感謝你抽出時間 –