excel VBA worksheet_activate方法无法正常工作

时间:2016-10-13 17:13:19

标签: excel vba

我有一个带有小子程序的电子表格,当工作表的选项卡"模板"单击: 1.复制"模板"将它放在原始"模板"之前。片 2.将复制的表格的名称更改为今天的日期(10-13-2016) 3.将单元格B1的内容更改为今天的日期(2016年10月13日,星期四)

下面列出的代码可以解决这些问题。我需要帮助的两件事是: 1.要复制工作表我必须单击另一个工作表,然后单击“#34;模板”#34;片。我希望能够点击"模板"选项卡,并让它创建副本,即使"模板"工作表已经是活动工作表。 2.由于某种原因,VBA代码阻止我删除单击"模板"时创建的选项卡。标签

Private Sub Worksheet_Activate()

Application.EnableEvents = False

If ActiveSheet.Name = "Template" Then

    Worksheets("Template").Copy before:=Worksheets("Template")

    ActiveSheet.Range("B2").Select

    ActiveCell.FormulaR1C1 = Format(Date, "dddd, mmm d, yyyy")

    ActiveSheet.Name = Format(Date, "mm-dd-yyyy")

End If

Application.EnableEvents = True

End Sub

我知道这可能很简单,但我无法在任何地方找到任何对此行为的引用。任何和所有的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您不会使用Worksheet_Activate(),因为它会与工作表副本一起复制,因此复制的工作表会生成其他工作表

所以你想使用Workbook_SheetActivate()事件处理程序

即使这样,你必须要知道,在删除“模板”之前的工作表时,活动工作表变为“模板”(下一个),从而激活克隆程序并使其看起来好像“VBA代码阻止“你”删除标签“

然后在ThisWorkBook代码窗格中输入以下代码:

Option Explicit

Dim nextShtName As String

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim newName As String

    If nextShtName = "Template" Then
        nextShtName = ""
    Else
        If Sh.Name = "Template" Then
            newName = Format(Date, "mm-dd-yyyy")
            If GetSheet(newName) Is Nothing Then
                Application.EnableEvents = False
                On Error GoTo exitsub

                Sh.Copy before:=Worksheets("Template")
                With ActiveSheet
                    .Range("B2").FormulaR1C1 = Format(Date, "dddd, mmm d, yyyy")

                    .Name = newName
                End With
exitsub:
                Application.EnableEvents = True
            Else
                MsgBox "sheet '" & newName & "' already in this workbook", vbInformation
            End If
        End If
    End If

End Sub

Function GetSheet(shtName As String) As Worksheet
    On Error Resume Next
    Set GetSheet = Worksheets(shtName)
End Function

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
    Dim i As Long
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = Sh.Name Then Exit For
    Next i
    nextShtName = Worksheets(i + 1).Name
End Sub