Как скопировать и вставить существующий файл книги .xlm на определенную дату и время, не открывая существующий файл? - PullRequest
0 голосов
/ 25 марта 2020

Как автоматически скопировать и вставить существующий файл рабочей книги .xlm в определенную дату и время, не открывая существующий файл?

У меня есть файл рабочей книги vba, который я использую для ежемесячной записи определенных данных. В конце месяца я должен сохранить эту рабочую книгу и запустить новый файл рабочей книги, скопировав существующий файл, после чего вручную проверяю определенные данные (например, даты, имена, цифры и т. Д. c.), Прежде чем снова начать использовать его для записывать мои обычные ежедневные данные. Я хотел бы, чтобы действия копирования-вставки-изменения выполнялись автоматически в определенную дату и время: например, 1-го числа нового месяца в 07:00. Буду признателен за любые предложения о том, как go об этом? Спасибо SATAMAN

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Вот базовая 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.

0 голосов
/ 25 марта 2020

В VBA нет прямого способа запланировать макрос на указанную c дату. Вы можете использовать Application.OnTime для запуска макроса в указанное время.

Вы можете либо создать Exe и добавить его в планировщик Windows, либо Проверить дату в своем макросе и вызвать макрос, сбросив Application.OnTime .

Sub MyProc()
If Day(Now) = 1 Then

    ' Execute the proc
End If
' extend procedure schedule by a day
 Application.OnTime Now() + TimeValue("24:00:00"), "MyProc"
End Sub

ср c: https://p2p.wrox.com/excel-vba/72435-schedule-excel-run-macro-specific-time-date.html#post233865

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...