VBA循环检查两个范围的条件

时间:2016-09-29 14:42:42

标签: vba excel-vba nested-loops excel

我在使用模拟器时遇到了问题。 我正在模拟送货服务(我在一家快餐公司工作)。

我需要一个通过循环检查几个条件的宏。

首先必须检查订单时间是否在一秒间隔内(此间隔也循环增加1秒,这是最外层的循环)并且如果订单是“暂停”或已经交付。

然后检查订单和将要交付的代理商是否来自同一家餐馆。 如果成立,则必须检查订单时间是否大于或等于交付代理可用的时间。

如果一切都成立,那么它将订单状态更改为“已交货”,它还会将交货代理的时间更改为回到餐厅的时间​​。最后,它为每个交付代理添加一个计数器,以查看每个交付代理的数量。

Sub loop1()


Application.ScreenUpdating = False

'Timer starts
Dim StartTime As Double
Dim MinutesElapsed As String
StartTime = Timer

'Defines last row for both ranges
Sheets("Reloj").Select
Dim Lastrow As Long
Lastrow = ActiveSheet.Range("K" & Rows.Count).End(xlUp).Row
Sheets("Embajadores").Select
Dim Lastrow2 As Long
Lastrow2 = ActiveSheet.Range("f" & Rows.Count).End(xlUp).Row


Dim i As Integer
Dim rng As Range, pedido As Range
Set rng = (Worksheets("Reloj").Range("K12:K" & Lastrow))

Dim embajadores As Range, cell As Range
Set embajadores = (Worksheets("Embajadores").Range("f19:f" & Lastrow))



Sheets("Reloj").Select
'One second increment to this cell, which will begin at 13:00:00 for 
'little more than an hour.
For i = 1 To 3780
Cells(3, 3) = Cells(3, 3) + TimeSerial(0, 0, 1)
ActiveSheet.Calculate

'Start looping for each order 
        For Each pedido In rng
'Start looping for each delivery agent
            For Each cell In embajadores
            Sheets("Reloj").Select
'Check if the order time is between the two times (cells 3,3 is current time
'and cells 3,4 is one second more than 3,3)
            If pedido.Value >= Cells(3, 3) And pedido.Value < Cells(3, 4) And pedido.Offset(0, 1) = "Waiting" Then
'Checks if the order is coming in from the same restaurant 
                If pedido.Offset(0, 2) = cell.Offset(0, -1) Then
'Checks if the order time is greater than or equal than the delivery agent availability time
                        If pedido.Value >= cell.Value Then
                            'Changes the status to delivered
                                pedido.Offset(0, 1) = "Delivered"
                                Worksheets("Reloj").Calculate
                             'Changes the agent availability time to the delivery time of the specific order
                                cell.Value = pedido.Offset(0, 9)
                             'Adds one to the order counter
                                cell.Offset(0, 1) = cell.Offset(0, 1) + 1

                       End If
              End If
          End If
       Next cell
    Next pedido


Next i

'Finishes timer and shows MsgBox
    MinutesElapsed = Format((Timer - StartTime) / 86400, "hh:mm:ss")
MsgBox "The simulation ran in " & MinutesElapsed & " minutes", vbInformation

    Application.ScreenUpdating = True

End Sub

我现在看到的问题首先是循环非常慢,我相信这是因为它检查每次迭代的订单和交付代理。我认为这不是必要的,因为它首先应检查订单时间是否在两个时钟时间之间,以及订单是否处于“等待”状态。我理解这个问题,但一直无法解决。

第二个但最重要的是,我无法正确退出循环。这意味着循环工作正常,它正确地经历了所有条件。但是,当检查订单时间是否大于可用时间(在检查它是同一餐厅之后)并且没有任何递送代理适用于该条件时,它只是跳过它。 我希望它能在交货时间中插入时钟时间,如下所示:

Else
pedido.Value = Cells(3,3).Value + TimeSerial(0, 0, 1)

当我尝试这个时它没有用,因为它没有首先遍历每一行,它只是在第一次没有满足条件时退出到Else。

请帮助,我理解我的语法非常差,因为我不是编码员而且英语不是我的第一语言。

以下是我的表格示例:

rng

the first column is my order time
second column is status
third column is restaurant

Order table (called rng)

embajadores:

first column restaurant, 
second column is availability time, 
third column is order counter

Delivery agent table (called embajadores)

请帮助,我知道我已经接近了,但我无法获得最后的最后一部分。

-----------------------编辑----------------------- --------------------------------------------------

我现在遇到的问题是这样的,我将用一个例子来解释它: 让我们想象一下,餐厅1的所有送货代理商都在街上,他们都在下午1:15回来。但是,该餐厅的订单是在下午1:13进行的。

现在,它正在跳过该事务,因为它们都没有达到条件(我无法发布此图像)

正如你所看到的,它跳过了餐厅Zona 4的所有3笔交易,因为它没有找到送货代理。我想要的是我希望延迟这些订单(我考虑增加一秒的时间,直到一个交付代理达到这个条件)。

(无法发布此图片)

所有这些代理人在下订单后都进来了,因此没有分配订单。

我知道我现在没有Else条件,但我不知道如何做到这一点。请帮忙。另外,如果我放置

Else
pedido.Value = Cells(3,3).Value + TimeSerial(0, 0, 1)

在最里面然后当它发现第一个不适合条件的观察时,它会让我离开循环,即使可能有一个可用的代理进一步向下。

0 个答案:

没有答案