我正在Excel中制定此计划,如果我在特定班次只安排一个人,我会通知我。那么宏对我所附加的特定列表的影响是什么,并检查它们的开始时间和结束时间。如果我在特定时间安排某人,如果有其他人重叠,我希望宏告诉我。以下代码正在运行,但现在我正在测试它是否有效我将一个名称,app服务器运行,开始时间和结束时间。所以宏遍历一个循环来检查我在excel上提供的表,但是我得到了一个错误的时间。例如,如果我将开始时间设置为早上6:00,结束时间设置为早上6:30,并且在桌子上提供了我在运行该应用程序的其他人在上午5:59的行时间到rowendtime = 6:35 am它应该向我展示一个“冲突”,因为它们是重叠但由于某种原因它显示“没有冲突”任何帮助都会非常感激。这是代码:
Public Sub LoopRows(Appserver As String, StartTime As Date, EndTime As Date)
Dim x As Integer
Dim NumROws As Integer
NumROws = Range("Sheet3!C5").End(xlDown).Row - Range("Sheet3!C5").Row
Worksheets("Sheet3").Activate
Range("Sheet3!C5").Select
msgbox Appserver
msgbox StartTime
msgbox EndTime
For x = 1 To NumROws
ActiveCell.Offset(1, 0).Select
If (ActiveCell.Offset(0, 1).Value = Appserver) Then
Dim RowStartTime As Date
Dim RowEndTime As Date
msgbox ActiveCell.Offset(0, 1).Value
msgbox RowStartTime = Val(ActiveCell.Offset(0, 3).Value)
msgbox RowEndTime = Val(ActiveCell.Offset(0, 4).Value)
If (((EndTime > RowStartTime) And (EndTime < RowEndTime)) Or (((StartTime > RowStartTime) And (StartTime < RowEndTime))) Or (((StartTime < RowStartTime) And (EndTime > RowEndTime)))) Then
msgbox "Conflict"
Else
msgbox "noConflict"
End If
End If
Next
End Sub
答案 0 :(得分:0)
简化您的If
条件。如果没有一个开始时间落在另一个跨度的开始和结束之间,则两个时间跨度不可能重叠:
部分重叠案例:
Start1 End1
|----------------------------|
Start2 End2
|---------------------|
完成重叠案例:
Start1 End1
|----------------------------|
Start2 End2
|----------------|
您可以将If
条件设为:
If (StartTime > RowStartTime) And (StartTime < RowEndTime) Or _
(RowStartTime > StartTime) And (RowStartTime < EndTime) Then
修改:它应该更像下面的代码。请注意,我从原始代码中假设“Appserver”值在列“F”中,开始时间在列“H”中,结束时间在列“I”中。 CDate
来电也没有错误检查(但是Val
来电也没有。)
Public Sub LoopRows(Appserver As String, StartTime As Date, EndTime As Date)
Dim CurrentRow As Integer, LastRow As Integer
Dim RowStartTime As Date, RowEndTime As Date
With Worksheets("Sheet3")
LastRow = .Range("C" & .Rows.Count).End(xlUp).Row
For CurrentRow = 6 To LastRow
If (.Cells(CurrentRow, 6).Value = Appserver) Then
RowStartTime = CDate(.Cells(CurrentRow, 8).Value)
RowEndTime = CDate(.Cells(CurrentRow, 9).Value)
If (StartTime > RowStartTime) And (StartTime < RowEndTime) Or _
(RowStartTime > StartTime) And (RowStartTime < EndTime) Then
MsgBox "Conflict"
Else
MsgBox "noConflict"
End If
End If
Next
End With
End Sub