Страницы: 1
RSS
Запрет открытия книги второй Excel
 
Уважаемый Господа,  
 
Прошу помочь в написании макроса.  
Надо чтоб когда открыт один определенный файл (в моем случае это годовой отчет), второй excel файл (любая книга), немогла бы быть открыта и excel писал бы MsgBox или что-то типа того: "Извиняйте, но во время просмотра годового отчета, др. файлы excel открывать нельзя!".  
 
Пытался поиграть с "Worbooks.count = ", но что-то сообразить немогу.  
 
Помогите пожалуйста!
 
Private Sub Workbook_Open()  
   If Workbooks.Count > 1 Then ThisWorkbook.Close  
End Sub
 
Спасибо,  
 
Я так уже пробовал, но мне немного подругому надо.  
 
Тут срабатывать будет только тогда когда открываешь книгу с этим кодом, а мне надо так, чтоб код был вписан в мой файл. и если пользователь хочет открыть другую книгу при открытой моей, у него будет выскакивать сообщние или просто небудет открываться.  
 
Есть идеи?!
 
Вот это можно заставить крутиться, только сейчас оно закрывает и всякие PRSONAL.XLS тоже...  
 
Sub checkWb()  
Dim wbs As Workbook  
For Each wbs In Workbooks  
If wbs.Name <> ThisWorkbook.Name Then wbs.Close False  
Next  
End Sub
 
Хочу добавить одну оговорку. Независимо от решения, пользователь может открыть вторую копию Excel и там открыть и посмотреть все нужные ему файлы :) здесь уже ничто не поможет.
 
Нууу The_Prist как всегда на высоте!  
 
Спасибо большое!  
 
 
Всё работает, но как назло через 10 минут использования обнаружил дырку.  
 
Существует другой файл с макросами и если его включить в парралель, то сообщение ввываливается, всё ок, а этот файл второй который запущен запрашивает сохранение да/нет/отмена.    
 
Если Да или нет пишешь, то всё ок он закрывается, а вот если Отмена, то он оставляет этот файл в параллель.....    
Уважаемый The_Prist Можно как то откорректировать?!
 
Уважаемый Haken,  
 
Я понимаю что всегда можно обойти любую защиты и преодалеть любые преграды, но я это делаю для того чтоб на работе сотрудники случайно не попртили мои файлы и свои тоже.  
 
У меня просто при открытиии моего файла "кастрируется" лента наверху все скролбары, наименования листов и ячеек, сетка и т.д. и т.п. и файл можно только просматривать и вносить свои изменения и только те что позволены защитой.  
 
Но когда мои файл "кастрирует" Excel, он мочит и все смежные и параллельно открывающиеся файлы и поэтому я и пытаюсь обезопасить своих сотрудников.  
 
 
 
ЕЩЕ НЕБОЛЬШАЯ ПРОСЬБА К УЧАСТНИКАМ,  
 
Возможно ли ещё добавить такую мульку=) чтоб сам этот файл (основной) не открывался или сразу закрывался при открытиии если открыты другие файлы и писал что-то типа: "Закройте все файлы excel, а потом уж меня открывайте"...  
 
Заранее спасибо!
 
Скроллбары, сетку, ярлыки листов и прокрутку ведь можно отключить только для этого файла. Вот ленту не знаю, но ведь можно отсеживать Workbooks_Activate/Deactivate и кодом отключать, когда активен этот файл.
 
Лента умирает на все файлы.  
Пока обратно не включишь....
 
Ну так вот её кодом и скрывать при активации и открывать при деактивации.
 
{quote}{login=Hugo}{date=31.03.2010 05:36}{thema=}{post}Ну так вот её кодом и скрывать при активации и открывать при деактивации.{/post}{/quote}  
 
Уважаемый Hugo,  
 
Непонял что Вы имеет в виду? Кого "её" скрывать при активации и открывать при деактивации и как прописать код и где ThisWorkbook видимо?    
 
То что прислал The_Prist идеально работает, но я его попросил дополнить и надеюсь что поможет...  
 
С уважением,  
Александр
 
Ещё небольшая проблема!  
 
Извинясь за настойчивость, но сильно поможет в работе.  
 
Короче надо ещё так чтоб если открыто несколько книг Excel, то при открытии моего файла он или отказывался запускаться пока запущены другие книги или закрывал их по очереди естественно предлагая сохранить или нет..., нго вот чтоб отмену сделать непозволял....  
 
 
Заранее Спасибо!  
 
С уважением,  
Александр
 
Уважаемый The_Prist,  
 
За первый вопрос Спасибо, посмотрите пожалуйста второй.  
 
А по поводу оплаты благодарностей шутка или нет у вас в подписи?!  
 
С уважением,  
Александр
 
{quote}{login=gaz-polutorka}{date=01.04.2010 09:24}{thema=Re: }{post}{quote}  
 
Уважаемый Hugo,  
 
Непонял что Вы имеет в виду? Кого "её" скрывать при активации и открывать при деактивации и как прописать код и где ThisWorkbook видимо?    
 
То что прислал The_Prist идеально работает, но я его попросил дополнить и надеюсь что поможет...  
 
С уважением,  
Александр{/post}{/quote}  
 
Я говорил про ленту. Сам этим не пользуюсь, но Вы вероятно её кодом скрываете, или это можно сделать кодом. Так вот, в порядке версии - проверять не буду - можно попробовать этот код прописать на событие активации/деактивации книги.
 
Уважаемый Hugo,  
 
Вас понял, большое спасибо за подсказку, сегодня попробую!  
 
С уважением,  
Александр
 
Всем Спасибо!  
 
Все отладил, вот выкладываю код который есть у меня, может кому пригодиться для работы.  
 
