Как удалить рабочий лист с VBA, который имеет формат даты? - PullRequest
0 голосов
/ 02 января 2019

введите код здесь. Таблица будет создана автоматически.На листе будет указана дата, которая вводится через 2 дня после текущей даты.У меня возникли проблемы с его удалением, если ему исполнилось 3 дня.Пожалуйста, посмотрите мой код ниже для того, что у меня есть в настоящее время.

For Each ws In Worksheets
    If ws.Name = Format(Date - 2, "MM-DD-YYYY") Then
        Application.DisplayAlerts = False
        Sheets(Date - 2, "MM-DD-YYYY").Delete
        Application.DisplayAlerts = True

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Если я понял ваш вопрос, вы можете попробовать этот код:

Sub test()
For Each ws In Worksheets
    If ws.Name = Format(Date - 2, "MM-DD-YYYY") Then
        Application.DisplayAlerts = False
        'control the date and delete the sheet 
        If (ws.Name = Format(Date - 2, "MM-DD-YYYY")) Then
            ws.Delete
            Application.DisplayAlerts = True
        End If
    End If
Next ws
End Sub

ex.если сегодня 01-02-2019, макрос удаляет лист с датой 12-31-2018 (ММ-ДД-ГГГГ).Если вы хотите удалить лист 3 дня назад, вам нужно изменить значение 2 на 3 (в макросе).

Надеюсь, это поможет!

0 голосов
/ 02 января 2019

Удалить старые листы

  • Этот код включает в себя удаление возможных листов диаграмм.
  • Чтобы разрешить удаление без подтверждения, необходимо установить cBlnWithoutConfirmation в True.

Код

'*******************************************************************************
' Purpose:    Deletes all sheets named by a date in format MM-DD-YYYY
'             that are at least old as specified.
'*******************************************************************************
Sub DeleteOldSheets()

    Const cIntAge As Integer = 3            ' Age of Sheet (Days)
    Const cBlnWithoutConfirmation = False   ' Enable Delete Without Confirmation

    Dim vntDate As Variant                  ' Date Array
    Dim vntSheetDate As Date                ' Sheet Date
    Dim i As Integer                        ' Sheets Counter

    With ThisWorkbook
        For i = 1 To .Sheets.Count
            With .Sheets(i)
                vntDate = Split(.Name, "-")
                On Error Resume Next
                vntSheetDate = DateSerial(vntDate(2), vntDate(0), vntDate(1))
                If Err Then
                    On Error GoTo 0
                  Else
                    If Date - vntSheetDate + 1 > cIntAge Then
                        If cBlnWithoutConfirmation Then
                            Application.DisplayAlerts = False
                            .Delete
                            Application.DisplayAlerts = True
                          Else
                            .Delete
                        End If
                    End If
                End If
            End With
        Next
    End With

End Sub
'*******************************************************************************
0 голосов
/ 02 января 2019

Вы не возвращаете отформатированную строку в коллекцию Sheets.

For Each ws In Worksheets
    If ws.Name = Format(Date - 2, "MM-DD-YYYY") Then
        Application.DisplayAlerts = False
        Sheets(Format(Date - 2, "MM-DD-YYYY")).Delete   '<~~ identified here
        'alternate
        'ws.delete
        Application.DisplayAlerts = True
        exit for    '<~~ no point in continuing since only one worksheet could have that name

Нет смысла дважды создавать имя листа.Если он проходит проверку имени, то ws - это лист, который вы хотите удалить.

Я начал думать о выходных и праздничных днях, которые могут помешать правилу «3 дня».При этом будет удален любой рабочий лист с именем в виде строковой даты, старше трех рабочих дней.

For Each ws In Worksheets
    If cdate(ws.Name) <= APPLICATION.WORKDAY(Date, -3) Then
        Application.DisplayAlerts = False
        ws.delete
        Application.DisplayAlerts = True
    end if
NEXT WS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...