最好将日期添加到“高级过滤器”工作表中,以使其与原始工作表的命名约定保持一致。
假设您设法创建了“高级过滤器”工作表,您稍后将如何在代码中引用它?
这需要一些额外的时间,但您应该创建函数来返回工作表的名称,并创建函数来返回对它们的引用。从长远来看,预先完成的工作会有所回报。
用法
Dim TodaysOIPAdvancedFilters As Worksheet
Set TodaysOIPAdvancedFilters = OIPAdvancedFiltersWorksheetByDate(Date, True)
重构代码
Sub Duplicate()
OIPAdvancedFiltersWorksheetByDate Date, True
End Sub
Public Function OIPWorksheetByDate(DateOf As Date) As Worksheet
On Error Resume Next
Set OIPWorksheetByDate = ThisWorkbook.Worksheets(OIPWorksheetName(DateOf))
On Error GoTo 0
End Function
Public Function OIPAdvancedFiltersWorksheetByDate(DateOf As Date, Optional CreateIfNotExists As Boolean) As Worksheet
On Error Resume Next
Set OIPAdvancedFiltersWorksheetByDate = ThisWorkbook.Worksheets(OIPAdvancedFiltersWorksheetName(DateOf))
On Error GoTo 0
If OIPAdvancedFiltersWorksheetByDate Is Nothing And CreateIfNotExists Then
Dim SourceWorksheet As Worksheet
Set SourceWorksheet = OIPWorksheetByDate(DateOf)
If SourceWorksheet Is Nothing Then
MsgBox "OIP Worksheet for " & DateOf & " not found", vbCritical, "Action Cancelled"
Exit Function
End If
On Error Resume Next
SourceWorksheet.Copy Before:=SourceWorksheet
ThisWorkbook.Worksheets(SourceWorksheet.Index - 1).Name = OIPAdvancedFiltersWorksheetName(DateOf)
Set OIPAdvancedFiltersWorksheetByDate = ThisWorkbook.Worksheets(SourceWorksheet.Index - 1)
On Error GoTo 0
End If
End Function
Private Function OIPWorksheetName(DateOf As Date) As String
Const DateFormat As String = "\O\I\P mm.dd.yyyy"
OIPWorksheetName = Format(DateOf, DateFormat)
End Function
Private Function OIPAdvancedFiltersWorksheetName(DateOf As Date) As String
Const DateFormat As String = "\O\I\P mm.dd.yyyy \A\d\v\a\n\c\e\d \F\i\l\t\e\r\s"
OIPAdvancedFiltersWorksheetName = Format(DateOf, DateFormat)
End Function
附录
使用这个子来比较即时窗口中的工作表名称:
Sub CompareNames()
Const DateFormat As String = "\O\I\P mm.dd.yyyy"
Debug.Print "["; ActiveSheet.Name; "]"
Debug.Print "["; Format(#11/10/2020#, DateFormat); "]"
End Sub
检查多余的空格并确保 OIP 中的 I 不是 L。