Я сам не специалист и использую те коды что уже написаны и самые простые команды до которых дотюкиваю сам, поэтому прошу сильно не кретиковать если написано что-то не совсем логично и можно написать проще.  
 
К Module1 вписал 2 макроса, а именно:  
 
Sub ПокажиМеня()  
Application.ScreenUpdating = False  
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"  
Application.DisplayFormulaBar = True  
Application.DisplayStatusBar = True  
ActiveWindow.DisplayHeadings = True  
ActiveWindow.DisplayHorizontalScrollBar = True  
ActiveWindow.DisplayVerticalScrollBar = True  
Application.ScreenUpdating = True  
End Sub  
 
Sub СпрячьМеня()  
Application.ScreenUpdating = False  
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"  
Application.DisplayFormulaBar = True  
Application.DisplayStatusBar = False  
ActiveWindow.DisplayHeadings = False  
ActiveWindow.DisplayHorizontalScrollBar = True  
ActiveWindow.DisplayVerticalScrollBar = True  
Application.ScreenUpdating = True  
End Sub  
 
В ThisWorkbook вписал следующее при помощи всех Вас и особенно The_Prist  
 
Private WithEvents App As Application  
 
Public Function lCountWorkbooks() As Long  
Dim lCount As Long, wbBook As Workbook  
For Each wbBook In Application.Workbooks  
If wbBook.Windows(1).Visible Then lCount = lCount + 1  
Next wbBook  
lCountWorkbooks = lCount  
End Function  
 
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)  
Application.ScreenUpdating = False  
     
   Select Case MsgBox("Сохранить изменения в файле '" & Me.Name & "' ?", vbYesNo + vbQuestion, Title:="ООО ''Рога и копыта''")  
           Case vbYes:  Module1.ПокажиМеня: Me.Save:  
           Case vbNo: Module1.ПокажиМеня: Me.Saved = True  
       End Select  
         
Application.ScreenUpdating = True  
Set App = Nothing  
End Sub  
 
 
       Private Sub Workbook_Open()  
       Set App = Application  
       End Sub  
 
 
 
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)  
Dim Msg As String  
Msg = ("Файл Excel " & Me.Name & " может работать только один!" & vbCrLf & "Закройте " & Me.Name & " и открывайте любые другие файлы Excel и наобарот!")  
If lCountWorkbooks > 1 Then  
MsgBox Msg, vbCritical, "ООО ''Рога и Копыта''"  
Wb.Close (SaveChanges = False)  
End If  
 
Application.ScreenUpdating = False  
 
   Application.DisplayFormulaBar = True  
   Application.DisplayStatusBar = False  
   ActiveWindow.DisplayHeadings = False  
   ActiveWindow.DisplayGridlines = False  
   Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"  
Ëèñò1.ScrollArea = ("A1:AH122")  
Ëèñò2.ScrollArea = ("A1:AL145")  
Ëèñò3.ScrollArea = ("A1:G89")  
Ëèñò4.ScrollArea = ("B7:E22")  
Application.ScreenUpdating = True  
Set App = Application  
 
End Sub  
 
В код каждого листа добавил свои свойства чтоб включить или отключить ненужные  
Прочку к примерую:  
 
На лист 1 вписал:  
Private Sub Worksheet_Activate()  
Application.ScreenUpdating = False  
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"  
Application.DisplayFormulaBar = True  
Application.DisplayStatusBar = False  
ActiveWindow.DisplayHeadings = False  
ActiveWindow.DisplayHorizontalScrollBar = True  
ActiveWindow.DisplayVerticalScrollBar = True  
Application.ScreenUpdating = True  
End Sub  
 
На лист2 вписал:  
 
Private Sub Worksheet_Activate()  
Application.ScreenUpdating = False  
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"  
Application.DisplayFormulaBar = True  
Application.DisplayStatusBar = False  
ActiveWindow.DisplayHeadings = False  
ActiveWindow.DisplayHorizontalScrollBar = False  
ActiveWindow.DisplayVerticalScrollBar = False  
Application.ScreenUpdating = True  
End Sub  
 
 
Таким образом получился файл, который работает только когда он один и неиспользует никаких лишних функций, а самое главное ленту!  
Становиться удобным для просмотра и приятным в использовании.  
 
За отключение ленты отдельное спасибо МАСТЕРУ ЙОДА! Ник не помню, но на аватаре у него мастер ЙОДА!!!  
 
С уважением,  
Александр
 
Ëèñò1.ScrollArea = ("A1:AH122")  
Ëèñò2.ScrollArea = ("A1:AL145")  
Ëèñò3.ScrollArea = ("A1:G89")  
Ëèñò4.ScrollArea = ("B7:E22")  
 
Поправка в Код!!!!!!!!  
Сглюсил при переносе код!  
Лист1.ScrollArea = ("A1:AH122")  
Лист2.ScrollArea = ("A1:AL145")  
Лист3.ScrollArea = ("A1:G89")  
Лист4.ScrollArea = ("B7:E22")
 
А почему так нельзя, на нужные листы (проверил - на книгу почему-то не работает)  
 
Private Sub Worksheet_Activate()  
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"  
End Sub  
 
 
Private Sub Worksheet_Deactivate()  
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"  
End Sub
 
На книгу сработало, когда её закрыл :)
 
Уважаемый Hugo,  
 
Я и сам незнаю почему так нельзя!  
Тут вопрос к Мастеру ЙОДА, он это написал и главное что это работает=)))  
Я самый обычный пользователь и совсем не изучал програмирование, просто узнав про некоторые возможности, немного ими пользуюсь.  
 
С уважением,  
Александр
 
Нет у меня Ribbon'а, иначе бы проверил. На мессиджбокс сработало нормально.
Страницы: 1
Читают тему
Наверх