«Сброс» коллекций после запуска сценария VBA - PullRequest
0 голосов
/ 14 ноября 2018

Я не уверен, почему VB делает это, так как у меня нет большого опыта. В основном, когда я запускаю свой скрипт в первый раз, результат получается именно таким, как я ожидал, но во второй раз он выглядит совершенно неправильно.

Вот код:

'define queue type
Dim Queue As New Collection


'define job list
Dim JobList As New Collection

'loop parameters
Dim rng As Range, rng2 As Range
Dim rng_w As Range, rng_w2 As Range

Dim TimeRange As Double




'loop over list and get jobs at frequency
Dim i As Double
Dim j As Integer



Sub Generate_Queue()
ThisWorkbook.Sheets("AGV capacity").Activate
Set rng = Range("L6:L7")
Set rng2 = Range("M6:M7")

'fill JobList

Dim Frequencies As Range
Set Frequencies = rng
Dim Jobs As Range
Set Jobs = rng2
Dim dividend

TimeRange = ThisWorkbook.Sheets("AGV capacity").Range("O6") * 3600



For i = 1 To rng.Count
    Set tmp = New Transport
    tmp.Frequency = (TimeRange / Frequencies(i))
    tmp.SourceDest = Jobs(i)
    JobList.Add tmp
Next i

i = 1

'while loop over time range (e.g. 24 hours)
While i < TimeRange
    'for loop over number of entries in job list
    For j = 1 To JobList.Count
        'check if i is mod Frequency, meaning it should be added to the queue
        If ((i Mod JobList(j).Frequency) = 0) Then
            Set tmp = New Transport
            dividend = (i / JobList(j).Frequency)

            tmp.Frequency = ((dividend * JobList(j).Frequency) / 3600)
            tmp.SourceDest = JobList(j).SourceDest
            Queue.Add tmp
        End If
    Next j
i = i + 1
Wend

ThisWorkbook.Sheets("order queue").Activate
Set rng_w = Range("A2", "A" & Queue.Count)
Set rng_w2 = Range("B2", "B" & Queue.Count)

i = 1

For i = 1 To 1000
    rng_w(i).Value = ""
    rng_w2(i).Value = ""

Next i

For i = 1 To Queue.Count
    rng_w(i).Value = Queue(i).Frequency
    rng_w2(i).Value = Queue(i).SourceDest

Next i  
End Sub

Я работаю над двумя разными листами Excel, но прочитанные данные остаются одинаковыми на протяжении двух прогонов. Когда я смотрю разные коллекции, они изменяются с одним и тем же набором данных, а иногда даже создаются дважды! Исходя из других языков, я ожидал, что они будут удаляться при каждом запуске, но, похоже, это не так. Как я могу "сбросить" эти объекты?

1 Ответ

0 голосов
/ 14 ноября 2018

Ответ заключается в том, чтобы не использовать ключевое слово New, когда вы изменяете яркость переменной, особенно когда вы определяете ее вне процедуры, поскольку вы не можете напрямую контролировать, когда она будет создана.

Если вам нужно, чтобы Queue и JobList были доступны более широко, тогда они определены в правильном месте, но когда вы выполняете Generate_Queue, вероятно, именно тогда вам следует создать переменные.

Итак, в верхней части вашего модуля:

Dim Queue As Collection
Dim JobList As Collection

И в Generate_Queue:

Set Queue = New Collection
Set JobList = New Collection

Таким образом, каждый раз, когда вызывается Generate_Queue, эти две переменные создаются заново (если вы хотите этого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...