Страницы: 1
RSS
внезапная ошибка Next without For
 
Пишу простейший код перед закрытием книги:


Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Sheets("Data Dump 2").Rows("2:200").Hidden = True
ThisWorkbook.Sheets("Data Dump 2").Columns("BE:BI").Hidden = True
ThisWorkbook.Sheets("Welcome!").Visible = -1
Dim wsSh As Worksheet
For Each wsSh In ThisWorkbook.Sheets
    If wsSh.Name <> "Welcome!" Then wsSh.Visible = 2
Next wsSh

ThisWorkbook.Save
End Sub


Первые две строки сокрытия колонок/строк нам не важны, самая соль в цикле for each.

Изначально код работал, все листы кроме велкам-листа успешно прятались. Потом код перестал срабатывать, проверил через окно immediate, окзаывается появилась ошибка Next without For. Не знаю какими действиями, но я исправил ее. Сейчас в этом коде опять что-то не то, хотя цикл я даже не трогал. Подскажите, что я упустил? Может это нормально, что в immediate код выдает ошибку, но тем не менее листы не скрываются...
Изменено: Nimb - 11.12.2023 13:47:55
 
Сам по себе код компилируется успешно (Menu / Debug / Compile). Выгрузите файл вместе с кодом - посмотрим, в чем дело.
Владимир
 
Я удалил всю информацию, т.к. конфиденциальность компании. Да она и не нужна.

Задача стоит следующая: нужно чтобы при открытии страницы появлялся только велкам-лист со скрином и просьбой нажать enable content.
Реализация через связку кодов при закрытии и при открытии книги (при закрытии прячем все, кроме велкам-листа, а при открытии и нажатии кнопки велкам прячется а "выбор действия" появляется). Однако код на закрытии не срабатывает и книга остается висеть в том месте, в котором закончили работу последний раз.
 
Как минимум надо поменять местами строки
Код
    ThisWorkbook.Sheets("Welcome!").Visible = 2
    ThisWorkbook.Sheets("Choose an action").Visible = -1
а то вы пытаетесь при открытии скрыть единственный видимый лист (Welcome!)
А на закрытие у меня правильно отрабатывает
Изменено: webley - 11.12.2023 15:13:15
 
Цитата
написал:
а то вы пытаетесь при открытии скрыть единственный видимый лист (Welcome!)
Опять забыл про это)
Жаль на работоспособность не повлияло. Комп перезагрузил и все равно. Может дело в настройках компании в траст центре?
 
Настройки не при чем.
Если поменять местами строки, то процедура, которая вызывается после открытия книги, будет выглядеть так:
Код
Private Sub Workbook_Open()
    Application.ScreenUpdating = False
    ThisWorkbook.Sheets("Choose an action").Visible = -1
    ThisWorkbook.Sheets("Welcome!").Visible = 2
    Application.ScreenUpdating = True
End Sub

То есть, надо открыть лист "Choose an action" и скрыть лист "Welcome!".
Именно так всё и происходит.
Изменено: sokol92 - 11.12.2023 17:13:04
Владимир
 
Цитата
написал:
Настройки не при чем. Если поменять местами строки, то процедура, которая вызывается после открытия книги, будет выглядеть так:
Именно так и поставил, но результат не меняется, у меня почему-то не отрабатывает код при закрытии - на скрине окрытая книга со всеми листами, которая сохранена на последнем месте работы
 
Возможное объяснение - когда пользователь закрывал книгу, у него была отключена обработка событий. В этом случае событие книги BeforeClose обрабатываться не будет и процедура из сообщения #1 не будет вызвана.
Я заново скачал Вашу книгу, открыл в ней все листы, закрыл. При повторном открытии виден только один лист.
Еще вариант - запрещено выполнение макросов.
Поставьте отладочное сообщение (Msgbox) в процедуру закрытия книги.
Изменено: sokol92 - 11.12.2023 17:33:26
Владимир
 
Возвращаюсь с новостями.
После определенных манипуляций я нашел момент в который код перестает срабатывать. Если я оставляю в бефор клоусе только пару строчек "скрыть/показать/сделать активным листом", то это код переваривает. Если я укрупняю код, ненужные строки, "мысли вслух" и прочее храню внизу закомментированными + добавляю цикл, то код перестает срабатывать. Ленивый однако у меня эксель. По итогу я удалил все комментарии и все необязательные операции в коде, и обе процедуры заработали:

Код
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Sheets("Welcome!").Visible = -1
    Sheets("Welcome!").Activate
    Dim wsSh As Worksheet
    For Each wsSh In ThisWorkbook.Sheets
        If wsSh.Name <> "Welcome!" Then wsSh.Visible = 2
    Next wsSh
End Sub

Private Sub Workbook_Open()
    Sheets("Choose an action").Visible = -1
    Sheets("Welcome!").Visible = 2
End Sub
 
Цитата
Nimb написал:
Ленивый однако у меня эксель.
Увы, я не верю в чудеса.
Стартуйте Excel, наберите Alt+F11, закройте все проекты (надстройки, личная книга макросов, ...), если они есть.
Откройте "хорошую" книгу и проведите свой (успешный) эксперимент 10 раз подряд. Сохраните эту книгу ("хорошую").
Сделайте копию "хорошей" книги. Откройте копию в Excel и добавьте комментарии в код так, чтобы эта книги стала "плохой" (ведет себя при сохранении и последующем открытии не так, как задумано). Сохраните эту книгу ("плохую") и закройте ее.
Не закрывая Excel, вновь откройте "хорошую" книгу и убедитесь, что с ней вcё в порядке.
Выложите, пожалуйта, на форум "хорошую" и "плохую" книги.
Владимир
Страницы: 1
Наверх