我如何安排时间安排在vba上

时间:2016-08-01 03:09:08

标签: excel vba macros

我正在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

1 个答案:

答案 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