Przesunięty przez: Artik 27-09-2019, 09:47 |
Nowa karta na wstążce |
Autor |
Wiadomość |
pi3cho
Exceloholic

Posty: 240
|
Wysłany: 30-10-2018, 11:22 Nowa karta na wstążce
|
|
|
Witam,
W obiekcie Ten_skoroszyt mam odwołanie do procedury wykonywanej podczas zdarzenia Workbook_Open
Kod: | Private Sub Workbook_Open()
Call CreateToolbar
End Sub |
Procedura tworzy niestandardowy pasek narzędzi, działa okej.
Nie rozumiem natomiast dlaczego otworzenie innego skoroszytu, podczas gdy ten z makrem jest zamknięty, powoduje pojawienie się paska narzędzi w innym skoroszycie. Wydawało mi się, że skoro procedura CreateToolbar jest uruchamiana z obiektu ThisWorkbook to będzie aktywna tylko w tym skoroszycie, w którym jest kod.
Jakąś wskazówką może być coś co wyczytałem w internetach:
Cytat: | You need to stick with the 'Application' approach, the worksheet menu bar is an application object. |
Oznacza to zatem, że otworzenie dowolnego skoroszytu powoduje uruchomienie kodu umieszczonego wewnątrz zdarzenia Workbook_Open? Ponieważ tylko reakcja na zdarzenie Workbook_Open prowadzi do uruchmienia procedury CreateToolbar
Coś chyba nie gra w moim rozumowaniu |
|
 | ID posta:
355394
|
|
|
 |
|
|
|
Tajan

Pomógł: 4729 razy Posty: 10412
|
Wysłany: 30-10-2018, 12:03
|
|
|
Skoro dodajesz pasek narzędziowy do aplikacji to w pozostaje on zapamiętany w aplikacji mimo że skoroszyt jest zamknięty. Jeżeli pasek ma być niedostępny po zamknięciu pliku, należałoby go usunąć w procedurze Workbook_BeforeClose.
Jeżeli pasek ma być dostępny tylko w jednym, konkretnym, skoroszycie to należałoby go tworzyć w procedurze Workbook_Activate i usuwac w Workbook_Deactivate. |
|
 | ID posta:
355403
|
|
|
 |
|
|
pi3cho
Exceloholic

Posty: 240
|
Wysłany: 30-10-2018, 12:42
|
|
|
Dzięki za odpowiedź.
Stosuję się do Twoich odpowiedzi ale skoro nie działa to pewnie nieudolnie (może nie w tym skoroszycie co trzeba jest marko?).
Mój przykład:
Mam skoroszyt makro.xlsm oraz skoroszyt przyklad.xlsx.
W pliku makro.xlsm mam następujący kod w obiekcie Ten_skoroszyt:
Kod: | Private Sub Workbook_Open()
Call CreateToolbar
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Msg As String
If Me.Saved = False Then
Msg = "Czy zapisać zmiany w skoroszycie "
Msg = Msg & Me.Name & "?"
Ans = MsgBox(Msg, vbQuestion + vbYesNoCancel)
Select Case Ans
Case vbYes
Me.Save
Case vbCancel
Cancel = True
Exit Sub
End Select
End If
Call DeleteToolbar
Me.Saved = True
End Sub
Sub DeleteToolbar()
On Error Resume Next
CommandBars(TOOLBARNAME).Delete
On Error GoTo 0
End Sub |
Makro CreateToolbar jest w zwykłym module skoroszytu makro.xlsm
Mimo zamknięcia skoroszytu makro.xlsm pasek narzędziowy w skoroszycie przyklad.xlsx wciąż jest obecny.
Załączam przykład.
Pozdrawiam
makro.xlsm
|
Pobierz Plik ściągnięto 106 raz(y) 15.46 KB |
|
|
 | ID posta:
355410
|
|
|
 |
|
|
Tajan

Pomógł: 4729 razy Posty: 10412
|
Wysłany: 30-10-2018, 12:55
|
|
|
Przenieś procedurę "DeleteToolbar" do Module1 i zmień:
Kod: | CommandBars(TOOLBARNAME).Delete | na:
Kod: | Application.CommandBars(TOOLBARNAME).Delete |
|
|
 | ID posta:
