Вот базовая c структура кода, которая будет выполняться не в указанное время c, а после этого. Фактически, он запускается всякий раз, когда рабочая книга открывается, но не предпринимает никаких действий, пока не пройдет определенная дата. Это процедура события. Он должен быть скопирован в кодовый модуль ThisWorkbook . Он предназначен для тестирования и тестирования. Запустите его на чистом листе с датой в A1.
Private Sub Workbook_Open()
' "TestCell" is the cell in your worksheet that contains
' a date that is updated to the current month when this program runs
Const TestCell As String = "A1"
Dim TestRng As Range
Dim Test As Variant
' "Sheet1" is the CodeName of the "Monthly Data" tab
' it remains the same whichever tab name the user gives.
' Change the CodeName in the Properties window.
With Sheet1
Set TestRng = .Range(TestCell)
Test = TestRng.Value
If IsDate(Test) Then ' skip if no date
If Month(Test) < Month(Date) Then ' skip if date is in this month
' this presumes that you will want the same action
' even if Test is more than a month ago.
' If not, you can separate ways at this point.
With ThisWorkbook
' This command creates a copy of this workbook under
' any name in any location while keeping ThisWorkbook
' open and in its original location.
' This means that the current workbook always retains
' its name and copies are renamed to reflect the period
' they cover. You might also strip copies of their code
' by changing the file format.
' You might adapt your naming conventions to such a system.
.SaveCopyAs Environ("UserProfile") & "\Desktop\" & .Name
FormatWorkbookForNewMonth CDate(Test), TestRng
End With
End If
End If
End With
End Sub
Private Sub FormatWorkbookForNewMonth(ByVal LastDate As Date, _
TestRng As Range)
Dim Ws As Worksheet
Set Ws = TestRng.Worksheet
' do the changes to the workbook here
TestRng.Value = DateSerial(Year(Date), Month(Date), 1)
End Sub
У вас должна быть одна ячейка на рабочем листе, на которой основаны другие даты, например даты в заголовках, на вашем рабочем листе. Как только эта дата изменится, значение листа изменится вместе с ней. Такая ячейка идеальна для определения того, произошло ли изменение и даже каким оно было. В коде выше я обозначил A1 - легко изменить в коде. Процедура события просто проверяет, находится ли дата в предыдущем месяце, и переходит в действие, если это не так.
Данная процедура создает копию файла (на вашем рабочем столе на данный момент) и сбрасывает дату в А1 к первому дню текущего месяца. Таким образом, если та же процедура будет запущена снова, никаких действий предприниматься не будет, пока не изменится месяц.
Кстати, хотя это процедура события, которая запускается событием Open , вы можете на самом деле запустите его на F5.