2014-10-15 5 views
0

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

Например, минимальная дата - 31.07.2012, а максимальная - 30/30/2015. Я бы хотел, чтобы макрос заполнил заголовки столбцов 7/31/2014, 8/31/2014, ..., 6/30/2015 до конца моей таблицы.

К сожалению, таблицы Excel не могут иметь динамические заголовки. Затем я подумал об использовании VBA, имея массив дат, а затем установив Range.Value в массив, но не мог понять, как его кодировать.

спасибо.

ответ

0

У VBA есть функции, которые обрабатывают даты. Если посмотреть по ссылке:

http://software-solutions-online.com/2014/02/21/excel-vba-working-with-dates/

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

После этого добавьте методы для создания нужных столбцов и свойство .Name, чтобы назвать столбцы.

+0

Ответы на связь не рекомендуются при обмене стоп-карами. Пожалуйста, предоставьте дополнительную информацию о том, что доступно по ссылке, иначе в один прекрасный день будет 404 (ссылка rot), и ответ будет бесполезен. Если вы беспокоитесь об авторском праве, не стесняйтесь перефразировать исходный контент и присвоить кредит автору. –

1

Вы хотите DateAdd()

Предполагая, что вы хотите, чтобы получить последнюю дату каждого месяца вы должны использовать вместо Dateserial()

Public Sub test() 
    Dim startDate As Date 
    Dim endDate As Date 
    Dim currentDate As Date 

    startDate = CDate("7/31/2014") 
    endDate = CDate("6/30/2015") 

    currentDate = startDate 
    Do While currentDate <= endDate 
     MsgBox currentDate 

     'currentDate = DateAdd("m", 1, currentDate) 
     currentDate = DateSerial(Year(currentDate), Month(currentDate) + 2, 0) 
    Loop 
End Sub 
0

Вот небольшой пример, основанный на:

sample

Вот код:

Sub MAIN() 
    Dim d1 As Date, d2 As Date, Tbl As Range 
    d1 = Range("A1").Value 
    d2 = Range("A2").Value 
    Set Tbl = Range("B3:E9") 
    Call setLabels(d1, d2, Tbl) 
End Sub 

Sub setLabels(dt1 As Date, dt2 As Date, rng As Range) 
    Dim rToFill As Range, r As Range 
    Set rToFill = Intersect(rng(1).EntireRow, rng).Offset(-1, 0) 
    For Each r In rToFill 
     dv = dt1 + i 
     r.Value = dv 
     i = i + 1 
     If dt1 + i > dt2 Then Exit Sub 
    Next r 
End Sub 

Основано на 1 день Приращения. Если вы хотите 1 месяц приращений, а затем использовать это для дв

dv = DateSerial(Year(dt1), Month(dt1) + i, Day(dt1)) 
+0

Это не будет работать для примера OP (с шагом в один месяц). Это будет, например, верните «31-й день сентября» = 1 октября. –

+0

@ Jean-FrançoisCorbett Мне нравится ваш подход. Неясно, как увеличиваться по месяцам, учитывая, что месяцы не равны по длине. –

1

Вам не нужно VBA. Довольно простая формула Excel сделает трюк.

В приведенном ниже примере ячейка C5 имеет =$C$2. Ячейка С6 имеет следующую формулу:

=IF(C5>=$C$2,"",DATE(YEAR(C5),MONTH(C5)+2,DAY(0))) 

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

Объяснение: формула добавляет 2 месяца к предыдущей дате, но затем принимает «день 0» этого месяца, что эквивалентно последнему дню месяца до этого (что, на мой взгляд, является тем, что вы хотите на основе вашего примера). Если предыдущая дата достигла максимума, тогда она просто записывает пустую строку "" с этого момента.

Возможно, вы хотите это в строке, а не в столбце; идея такая же.

enter image description here

+0

.......... Хороший подход! .............. –

+1

Спасибо! Тем не менее, я использую структуру таблиц Excel (обновление исходной таблицы из файла Access, которое может меняться по длине, поэтому таблица Excel автоматически корректирует мои формулы соответственно без дополнительной работы), и она не допускает формулы в заголовках. Это то, что у меня было до перехода к структуре таблицы: '= IF (MIN (EOMONTH (AH1,1), EOMONTH (MAX ($ P: $ P), 0)) = AH1," ", MIN (EOMONTH (AH1,1), EOMONTH (MAX ($ P: $ P), 0))) ' И мне это нужно по столбцам, так как мои строки заполняются информацией о клиентах, и это будет служить расширением коллекции от отдельных клиентов в течение нескольких месяцев. – csg

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