Изменение даты в VBA - PullRequest
       4

Изменение даты в VBA

0 голосов
/ 16 октября 2018

Я пытаюсь заменить лист автоматически.В настоящее время у меня есть несколько рабочих листов с заголовками «18 января», «18 февраля», «18 марта» и т. Д. У меня есть пользовательская форма, которая инициируется до запуска макроса.Я могу ввести новый год (например, 2019), однако код продолжает отображать «18» для моего года обучения.Это как запись в пользовательской форме не работает.Сценарий, который я использую, использует оператор case, чтобы выбрать нужные файлы с предыдущим годом и заменить его текущим годом.

Sub NewFiscalYear()

Dim ws As Worksheet
Dim PrevYear As Integer
Dim FormYear As Integer

FormYear = Format(Date, "yy")
PrevYear = FormYear - 1

'Disabling Display Alerts
Application.DisplayAlerts = False
Application.ScreenUpdating = False

    'Changing FY Date on Forms
     If FormMonth = "AUG" Then

        For Each ws In Worksheets
            Select Case ws.Name
                Case "JAN " & PrevYear, "FEB " & PrevYear, "MAR " & PrevYear, "APR " & PrevYear, _
                "MAY " & PrevYear, "JUN " & PrevYear, "JUL " & PrevYear, "AUG " & PrevYear, _
                "SEP " & PrevYear, "OCT " & PrevYear, "NOV " & PrevYear, "DEC " & PrevYear
                    ws.Name = "ws.name " & FormYear
            End Select
        Next
    End If

Я работаю над большим отчетом, который собирает информацию из множества других рабочих книг.Моя пользовательская форма содержит дату для ввода (FormYear) и месяц для выбора через поле со списком (FormMonth).Как только они выбраны, макрос запускается.У меня отлично работает отчет, однако с новым FY я столкнулся с ошибками.

***** Моя цель - сделать так, чтобы пользователи запустили отчет за первый месяц нового финансового года, надеясь, что они не заметят, что что-то изменилось (за исключением того, что оно выглядит как новый лист),Вкладки показывают текущий месяц, который был выбран вместе с финансовым годом, который был выбран в пользовательской форме до запуска макроса.Как только вкладки будут идентифицированы с новым годом, я собираюсь просмотреть и сбросить все формы с пустыми данными.Я надеюсь, что это сделало вещи немного яснее! *****

Любые советы или рекомендации будут в основном оценены!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

FormYear = Format(Date, "yy") будет возвращаться 18 до тех пор, пока 1 января 2019 года не наступят часы.

Если вам нужно получить 19, сейчас , вам необходимо:

FormYear = CInt(Format(Date, "yy")) + 1

или

FormYear = CInt(Format(DateAdd("yyyy", 1, Date),"yy"))


После дальнейшего разъяснения, это должно сделать то, что вы после:

Sub NewFiscalYear()

  Dim ws As Worksheet
  Dim PrevYear As Integer
  Dim FormYear As String

  FormYear = CInt(Format(Date, "yy"))
  PrevYear = CStr(FormYear - 1)

Обратите внимание на явное преобразование из строк в целые и обратно.VBA сделает это за вас, но таким образом вы (и все остальные) будете знать, что это преднамеренно

'remove these lines until everything works fine
  'Disabling Display Alerts
'  Application.DisplayAlerts = False
'  Application.ScreenUpdating = False

Объявите здесь константу, чтобы вы знали, почему существует эта «магическая ценность». Вы знаете, что это начало финансового года, но через 5 лет, когда это изменится, кто-то другой может не знать, почему это больше не работает, и не понимать, что начало финансового года изменилось.

  Const FISCAL_YEAR_START_MONTH as String = "AUG"
  'Changing FY Date on Forms
  If FormMonth = FISCAL_YEAR_START_MONTH Then

    For Each ws In Worksheets
      Select Case ws.Name
        Case "JAN " & PrevYear, "FEB " & PrevYear, "MAR " & PrevYear, "APR " & PrevYear, _
             "MAY " & PrevYear, "JUN " & PrevYear, "JUL " & PrevYear, "AUG " & PrevYear, _
             "SEP " & PrevYear, "OCT " & PrevYear, "NOV " & PrevYear, "DEC " & PrevYear

Как только вы найдете лист, шаблон именования которого соответствует тому, что вы ищете, извлеките первые 3 символа (название месяца) и добавьте новый год к его концу.

          ws.Name = Left(ws.Name, 3) & " " & CStr(FormYear)
      End Select
    Next
  End If

'disabled them earlier, make sure we reenable them now
'doesn't hurt to enable them if they weren't disabled earlier
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub
0 голосов
/ 16 октября 2018

Ваша строка переименования неверна:

ws.Name = "ws.name " & FormYear

Это попытается изменить "JAN 18" на "ws.name 19", потому что вы обернули объект в кавычки.

Даже если вы правильно поняли кавычки:

    ws.Name = ws.name & " " & FormYear

Это изменит "18 января" на "18 января 19"


Попробуйте:

ws.Name = Replace(ws.Name, PrevYear, FormYear)

РЕДАКТИРОВАТЬ

Кроме того, я думаю, что ваш PrevYear / FormYear может быть неправильным.

Я бы пошел с:

PrevYear = Format(Date, "yy") ' so this is the current year value
FormYear = PrevYear + 1       ' this becomes next year value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...