Если вы хотите запретить пользователю создавать определенное количество листов с одинаковым именем, вам следует использовать События рабочей книги .
Я бы подумал, что SheetActivate
должно сработать.
Самый простой способ реализовать это - работать в вашем проекте под ThisWorkbook
, который находится в папке объектов Microsoft Excel.
Здесь вы можете использовать объект Workbook
в левом раскрывающемся списке, а затем выбрать событие SheetActivate
в правом раскрывающемся списке.
Каждый раз, когда происходит это событие, мы хотели бы вызвать функцию, чтобы проверить, соответствует ли имя и имеет ли оно больше вашего максимального предела, в вашем случае 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