Перебор диапазона переменных

#excel #vba #do-while

#excel #vba #делать-пока

Вопрос:

Я довольно новичок в написании сценариев Excel VBA, но я пытаюсь создать скрипт, который сокращает посещаемость мероприятия на основе времени его начала и окончания. Прямо сейчас у меня есть таблица, в которой показана посещаемость мероприятия, распределенная по всем задействованным комнатам, но показано, что посещаемость составляет 24 часа в сутки. Итак, я создаю цикл Do While, который установит посещаемость равной нулю для периодов, выходящих за рамки времени начала и окончания, и заполнит таблицу номерами посещаемости в течение этого времени события.

Проблема в том, что у меня возникают проблемы с перемещением через диапазон времени события. Это таблица, которую я пытаюсь заполнить для справки.

 Date    Useage  Event Time  Meeting Room 1  Meeting Room 2  Meeting Room 3
01-01-18    3   12:00 AM                                        
01-01-18    3   01:00 AM                                        
01-01-18    3   02:00 AM                                        
01-01-18    3   03:00 AM                                        
01-01-18    3   04:00 AM                                        
01-01-18    3   05:00 AM                                        
01-01-18    3   06:00 AM                                        
01-01-18    3   07:00 AM                                        
01-01-18    3   08:00 AM                                        
01-01-18    3   09:00 AM                                        
01-01-18    3   10:00 AM                                        
01-01-18    3   11:00 AM                                        
01-01-18    3   12:00 PM                                        
01-01-18    3   01:00 PM                                        
01-01-18    3   02:00 PM                                        
01-01-18    3   03:00 PM                                        
01-01-18    3   04:00 PM                                        
01-01-18    3   05:00 PM                                        
01-01-18    3   06:00 PM                                        
01-01-18    3   07:00 PM                                        
01-01-18    3   08:00 PM                                        
01-01-18    3   09:00 PM                                        
01-01-18    3   10:00 PM                                        
01-01-18    3   11:00 PM                                        
01-02-18    3   12:00 AM                                        
01-02-18    3   01:00 AM                                        
  
 Dim x As Double
Dim y As Double

Dim startTime As Double
Dim eventTime As Range

x = 0
y = 0

startTime = ActiveWorkbook.Sheets("Attendance").Range("H3")
Set eventTime = ActiveWorkbook.Sheets("Time Occupancy Analysis").Range("C2")

            Do While (startTime >= eventTime) And y <= 24
                Do While (startTime >= eventTime) And x <= 36
                    eventTime.Offset(0, x   1) = 0
                    x = x   1
                    Loop
                x = 0
                Sheets("Time Occupancy Analysis").Range("D2").Offset(y   1, 0) = 0
                y = y   1
                eventTime = eventTime   0.04167 'This is where the problem exists'
                Loop
  

Я надеюсь, что код будет выводить значения 0 для посещаемости до тех пор, пока время начала события не станет равным времени события. При запуске он изменяет время события вместо того, чтобы перемещаться по диапазону времени события (12:00, 1:00, 2:00 и т.д.)

Комментарии:

1. eventTime будучи Range , eventTime = whatever неявно выполняет eventTime.Value = whatever , т.е. «изменяет время события» (записывает в C2 ). Вы имеете в виду Set eventTime = eventTime.Offset(1) или что-то подобное?

2. Я. Я видел, что он изменяет время события в C2. Однако мое намерение состоит в том, чтобы он считывал время события в C2 (12: 00 утра), затем, после заполнения соответствующей строки 0, я хочу, чтобы он переместился к следующему времени события (1: 00 утра) и заполнил эту строку 0. И продолжайте это до тех пор, пока время события не станет равным времени начала.

3. Да, это в буквальном смысле то, что Set eventTime = eventTime.Offset(1) было бы сделано: вместо записи в eventTime диапазон ( C2 ) вы бы устанавливали его в ячейку под ним на каждой итерации.

4. Обратите внимание, что выражения цикла, вероятно, тоже необходимо скорректировать; Я бы подумал, что Do While {expression} выражение каждый раз пересчитывается, так что это может настроить вас на бесконечный цикл (или довольно косвенное спасение, когда startTime значение «больше» того, что оценивается как Variant/Empty в первой пустой строке). Вместо этого рассмотрите более простой подход, такой как For цикл, который выполняется от 2 до последней строки на этом листе.

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