3

У меня есть контрольный лист, который перекрестно проверяет различные точки измерения воды, считывая средние значения примерно с тридцати различных метров из другой системы. Я автоматизировал этот контрольный лист, чтобы скрипт VBA мог запускать лист снова и снова для заданного диапазона дат (обычно один месяц за раз) и извлекать результаты на другую страницу.

В Великобритании было летнее время вчера (воскресенье 25 октября 2015 г.), и это вызывает у меня проблемы. Все измеренные показания дают мне «среднечасовой расход», и я умножил на 24, чтобы получить дневную норму. Но теперь я осознаю, что два дня в году 24 - неправильный множитель для использования.

Итак, учитывая Start_Date от 25/10/2015 00:00 и End_Date от 26/10/2015 00:00, как я могу заставить Excel рассчитывать правильное количество часов между ними, что также будет работать для всех остальных дней каждый год? Я хочу иметь возможность надежно проверять эту контрольную таблицу в течение любого заданного периода и для каждого дня правильно рассчитывать общую сумму в зависимости от того, есть ли у нее 23, 24 или 25 часов. Каждое преобразование, которое я пробовал до сих пор, возвращает разницу между двумя временными метками как «1», так как Excel считает 25h одним днем.

Изменить: для записи, Великобритания меняется в последние воскресенья марта и октября.

1 ответ1

1

В отсутствие предложенного лучшего метода я применил следующее решение:

=Flowrate*(24+IF(AND(EOMONTH(Start_Date,0)-Start_Date<7,WEEKDAY(Start_Date,3)=6),CHOOSE(MONTH(Start_Date),0,0,-1,0,0,0,0,0,0,1,0,0),0))

Как это устроено

Вкратце, работая задом наперед:

CHOOSE(MONTH(Start_Date),0,0,-1,0,0,0,0,0,0,1,0,0)

Для заданной Start_Date проверяет, какой месяц года это, и возвращает смещение -1 часа, если март, и +1 час, если октябрь.

WEEKDAY(Start_Date,3) = 6

Для заданной Start_Date проверяет, является ли текущая дата воскресеньем, и возвращает TRUE, если это так.

EOMONTH(Start_Date,0)-Start_Date < 7

Для данной Start_Date проверяется, меньше ли это семь дней с конца месяца. Возвращает TRUE, если так.

AND(EOMONTH(),WEEKDAY()=6)

Проверяет оба вышеуказанных условия. Если это воскресенье и в течение последних шести дней месяца (т.е. не больше воскресений), верните ИСТИНА.

IF(AND(),CHOOSE(),0)

Если все вышеприведенные условия имеют значение ИСТИНА, вызовите CHOOSE, чтобы вернуть правильное смещение для последнего воскресенья данного месяца. В противном случае верните ноль. Возвращенное смещение прибавляется к 24, чтобы дать количество часов в данном дне, которое затем можно умножить на часовой расход, чтобы получить общее количество дней.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .