Вместо того, чтобы зацикливать каждый лист на наличие дубликатов, создайте функцию, которая возвращает логическое значение. Эта функция будет иметь ошибку, если лист не существует, и не будет ошибки, если лист существует. Мы проверяем эту ошибку и возвращаем True
, если лист существует, False
в противном случае.
Option Explicit
Private Function SheetExists(wsName As String, Optional wb As Workbook = Nothing) As Boolean
Dim ws As Worksheet
On Error Resume Next
If wb Is Nothing Then
Set ws = Worksheets(wsName)
Else
Set ws = wb.Worksheets(wsName)
End If
SheetExists = (Err.Number = 0)
End Function
И тогда ваш код может быть заменен следующим, который будет вызывать InputBox
столько раз, сколько необходимо, чтобы пользователь не мог ввести другую недопустимую / дублирующую запись. Для этого я объединил текст MsgBox
и InputBox
, и кажется, что нет необходимости выдавать пользователю два запроса, когда мы можем использовать InputBox
для обоих информировать и запрашивать новый ввод.
Dim ws as Worksheet
Dim newName as String
Set ws = ActiveSheet ' would be better to avoid this, but OK.
newName = Range("D10").Value
While SheetExists(newName, ws.Parent)
newName = InputBox("ERROR: This Acct No has already been formulated!" & vbCrLf & vbCrLf & _
newName & " already exists! Enter new name:")
Wend
ws.Name = newName