Na początek opis problemu:
- skoroszyt posiada dwa arkusze- MacroDisabled i MacroEnabled
- w sytuacji gdy skoroszyt jest otwierany z dostępem do makr automatycznie wyświetlony powinien zostać arkusz MacroEnabled. Ten punkt możemy uznać za prosty i oczywisty gdyż wszystko czego potrzebujemy to prosta procedura zdarzenia Private Sub Workbook_Open()
- w sytuacji gdy skoroszyt otwierany jest bez dostępu do makr zawsze wyświetlony ma być arkusz MacroDisabled. Niestety, nie możemy sięgnąć po procedurę zdarzenia gdyż makra są wyłączone.
- z tego samego skoroszytu korzystamy naprzemiennie w opcji Macro Enabled i Macro Disabled
- lista zakładek arkuszowych jest ukryta (opcjonalnie arkusze mogą być ukryte) dlatego też po otwarciu pliku w opcji MacroDisabled nie jesteśmy w stanie ręcznie przejść do arkusza MacroEnabled.
Jedyna sytuacja, która staje się problematyczna to moment, gdy po otwarciu pliku w opcji MacroEnabled (krok 1) następuje otwarcie pliku w opcji MacroDisabled (krok 2). Krok 1 otwiera arkusz Enabled lecz musi zamknąć skoroszyt w opcji Disabled. Oczywiście możemy wykorzystać zdarzenie Workbook_BeforeSave lecz należy pamiętać, że staje się to problematyczne gdy użytkownik ostatecznie postanawia wrócić do pracy i nie zamyka skoroszytu. W tej sytuacji aktywowany zostałby arkusz Disabled i dalsza praca nie mogła by być kontynuowana.
Poniżej prezentuję proponowane rozwiązanie tej sytuacji wraz z dodatkowymi komentarzami.
Krok 1. otwarcie skoroszytu z dostępem do makr (MacroEnabled). Wykorzystamy zdarzenie Open w celu aktywacji arkusza:
1 | Private Sub Workbook_Open() |
3 | Sheets( "MacroEnabled" ).Activate |
Krok 2. zapisanie arkusza w sytuacji, gdy skoroszyt został otwarty w wariancie MacroEnabled. Wykorzystamy zdarzenie Before_Save oraz dodatkową procedurę pomocniczą:
01 | Private Sub Workbook_BeforeSave( ByVal SaveAsUI As Boolean , Cancel As Boolean ) |
03 | If ActiveSheet Is Sheets( "MacroDisabled" ) Then Exit Sub |
05 | If PoprzedniSheet Is Nothing Then |
07 | Set PoprzedniSheet = ActiveSheet |
08 | Sheets( "MacroDisabled" ).Activate |
14 | Application.OnTime Now, "AktywowaniePoprzedniego" |
Krok 3. w osobnym module tworzymy zmienną publiczną oraz kod przywracający aktywny arkusz:
01 | Public PoprzedniSheet As Worksheet |
03 | Public Sub AktywowaniePoprzedniego() |
05 | If Not PoprzedniSheet Is Nothing Then |
06 | PoprzedniSheet.Activate |
07 | Set PoprzedniSheet = Nothing |
Brak komentarzy:
Prześlij komentarz