2015-04-09 2 views
0

, поэтому я пытаюсь получить 2 даты на листе excel и использовать функцию DateDiff, чтобы получить количество дней между двумя датами. Я по существу добавляю количество дней вместе и делясь на количество строк для получения и среднее количество дней. До сих пор я располагаю там, где общее количество дней для каждой строки складывается вместе и отображается в столбце «E», а количество строк помещается в столбец «F». Я знаю, что я близка, потому что в какой-то момент это сработало, но я был немым и что-то изменил, а теперь нет. вот мой код и лист excel.Использование функции DateDiff в VBA для получения количества дней между двумя датами

Sub GetDays() 

    Range("C1").Select 

    Do Until ActiveCell.Value = "" 

     date1 = DateValue(ActiveCell.Offset(1, 0).Value) 
     date2 = DateValue(ActiveCell.Offset(1, 0).EntireRow.Cells(1, "D").Value) 

     DayCount = DateDiff("d", date1, date2) + DayCount 
     ActiveCell.Offset(1, 0).EntireRow.Cells(1, "E").Value = DayCount 

     StudentCount = StudentCount + 1 
     ActiveCell.Offset(1, 0).EntireRow.Cells(1, "F").Value = StudentCount 

     ActiveCell.Offset(1, 0).Select 
    Loop 

End Sub! 

Here is a snippet of the sheet

ответ

1

Проблема, которую я обнаружил при тестировании ваш код, что ваш цикл сравнения со значением ActiveCell, чтобы определить, когда выйти, но тогда ваш код работает на ячейку ниже ActiveCell, как результат вызова Offset (1,0). Поэтому, когда ваш цикл находится на последней строке данных, ActiveCell.Value = «3/25/2015 10:52», но ваша следующая строка кода пытается заполнить Date1 с помощью DateValue нулевого значения, поскольку она смещена вниз по одной ряд. Это вызывает ошибку несоответствия типа.

Я отрегулировать свой код ниже, это работает для меня:

Sub GetDays() 

    Range("C1").Select 

    Do Until ActiveCell.Value = "" 

    date1 = DateValue(ActiveCell.Value) 
    date2 = DateValue(ActiveCell.Offset(0, 1).Value) 

    DayCount = DateDiff("d", date1, date2) + DayCount 
    ActiveCell.Offset(0, 2).Value = DayCount 

    StudentCount = StudentCount + 1 
    ActiveCell.Offset(0, 3).Value = StudentCount 

    ActiveCell.Offset(1, 0).Select 
    Loop 

End Sub 

Я настроил команду смещения, так что мы смотрим на той же строке в любое время каждого цикла. Я заменил разделы EntireRow.Cells (1, D)), просто используя целое число столбцов в Offset().

Вы, возможно, потребуется изменить вторую строку:. Range («C2») Выберите для моего кода для работы, в зависимости от того, если начинается ваши данные по строке 1 или строке 2.

+0

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

+0

@KenFeier Вы очень желанны. Я думаю, что вступление в проект - отличный способ изучить новый язык. Если бы этот ответ помог вам, отметив его как принятый, он будет высоко оценен. –