Ошибка приложения или объекта (1004) - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть электронная таблица, которая позволяет пользователям вводить информацию на одной странице, а затем нажимать кнопку, чтобы отправить всю информацию туда, куда она должна go. У меня есть функция, которая проверяет, существует ли лист, а затем создает копию листа шаблона и переименовывает его в нужное имя.

    Application.ScreenUpdating = False
    For i = 1 To 10
        OpName = Cells(i + 3, 2).Value
        If Not OpName = "" Then
            OpCheck (OpName)

Таким образом, приведенный выше код циклически перебирает ячейки вниз по строке B и запускает функцию проверки, как описано выше.

Function OpCheck(Init As String)
    Init = UCase(Init)
    exists = False
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = Init Then
            exists = True
        End If
    Next i
    If Not exists Then
        Sheets("Op Template").Visible = True
        Sheets("Op Template").Activate
        ActiveSheet.Copy After:=Worksheets(Sheets.Count)
        ActiveSheet.Name = Init
        RenameTable (Init)

        On Error Resume Next

    End If
    Sheets("Op Template").Visible = False

End Function

Это код функции, и ошибка появляется в строке

ActiveSheet.Name = Init

Это работало некоторое время, но сейчас не удается найти лист с именем TS и получает ошибку при попытке переименовать новую страницу с именем, которое уже существует. Я просто не понимаю, почему он вообще не находит страницу.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 февраля 2020

Причина, по которой ваш код иногда не удается найти, заключается в том, что вам нужно выйти из For l oop, как только лист будет найден. Исправление:

For i = 1 To Worksheets.Count
    If Worksheets(i).Name = Init Then
        exists = True
        Exit For    ' ADD THIS LINE
    End If
Next i

Несколько других комментариев кода:

  • Рассмотрите возможность изменения Function OpCheck на Sub OpCheck, поскольку вы ничего не возвращаете
  • Ваш код может вызывать преобразование Init в верхний регистр в функции или подпрограмме, которая вызывает OpCheck. Чтобы избежать этого, измените объявление на: OpCheck(ByVal Init As String)

Этот раздел кода:

Sheets("Op Template").Visible = True
Sheets("Op Template").Activate
ActiveSheet.Copy After:=Worksheets(Sheets.Count)
ActiveSheet.Name = Init
RenameTable (Init)

можно сделать менее рискованным, избегая ActiveSheet

dim ws as Worksheet
Set ws = Sheets("Op Template")
ws.Visible = True
ws.Copy After:=Worksheets(Sheets.Count)

' Instead of this
' ActiveSheet.Name = Init
' Something like this
Worksheets(Sheets.Count).Name = Init
RenameTable (Init)

Надеюсь, что помогает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...