Я хочу написать процедуру VBA, которая будет "ежедневной"

  • создать новый лист
  • присвойте этому новому листу имя в форме ДД.ММ.ГГначальными нулями) на основе текущей даты (например, 25.07.18)
  • скопируйте значения из столбцов A и B моего листа DataInput в новый лист.

Что я подразумеваю под "ежедневно"? Просто, если текущее время = или> указанное время суток, то создайте лист, иначе просто проигнорируйте.

Я не думаю, что это трудно управлять. Я пытался объединить некоторые формулы, чтобы соединить их, но они все время дают мне ошибку.

Я думал о чем-то

Option Explicit
Sub ReportSheet_Today()
    Dim szTodayDate As String

    szTodayDate = Format(Date, "dd.mm.yy")
    On Error GoTo MakeSheet
    Sheets(szTodayDate).Activate
    If Time < TimeValue("9:00:00") Then
        'MakeSheet:
        Sheets.Add , Worksheets(Worksheets.Count)
        ActiveSheet.Name = szTodayDate
        Sheets("DataInput").Select
        Range("A:A").Copy
        Sheets("szTodayDate").Select
        Range("A:A").Select
        ActiveSheet.Paste
    End IF
End Sub

1 ответ1

0

Ошибка здесь:

Sheets("szTodayDate").Select

szTodayDate не является именем листа; это локальная переменная, которая содержит строку, представляющую имя листа ... но вы используете ее как строковый литерал, поэтому VBA пытается разыменовать объект листа, который в буквальном смысле называется "szTodayDate" ... и так как он не может найди его, бум, ошибка времени выполнения 9.

Удалить двойные кавычки:

Sheets(szTodayDate).Select

Теперь вы будете разыменовывать объект листа, названный в соответствии со значением строковой переменной szTodayDate , которая, вероятно, соответствует вашим намерениям.


Следующие шаги...

Потяните логику создания листа в свою отдельную процедуру; Написание небольших специализированных процедур, которые делают одно и делают это хорошо, значительно облегчат вашу жизнь.

Вы можете использовать возвращаемые значения функций: Worksheets.Add возвращает ссылку на созданный объект рабочего листа - записав эту ссылку в локальную переменную объекта, вы избавляетесь от необходимости Select ее, а затем отрабатывать ActiveSheet .

Вы также можете предоставить параметр назначения для Range.Copy , сделав всю операцию выбора-копирования-выбора-вставки одной строкой.

Public Function CreateReportSheet(ByVal reportDate As Date) As Worksheet

    Dim reportSheet As Worksheet
    Set reportSheet = AddNamedWorksheet(ThisWorkbook, Format$(reportDate, "dd.mm.yy"))

    'only needed if the sheet doesn't exist at compile-time.
    'if it *does* exist at compile-time, just set the sheet's (Name) property to "inputSheet".
    'that identifier will then be globally available anywhere in the project.
    'Dim inputSheet As Worksheet
    'Set inputSheet = ThisWorkbook.Worksheets("DataInput")

    inputSheet.Range("A:A").Copy reportSheet.Range("A:A")
    Set CreateReportSheet = reportSheet

End Function

Public Function AddNamedWorksheet(ByVal wb As Workbook, ByVal sheetName As String) As Worksheet
    Dim sheet As Worksheet
    Set sheet = wb.Worksheets.Add
    On Error Resume Next ' naming the sheet will throw if name already exists
        sheet.Name = sheetName
    On Error GoTo 0 ' restore error handling
    Set AddNamedWorksheet = sheet
End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .