Страницы: 1
RSS
Макрос ошибается при записи сокращенной даты, вместо августа 2019 выводит сентябрь 2019
 
Коллеги, помогите найти ошибку в макросе. Макрос анализирует таблицу с выставленными счетами и выводит сообщение с краткой датой счета. В периоде с января 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
Изменено: SAS888 - 14.08.2019 12:00:02
Чем шире угол зрения, тем он тупее.
 
Добрый день.
Строку макроса:
Код
j = DateAdd("m", 1, j)
'заменить на:
j = DateAdd("m", 1, DateSerial(Year(j), Month(j), 1))

При проходе цикла, поскольку шаг цикла не указан явно, по умолчанию он =1. В теле цикла изменяется переменная j, ей присваивается значение даты, отстоящей на месяц от первоначальной, а потом, инструкция NEXT j добавляет еще единицу к значению j, т.е. если в переменной было 1 января 2017 то на следующем шаге будет 02 февраля 2017 и так далее. И таким образом набегает месяц (в этот раз не повезло августу 2019) :)
Для исключения этого, чтобы сильно макрос не курочить, предлагается на каждом шаге цикла устанавливать в j значение первого числа обрабатываемого месяца и года через функцию DataSerial. Таким образом хотя сдвиг за счет инструкции NEXT все равно будет, но каждый раз в цикле он будет отменен и максимальная дата месяца, которая будет попадать в переменную j - второе число месяца (а не пятое и не тридцать первое).
Кому решение нужно - тот пример и рисует.
 
Пытливый, может быть не все понял, но мысль такая: в нашем коде к J всегда прибавляется один день месяца, в итоге, когда анализируемый интервал превышает 30 месяцев, то последний столбец перескакивает через месяц. То есть мы еще и некоторые данные пропускали.... Вечером посмотрю внимательнее, поэкспериментирую, о результатах сообщу.
Про второе число месяца... - будем стараться, чтобы не терять данные))
Изменено: VIZ_VIZ - 14.08.2019 12:12:36 (замечание модератора)
 
с потерянным днем пока нашел такое решение:
Код
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, о результатах сообщу (пока мешается лишний столбец "сентябрь".
Спасибо всем, кто помогал самоучкам!!

Изменено: VIZ_VIZ - 14.08.2019 10:08:59
 
Чтобы "убрать" последний Сентябрь, строку кода
Код
Do While j < DateAdd("m", 1, Date)
замените на
Код
Do While j <= Date
Изменено: SAS888 - 14.08.2019 12:12:16
Чем шире угол зрения, тем он тупее.
 
SAS888, спасибо, код стал красивее) Все работает)
Страницы: 1
Наверх