poniedziałek, 30 czerwca 2014

Arkusz startowy gdy makra zostały wyłączone

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:

1Private Sub Workbook_Open()
2    
3    Sheets("MacroEnabled").Activate
4    
5End Sub

Krok 2. zapisanie arkusza w sytuacji, gdy skoroszyt został otwarty w wariancie MacroEnabled. Wykorzystamy zdarzenie Before_Save oraz dodatkową procedurę pomocniczą:

01Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
02        
03    If ActiveSheet Is Sheets("MacroDisabled") Then Exit Sub
04    
05    If PoprzedniSheet Is Nothing Then
06        
07        Set PoprzedniSheet = ActiveSheet
08        Sheets("MacroDisabled").Activate
09        
10        'kluczowa metoda- wywoływana o ile użytkownik
11        'nie zamyka pliku a jedynie go zapisuje lub
12        'rezygnuje z zapisania/zamknięcia
13 
14        Application.OnTime Now, "AktywowaniePoprzedniego"
15    End If
16End Sub

Krok 3. w osobnym module tworzymy zmienną publiczną oraz kod przywracający aktywny arkusz:
01Public PoprzedniSheet As Worksheet
02 
03Public Sub AktywowaniePoprzedniego()
04 
05    If Not PoprzedniSheet Is Nothing Then
06        PoprzedniSheet.Activate
07        Set PoprzedniSheet = Nothing
08    End If
09    
10End Sub

Brak komentarzy:

Prześlij komentarz