【问题标题】:Change the name of the sheet having a dynamic date更改具有动态日期的工作表的名称
【发布时间】:2020-11-10 05:30:47
【问题描述】:

我想复制一个包含今天日期的动态工作表名称的工作表。但是,我面临命名新的重复工作表。我应该输入什么而不是最后一行?

Sub Duplicate()

  ' Duplicate Macro
  ' duplication of OIP sheet

      Dim myDate
      myDate = Date
      Dim LValue As String
      LValue = "OIP " & Format(myDate, "mm.dd.yyyy")


      Sheets(LValue).Select
      Sheets(LValue).Copy Before:=Sheets(7)
      Sheets(LValue (2)).Name = "Advanced Filters"

      End Sub

【问题讨论】:

    标签: excel vba date naming


    【解决方案1】:

    最好将日期添加到“高级过滤器”工作表中,以使其与原始工作表的命名约定保持一致。

    假设您设法创建了“高级过滤器”工作表,您稍后将如何在代码中引用它?

    这需要一些额外的时间,但您应该创建函数来返回工作表的名称,并创建函数来返回对它们的引用。从长远来看,预先完成的工作会有所回报。

    用法

    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。

    【讨论】:

    • 我收到一条评论“未找到 2020 年 11 月 10 日的 OIP 工作表”,尽管我有一张名为 OIP 11.10.2020 的工作表
    • 工作表是工作表还是图表表?代码是否与 OIP 工作表在同一个工作簿中?如果是这样,请运行我附加到我的答案的Compare () sub。
    • @MariaRodriguez 如果您创建模拟工作簿并提供下载链接,我会为您调试。
    【解决方案2】:

    您知道工作表副本的位置,因此无需使用其名称:

      Dim LValue As String
      LValue = "OIP " & Format(Date, "mm.dd.yyyy")
    
    
      Sheets(LValue).Copy Before:=Sheets(7)
      Sheets(6).Name = "Advanced Filters"
    

    【讨论】:

    • “没用”并没有告诉我们如果你尝试这样做会发生什么。
    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多