2017-01-15 7 views
0

EDIT: На основе ответов я был в состоянии получить мин/макс даты из диапазона:Сравнение дат с форматом конкретных даты и времени (VBA)

Dim dt As Date 
dt = WorksheetFunction.Min(Range("D2:D300")) 

Но это не достаточно. Как использовать эту функцию с массивом вместо диапазона?

Оригинальный пост: У меня есть следующие столбцы:

enter image description here

формат: DD/MM/YYYY HH: MM

Я пытаюсь получить скорое DateTime от столбца 1 и последнего времени datetime от второго столбца. В этом случае:

02/01/2017 6:07 (earlist даты и времени из первой колонки, 2 января)

02/02/2017 14:11 (последняя DateTime из второго столбца, 2 февраля)

у меня есть многомерный массив (MyData) со значениями из клеток и мои функции это те:

Private Function GetLatestDateFromData() As String 
    Dim latestDate As String 
    Dim i As Long 

    latestDate = myData(1, ColumnsIndex(3) - 1) 

    For i = 1 To UBound(myData, 1) - 1 
     If latestDate < myData(i, ColumnsIndex(3) - 1) Then 
      latestDate = myData(i, ColumnsIndex(3) - 1) 
     End If 
    Next 
    GetLatestDateFromData = latestDate 
End Function 

Private Function GetEarliestDateFromData() As String 
    Dim earliestDate As String 
    Dim i As Long 

    earliestDate = myData(1, ColumnsIndex(2) - 1) 

    For i = 1 To UBound(myData, 1) - 1 
     If earliestDate > myData(i, ColumnsIndex(2) - 1) Then 
      earliestDate = myData(i, ColumnsIndex(2) - 1) 
     End If 
    Next 

    GetEarliestDateFromData = earliestDate 
End Function 

проблема в том, что мои результаты следующие:

startingFrom = DateValue(GetEarliestDateFromData) 'returns 01/02/2017, 1st of February 
untilDate = DateValue(GetLatestDateFromData) 'returns 01/06/2017, 1st of June 

У меня возникла проблема с форматированием даты. Так или иначе, дни и месяцы смешаны. Как это исправить?

Благодаря

EDIT: DateSerial (как это было предложено в связанном потоке) не применяется здесь, потому что я не только заботиться о дате, но время, как хорошо. DateSerial в качестве аргументов принимает только год-месяц-день.

+0

Возможный дубликат [VBA обращенного формат строки до даты] (http://stackoverflow.com/questions/20672875/vba-convert-string-to-date-format) –

+0

Если это действительно даты, то формат совершенно не имеет значения. Excel хранит дату/время как дни и доли дня с 1 января 1900 года. '= MIN (D: D)' вернет самую раннюю дату/время в столбце D; '= MAX (E: E)' вернет последнюю дату/время в столбце E –

+1

Чтобы использовать эту функцию в массиве, просто замените диапазон на одномерный массив. –

ответ

1

Чтобы исправить ваши даты, используйте функцию формата, например.

date = Format(value, "MM\/DD\/YYYY") 

Более легко вы могли бы просто сравнить фактические значения (например, 02/01/2017 6:07 равняется 42737,2548611111), которые не зависят от отображаемого формата.

Кроме того, я хотел бы предложить вам использовать функцию WorksheetFunction.Max, которая УВА будут сброшены, чтобы преуспеть Max-функцию, возвращая наибольшее vaule в вашем диапазоне, что-то вроде:

date = WorksheetFunction.Max(your_used_range) 
+0

Итак, перед выполнением какой-либо операции я добавляю функцию Format. Будет ли он автоматически понимать, что формат DD/MM и преобразовать его в MM/DD ...? Как преобразовать 02/01/2017 06:07 в 42737.25486 ...? Какая функция это делает? Эта функция функции выглядит интересной.Если вы сможете ответить на эти вопросы, я пойму это полностью, спасибо! –

+0

Dim dt As Date dt = WorksheetFunction.Min (Range ("D2: D300")), это работает, но как это сделать с помощью массива вместо использования Range? –