355412
|
|
|
 |
|
|
pi3cho
Exceloholic

Posty: 240
|
Wysłany: 30-10-2018, 13:26
|
|
|
A jak usunąć utworzone wcześniej dodatkowe paski narzędzi z poziomu aplikacji?
Wykomentowałem kod tworzący dodatkowe paski ale wciąż po uruchomieniu skoroszytu te paski są widoczne. Bałagan mi się tu robi:( |
|
 | ID posta:
355419
|
|
|
 |
|
|
Tajan

Pomógł: 4729 razy Posty: 10412
|
Wysłany: 30-10-2018, 13:45
|
|
|
Jezeli chcesz "hurtem" tu zrobić, to uruchom makro:
Kod: | Sub usunPaski()
Dim cmdBar As CommandBar
For Each cmdBar In Application.CommandBars
If Not cmdBar.BuiltIn Then cmdBar.Delete
Next
End Sub |
|
|
 | ID posta:
355423
|
|
|
 |
|
|
pi3cho
Exceloholic

Posty: 240
|
Wysłany: 30-10-2018, 13:59
|
|
|
O, i to jest to czego szukałem!
Usunąłem wszystkie zbudowane wcześniej paski narzędzi i spróbuję dodać jeszcze raz stosując się do Twoich wskazówek.
pi3cho w dniu: 30-10-2018, 14:25 napisał/a: | Jeżeli dobrze zrozumiałem, to jeśli chcę aby pasek narzędzi był widoczny w danym skoroszycie to muszę go utworzyć w procedurze Workbook_Activate i usuwac w Workbook_Deactivate tego konkretnego skoroszytu? Tym samym skoroszyt zmieni się z xlsx na xlsm? Zgadza się? |
edycja Zbiniek:
Proszę korzystać z opcji edytowania wypowiedzi – przycisk „edytuj”. Opcja jest dostępna bodajże przez 30 minut od momentu wysłania wypowiedzi. |
|
 | ID posta:
355425
|
|
|
 |
|
|
Tajan

Pomógł: 4729 razy Posty: 10412
|
Wysłany: 30-10-2018, 20:18
|
|
|
Zgadza się! |
|
 | ID posta:
355438
|
|
|
 |
|
|
pi3cho
Exceloholic

Posty: 240
|
Wysłany: 31-10-2018, 12:31
|
|
|
@Tajan dziękuję za pomoc i odpowiedzi
Ostatecznie udało się zrobić to czego potrzebowałem czyli dodatek xlam tworzący paski narzędzi w odpowiednich skoroszytach. Żeby jednak dodatek odpowiednio reagował na zdarzenia Workbook_Activate trzeba było zbudować moduł klasowy, co znalazłem na internetach.
Tak czy siak, dzięki!
Pozdrawiam |
|
 | ID posta:
355475
|
|
|
 |
|
|
Tajan

Pomógł: 4729 razy Posty: 10412
|
Wysłany: 31-10-2018, 13:26
|
|
|
Nic nie pisałeś, że to ma być dodatek. Nie wiem co rozumiesz pod nazwą moduł klasowy, ale w takim przypadku można w module ThisWorkbook dodatku zadeklarować zmienną typu Application i sterować zdarzeniami tej zmiennej. Coś takiego:
Kod: | Dim WithEvents app As Application
Const SKOROSZYT As String = "nazwaPliku.xlsx"
Private Sub Workbook_Open()
Set app = Application
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set app = Nothing
End Sub
Private Sub app_WorkbookActivate(ByVal Wb As Workbook)
If Wb.Name = SKOROSZYT Then
'tworzymy pasek
End If
End Sub
Private Sub app_WorkbookDeactivate(ByVal Wb As Workbook)
If Wb.Name = SKOROSZYT Then
'usuwamy pasek
End If
End Sub
|
|
|
 | ID posta:
355482
|
|
|
 |
|
|
|
Nie możesz pisać nowych tematów Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
 |
Strona używa plików cookies.
Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe
|