Для l oop не работает в переднем конце, но работает при выполнении в бэкэнде - VBA - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь l oop пролистать листы книги и удалить тех, чье кодовое имя содержит строку «Лист», но очистить только ячейки всех других листов, кроме листа «Сводка», который я хотел бы оставить без изменений. Код иногда удаляет предназначенные листы, но иногда это не так. В этих случаях я вручную заходил в окно vba, запускал все с «Step Into» в отладчике, но, как ни странно, тогда он работал совершенно нормально. Почему это происходит? Благодарим вас за помощь!

Редактировать 1: в тех случаях, когда удаляемые листы не удаляются, их ячейки очищаются, что указывает на проблему с оператором InStr. Я попытался использовать Как , но безрезультатно.

Редактировать 2: код также работает правильно при нажатии кнопки воспроизведения в окне VBA. Случаи, когда он не работает, это когда я запускаю этот код с помощью ActiveX или кнопки формы или когда я выбираю макрос для запуска на вкладке разработчика. Я могу подтвердить, что макрос всегда запускается, когда я нажимаю кнопку activex, потому что он изменяет некоторые значения на листе до того, как достигает кода, приведенного ниже.

Редактировать 3: листы, которые код пытается удалить, были недавно добавлено другим макросом. Я думаю, что кодовое имя листов появляется только после того, как я открываю vba , как это, кажется, имеет место: макрос не работает должным образом при выполнении из кнопки, я открываю и закрываю редактор vba , а затем с помощью макроса с помощью кнопки работает.

Вот код:

    Application.DisplayAlerts = False

    For Each ws In ThisWorkbook.Sheets
        If InStr(ws.CodeName, "Sheet") > 0 Then
            ws.Delete
        ElseIf ws.CodeName <> "Summary" Then
            ws.Cells.Clear
        End If
    Next ws

    Application.DisplayAlerts = True

1 Ответ

0 голосов
/ 03 мая 2020

Сам разобрался, но оставлю это на всякий случай, если это поможет другим.

Мое последнее редактирование дало мне верный путь: недавно добавленные листы получили свое кодовое имя по умолчанию "Sheetx", когда редактор vba открыт. Таким образом, у них нет никакого кодового имени, если я не открою vba перед попыткой выполнения макроса, в результате чего их не удаляют, а вместо этого только очищают их ячейки. Итак, я закодировал для удаления любые листы с пустыми кодовыми именами, и это сработало!

If InStr(ws.CodeName, "Sheet") > 0 Or ws.CodeName = "" Then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...