Цикл VBA работает, но с Runtime Error в конце - PullRequest
0 голосов
/ 26 апреля 2019

Я запускаю цикл «Для каждого», чтобы переименовать каждый лист в моей книге на основе части строки, расположенной в каждом соответствующем листе.Приведенный ниже код «работает», что означает, что каждый лист переименовывается, но затем я получаю ошибку времени выполнения 1004 «Ошибка приложения или объекта».

Я пробовал несколько исправлений, таких как использование «ws» вместо'sht', пробуя ссылку на ячейку вместо 'Range' и устанавливая Else в моем операторе If.

    For Each sht In ThisWorkbook.Worksheets
        If sht.Name <> "Control" Then
            sht.Name = Replace(sht.Range("A10"), "Using Restrictions of: Category Filter (Product) - ", "")
        End If
    Next

Для листа со строкой "Использование ограничений: Фильтр категорий (Продукт) -Путешествия и транспорт »: 1-я ожидаю, что лист будет переименован в« Путешествия и транспорт »2-для каждого рабочего листа (кроме листа с именем« Управление ») будет переименован относительно строкового значения этого листа в ячейке A10 3-для подпунктазакончить без ошибок.Фактически: 1 и 2 успешно, но не 3

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Выполнив ваш код, я получу Runtime Error 1004 “Application-defined or Object-defined error, либо если новое имя рабочего листа окажется пустым или превысит максимальное количество символов, которое он может содержать.

Это может произойти, если на каком-то рабочем листе A10, например, пуст. В этом случае новое имя будет пустым.

Другая ситуация, когда это может произойти, если строка, которую вы ищете для замены, не идентична той, которая найдена в A10. Например, вы ищете

"Using Restrictions of: Category Filter (Product) - "

но в A10, например, отсутствует пробел:

"Using Restrictions of: Category Filter (Product)- Travel & Transport"

В этом случае новое имя будет равно значению A10, превышающему максимальное количество символов.

Другая возможность - имя рабочего листа Control пишется иначе, чем то, как оно написано в вашем If-statement. В этом случае все листы будут переименованы, и если A10 в Control пусто, то вы получите Runtime Error 1004.

Итак, мое предложение:

  1. Убедитесь, что нет скрытых таблиц (щелкните правой кнопкой мыши вкладку листа и выберите «Показать»)
  2. Убедитесь, что лист, который вы хотите исключить из цикла, написано точно так же, как в вашем If statement
  3. Убедитесь, что "Control" является единственным рабочим листом, который следует исключить из цикла
  4. Убедитесь, что это "Using Restrictions of: Category Filter (Product) - " не написано с ошибкой ни на одном из рабочих листов, которые вы хочу переименовать.
  5. Убедитесь, что все, что следует за "Using Restrictions of: Category Filter (Product) - ", не превышает максимальное количество символов, которое может содержать имя листа.
0 голосов
/ 26 апреля 2019

Ради тестирования, посмотрите, если вы не можете сделать:

dim sht as worksheet, z as string, arr as variant, x as long
arr = Array("/", "\", "'", ",", "!", "@", "(", ")", "&", "-", "Using Restrictions of: Category Filter (Product) - ")
For Each sht In ThisWorkbook.Worksheets
    If sht.Name <> "Control" Then 
        z = sht.cells(10,1).value
        For x = LBound(arr) To UBound(arr)
            z = Replace(z, arr(x), "")
        Next x
        if len(z) > 0 then sht.Name = z
    End if
Next

Я подозреваю, что другие символы не отображаются для ваших имен.

Следующееошибка появляется, когда у меня есть ненужные символы в строке, имя которой должно содержать имя листа:

enter image description here


Edit1:

Добавлен улов в случае z = 0, чтобы имя sht не изменялось

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