如何限制一张纸的份数?

时间:2019-06-27 13:35:22

标签: vba

我希望更新以下代码,并根据“输入”选项卡中的输入来限制模板被复制和重命名的次数。应该只有2个副本,如果有人尝试创建第3个副本,则会弹出一条消息,提示“您只能创建2个标签”。现有代码如下:

我是一个初学者,所以在代码的某些部分上获得了一些帮助,并且不确定如何进一步进行此操作

Sub scorecard()

    Dim A, B As String
    Dim lgn, col As Integer

    A = ActiveSheet.Cells(8, 5).Value & "_" & ActiveSheet.Cells(9, 5).Value
    B = ActiveSheet.Name

    On Error Resume Next
    Application.ScreenUpdating = False
    Sheets(A).Select

    If ActiveSheet.Name = A Then
        Sheets(B).Select
        Application.ScreenUpdating = True
        MsgBox ("This name already exists")
    Else

        Sheets("Template").Copy After:=Sheets(Sheets.Count)
        ActiveSheet.Name = A

1 个答案:

答案 0 :(得分:0)

如果要阻止用户创建一定数量的相同名称的工作表,则需要使用Workbook events

我认为SheetActivate应该可以解决问题。

最简单的方法是在项目中的ThisWorkbook下工作,该项目位于Microsoft Excel Objects文件夹中。

Microsoft Excel Objects Folder

从这里,您可以在左侧的下拉菜单中选择Workbook对象,然后在右侧的下拉列表中选择SheetActivate事件。

enter image description here


每次发生此事件时,我们都希望调用一个函数来检查名称是否匹配以及在您的情况2下名称是否超过了您的最大限制。

这是事件,我们希望将Sh引用传递给我们的函数。

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    LimitNumberOfMatchingSheets Sh
End Sub

这是我们创建的用于检查匹配名称和最大值的函数。

如果确实满足这些条件,则只需向用户发送消息并删除新创建(或复制的)工作表即可。

Private Sub LimitNumberOfMatchingSheets(ByRef sheet As Worksheet)

    Const sheetName As String = "Sheet1"
    Const maxLimit As Long = 2

    'If name matches and max is reached then delete new worksheet
    If InStr(sheet.Name, sheetName) > 0 _
            And MatchingSheetNameCount(sheetName, ThisWorkbook) > maxLimit Then

        'I would put a better description here.
        MsgBox "This name already exists"

        'Disable the users ability to cancel the deletion.
        Application.DisplayAlerts = False
        sheet.Delete
        Application.DisplayAlerts = True
    End If
End Sub

最后一个帮助程序功能,用于检查匹配的工作表名称的数量。

Private Function MatchingSheetNameCount(ByVal likeName As String, ByVal book As Workbook) As Long

    Dim sheet As Worksheet
    For Each sheet In book.Worksheets
        If InStr(sheet.Name, likeName) > 0 Then
            MatchingSheetNameCount = MatchingSheetNameCount + 1
        End If
    Next sheet

End Function