我正在研究一个宏,它提供了我们生产的产品的4个不同生产阶段的直观表示。电子表格设置为显示为线性日历,显示一年中的所有365天,并将其分组为日历周。每个生产阶段都有不同的颜色。四个构建阶段是:1)组装:1天(黄色)2)初步分析:1天(紫色)3)深入分析:7天(绿色)4)运输:1天(红色)
周末或节假日不在工厂内进行任何工作。星期六和星期日由黑色的细胞代表,假日用橙色的细胞代表,并且具有十字交叉的图案。该宏旨在使用以下if语句跳过这些假期:
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
告诉宏跳过星期六和星期日的If Then语句每次都有效。但是,告诉宏跳过假期的声明仅在部分时间内有效,如果假期持续时间超过几天(圣诞节假期持续9天),宏将在整个假期中插入生产工作日。我发现将上述陈述直接复制并粘贴在彼此之下几次似乎可以快速解决问题。但我相信必须有一种更有效的方法来做到这一点。有没有人知道我可以解决问题的方法,而无需多次复制和粘贴相同的代码行?
提前致谢!
答案 0 :(得分: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
我还将周末(黑色)和假日的测试添加到相同的If语句中(注意括号以确保or和and正确处理)。我总是倾向于把它们放在更清楚的地方。
当然,您可以使用计数器和"范围"来完成所有这些操作。等...而不是选择单元格,但最终结果将是相同的。
这两种方法都可以"如果没有更多有效的单元格,则永远循环,因此可能值得测试一些最大列数,如果达到该值则可能会爆发。