VBA EXCEL Несколько вложенных циклов FOR, которые устанавливают две переменные для выражения - PullRequest
2 голосов
/ 13 марта 2012

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

T является местом назначения для выражения выражения t.Value = time1 - time2
Y является установленным временем и датой, которое не изменяется = time1
X является временем и датой и имеетбыть извлеченным из диапазона в том же столбце, что и соответствующий y.x= time 2

Я загрузил соответствующий сегмент моей рабочей книги

https://docs.google.com/open?id=0BzGnV1BGYQbvMERWU3VkdGFTQS1tYXpXcU1Mc3lmUQ

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

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

Вот цикл, который у меня есть. Я удалил беспорядок, который сделал, пытаясь заставить его работать.

Sub stituterangers()
Dim dify As Boolean
Dim difx As Boolean
Dim time2 As Date
Dim time1 As Date

For Each t In range("d7:cv7")
       For Each x In range("d8:cv11")
             If x > 0 Then time2 = x           
           For Each y In range("d2:cv2")
            time1 = y                     
        t.Value = time1 - time2
        t = 0
                Next y
      Next x
Next t
End Sub 


Sub stituterangersNEW()
Dim t As range
Dim x As range
Dim dify As Boolean
Dim difx As Boolean
Dim time2 As Date
Dim time1 As Date

On Error Resume Next

    'Looping through each of our output cells.
    For Each t In range("d7:cv7")



     For Each y In range("d2:cv2")
            If t.Column = y.Column Then
            time1 = y.Value
             If y = 0 Then Exit Sub
                End If

        For Each x In range("d8:cv11")
            'Check to see if our dep time corresponds to
            'the matching column in our output
            If t.Column = x.Column Then

                If x > 0 Then
                    time2 = x.Value

                    t.Value = time1 - time2

                    Exit For
                End If
            End If


            Next x

        Next y
    Next t

End Sub

1 Ответ

1 голос
/ 13 марта 2012

В данный момент я не могу получить доступ к вашему файлу Google Docs, но есть некоторые проблемы с вашим кодом, на которые я попытаюсь ответить при ответе

Sub stituterangersNEW()
Dim t As Range
Dim x As Range
Dim dify As Boolean
Dim difx As Boolean
Dim time2 As Date
Dim time1 As Date

    'You said time1 doesn't change, so I left it in a singe cell.
    'If that is not correct, you will have to play with this some more.
    time1 = Range("A6").Value

    'Looping through each of our output cells.
    For Each t In Range("B7:E9") 'Change these to match your real ranges.

        'Looping through each departure date/time.
        '(Only one row in your example. This can be adjusted if needed.)
        For Each x In Range("B2:E2") 'Change these to match your real ranges.
            'Check to see if our dep time corresponds to
            'the matching column in our output
            If t.Column = x.Column Then
                'If it does, then check to see what our time value is
                If x > 0 Then
                    time2 = x.Value
                    'Apply the change to the output cell.
                    t.Value = time1 - time2
                    'Exit out of this loop and move to the next output cell.
                    Exit For
                End If
            End If
            'If the columns don't match, or the x value is not a time
            'then we'll move to the next dep time (x)
        Next x
    Next t

End Sub

EDIT

Я изменил ваш рабочий лист для игры (см. Выше для нового Sub). Это, вероятно, не соответствует вашим потребностям напрямую, но, надеюсь, это продемонстрирует концепцию того, что, я думаю, вы хотите сделать. Помните, что этот код не соответствует всем лучшим рекомендациям по кодированию, которые я бы порекомендовал (например, проверка времени на самом деле - это ВРЕМЯ, а не случайный другой тип данных).

     A                      B                   C                   D                  E
1    LOAD_NUMBER            1                   2                   3                  4
2    DEPARTURE_TIME_DATE    11/12/2011 19:30    11/12/2011 19:30    11/12/2011 19:30    11/12/2011 20:00                
4    Dry_Refrig 7585.1  0   10099.8 16700
6    1/4/2012 19:30

Используя сабвуфер, я получил такой вывод:

    A           B             C             D             E
7   Friday      1272:00:00    1272:00:00    1272:00:00    1271:30:00
8   Saturday    1272:00:00    1272:00:00    1272:00:00    1271:30:00
9   Thursday    1272:00:00    1272:00:00    1272:00:00    1271:30:00
...