Коллеги, помогите найти ошибку в макросе. Макрос анализирует таблицу с выставленными счетами и выводит сообщение с краткой датой счета. В периоде с января 2019 по июль 2019 все ОК, а вот вместо августа макрос выдает сентябрь. Формат даты в исходнике не менялся - одинаковый по всей таблице. Самостоятельно ошибку найти не получилось - может кто-то помочь самоучкам?
Код
Sub Учебный2()
Dim i, K, NumSchet, Nm, Nk, Nf, status, f As Integer
Dim StartDate, j, sd As Date
Dim LastRow As Long
Dim NameKl As String
Dim ts
StartDate = #1/1/2019# ' Дата начала анализа
K = 4
For j = StartDate To DateAdd("m", 1, Date)
Range("A1").Offset(1, K).Value = Month(j) & " " & DatePart("yyyy", j)
MsgBox "Искомая дата " & Range("A1").Offset(1, K).Value
j = DateAdd("m", 1, j)
K = K + 1
Next j
End Sub
Изменено: VIZ_VIZ - 13.08.2019 16:13:59(исправил код макроса)
Без файла с образцом обрабатываемых данных трудно сказать. Сразу видно только, что при объявлении переменных тип Date будет иметь только переменная sd. Чтобы все задуманные переменные имели тип Date, надо так:
Код
Dim StartDate As Date, j As Date, sd As Date
Ну и по остальным объявлениям переменных тоже самое.
Запустил Ваш макрос в новой книге - он сформировал ячейки E2-M2 со значениями от "1 2019" до "9 2019" (тексты; без пропусков) У Вас в файле столбец с августом, случайно, не скрыт?
Не смог выложить файл с примером, выкладываю ссылку на Яндекс диск (https://yadi.sk/i/81LSSIjXzTIa3g). На странице Динамика показан результат работы макроса - после июля идет сентябрь и столбец под ним по понятным причинам не заполнен. Сделал макрос Учебный с кусочком кода- если в нем установить дату начала анализа с 2018г., то ошибка исчезает. На странице Ассортимент можно посмотреть исходные данные. Рекомендации Пытливого пока не применял, может быть это и поможет.
Не нужно в цикле For...Next изменять счетчик цикла "вручную". Можно, например, так:
Код
Sub Учебный2()
Dim k As Integer, j As Date
j = #1/1/2017# ' дата начала анализа
k = 5
Do While j <= Date
Cells(2, k) = Format(j, "mmmm yyyy")
MsgBox Cells(2, k)
j = DateAdd("m", 1, j)
k = k + 1
Loop
End Sub
При проходе цикла, поскольку шаг цикла не указан явно, по умолчанию он =1. В теле цикла изменяется переменная j, ей присваивается значение даты, отстоящей на месяц от первоначальной, а потом, инструкция NEXT j добавляет еще единицу к значению j, т.е. если в переменной было 1 января 2017 то на следующем шаге будет 02 февраля 2017 и так далее. И таким образом набегает месяц (в этот раз не повезло августу 2019) Для исключения этого, чтобы сильно макрос не курочить, предлагается на каждом шаге цикла устанавливать в j значение первого числа обрабатываемого месяца и года через функцию DataSerial. Таким образом хотя сдвиг за счет инструкции NEXT все равно будет, но каждый раз в цикле он будет отменен и максимальная дата месяца, которая будет попадать в переменную j - второе число месяца (а не пятое и не тридцать первое).
Пытливый, может быть не все понял, но мысль такая: в нашем коде к J всегда прибавляется один день месяца, в итоге, когда анализируемый интервал превышает 30 месяцев, то последний столбец перескакивает через месяц. То есть мы еще и некоторые данные пропускали.... Вечером посмотрю внимательнее, поэкспериментирую, о результатах сообщу. Про второе число месяца... - будем стараться, чтобы не терять данные))
For j = StartDate To DateAdd("m", 1, Date)
MsgBox "после next j= " & j
Range("A1").Offset(1, k).Value = MonthName(DatePart("m", j)) & " " & DatePart("yyyy", j)
j = DateAdd("m", 1, j) - 1
MsgBox "до next j= " & j
k = k + 1
Next j
вечером поэкспериментирую с DateSerial и c циклом While, о результатах сообщу (пока мешается лишний столбец "сентябрь". Спасибо всем, кто помогал самоучкам!!