Страницы: 1
RSS
Запрет на переход на другой Лист
 
Нужно организовать запрет на переход на другой Лист книги, пока не введешь необходимые данные на Листе1.  
Сделал, следующее:  
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)  
With ThisWorkbook  
   If .Sheets("Лист1").Cells(1, 1).Value = "" Then  
       .Sheets("Лист1").Activate  
       .Sheets("Лист1").Cells(1, 1).Select  
       MsgBox ("Для продолжения работы введите любое слово в ячейку А1 на Лист1!")  
   End If  
End With  
End Sub  
вроде работает как надо, но появилась проблема при открытии/закрытии книги (Вылазит мой мэсэдж, ну и лист активируется), т.к. при открытии книги в ячейке ничего нет, а при закрытии не всегда нужно чтобы в данной ячейке что-то было.  
Как сделать чтобы SheetDeactivate не отрабатывал на открытии\закрытии книги, при этом с ячейкой А1 никаких действий макросом производить нельзя.
 
может проще скрыть лист?  
 
Sheets(1).Visible =0 или Sheets(1).Visible =2
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
не, не катит, Листы должны быть открыты
 
Я бы использовал вот эту продцедуру:  
 
Private Sub Workbook_SheetActivate(ByVal Sh As Object)  
If Sh.Name = "Лист1" Then Exit Sub  
With ThisWorkbook.Sheets("Лист1")  
If .Cells(1, 1).Value = "" Then  
   .Activate  
   .Cells(1, 1).Select  
   MsgBox "Для продолжения работы введите любое слово в ячейку А1 на Лист1!"  
End If  
End With  
End Sub
Редко но метко ...
 
У меня ничего не "вылазит" при открытии/закрытии книги.  
Наверно, у Вас там макрос, который активирует другой лист при открытии/закрытии книги?  
А вот два раза сообщение появляется. Я бы так поправил:  
 
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)  
If Sh Is Sheets("Лист1") Then  
   If Sh.Cells(1, 1).Value = "" Then  
       Application.EnableEvents = False  
       Sh.Activate  
       Cells(1, 1).Select  
       Application.EnableEvents = True  
       MsgBox ("Для продолжения работы введите любое слово в ячейку А1 на Лист1!")  
   End If  
End If  
End Sub
 
вот через индекс с одним окошком  
Private Sub Workbook_SheetActivate(ByVal Sh As Object)  
If ActiveSheet.Index <> 1 Then  
   With ThisWorkbook  
       If .Sheets("Лист1").Cells(1, 1).Value = "" Then  
           .Sheets("Лист1").Activate  
           .Sheets("Лист1").Cells(1, 1).Select  
           MsgBox ("введите что-нибудь ")  
       End If  
   End With  
End If  
End Sub
 
Да, все верно, забыл упомянуть, что при открытии книги некоторые листы становятся видимыми, а при закрытии книги не видимыми.
 
Используйте отключение/включение событий, например  
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)  
Application.EnableEvents = False  
Sheets("Лист2").Activate  
Application.EnableEvents = True  
End Sub
 
А есть еще варианты?  
Что-то тянет в сторону дополнительной глобальной переменной для книги, но не догоняю в какой момент ее менять  
Например при открытии/закрытии t="!"  
и проверка была бы такая:  
If Sh.Cells(1, 1).Value = "" and t<>"!" Then  
вот только не пойму в какой момент значение t менять
 
а чем вам мой или egonomist - а варианты не подходят ?
Редко но метко ...
 
Можно и так, но строк будет больше, хотя они будут короче :)  
Модуль книги:  
 
Dim t As Boolean 'true - не отслеживать активацию листов  
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)  
t = True  
Sheets("Лист2").Activate  
t = False  
End Sub  
 
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)  
If t Then Exit Sub  
If Sh Is Sheets("Лист1") Then  
   If Sh.Cells(1, 1).Value = "" Then  
       t = True  
       Sh.Activate  
       Cells(1, 1).Select  
       t = False  
       MsgBox ("Для продолжения работы введите любое слово в ячейку А1 на Лист1!")  
   End If  
End If  
End Sub
 
GIG_ant, тем, что макросом при открытии книги идет пробежка по листам книги и они становятся видимыми, а про закрытии наоборот.  
Совет Казанского про Application.EnableEvents = False помог бы, но теряется красота (листики появляются\пропадают) :)
 
Я не вижу всего проекта, но взникает вопрос: Для чего может понадобиться при открытии показывать и главное при закрытии СКРЫВАТЬ листы?? Вот этот момент не особенно понятен.
Редко но метко ...
 
Забава для юзера. Прикольно же когда странички сами бегают :)
Страницы: 1
Читают тему
Наверх