2013-09-16 3 views
2

У меня есть список дат, полученный от начала и даты окончания, например, для:Extract месяцев от начала и даты окончания в VBA - Excel

01/10/2011 - до .. - 01/01/2012

В VBA , как я могу получить массив месяцев между этими двумя датами, так что результат будет выглядеть следующим образом:

Oct-2011 
Nov-2011 
Dec-2011 
Jan-2012 

есть ли легко решение для этого?

ответ

5

Чтобы сделать это полностью в VBA без действий на листе:

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

Если другая дата имеет тот же месяц и год, которые уже существуют в коллекции, коллекция не будет дублировать ее, поскольку ключ с месяцем и годом уже будет установлен и приведет к ошибке. Отключив передачу ошибок (в разделе «Ошибка при повторном запуске»), код пропустит добавление, не дублируя его в коллекции.

Техника в действии (с комментариями)

Sub GetUniqueMonths() 

Dim uniqueMonths As Collection 
Set uniqueMonths = New Collection 

Dim dateRange As Range 
Set dateRange = Range("A1:A10") 'Change this to your range of dates 

On Error Resume Next 

Dim currentRange As Range 
For Each currentRange In dateRange.Cells 

    If currentRange.Value <> "" Then 

     Dim tempDate As Date: tempDate = CDate(currentRange.Text) 'Convert the text to a Date 
     Dim parsedDateString As String: parsedDateString = Format(tempDate, "MMM-yyyy") 'Format the date into the required format (Oct-2011 etc) 
     uniqueMonths.Add Item:=parsedDateString, Key:=parsedDateString 'Add the parsed date into the collection 
     'An error will be thrown if the record already exists as the key has been set to the value (e.g. Oct-2011) 
     'With On Error Resume next set, it will ignore the error and continue to run without adding the record therefore no duplication of dates 

    End If 

Next currentRange 

On Error GoTo 0 'Enable default error trapping 

'Loop through the collection and view the unique months and years 
Dim uniqueMonth As Variant 
For Each uniqueMonth In uniqueMonths 

    Debug.Print uniqueMonth 

Next uniqueMonth 

End Sub 
+1

+ 1 Красиво сделано. Однако я бы рекомендовал переместить OERN непосредственно перед '.Add'. Это будет гарантировать, что никакие другие сообщения об ошибках не будут подавлены (в случае их возникновения) :) –

+0

Хорошая точка, я добавил OERN до цикла, поскольку преобразование даты также может просачивать ошибки, если данные не анализируются. –

+0

отличный ответ, репутация ++ – cwiggo

Смежные вопросы