Przesunięty przez: Artik 26-09-2019, 23:14 |
Excel 2010 - Zaznaczanie wybranej pozycji na wstążce |
Autor |
Wiadomość |
Marti
ExcelSpec


Wersja: Win Office 2019
Pomógł: 98 razy Posty: 997
|
Wysłany: 22-02-2018, 07:31
|
|
|
Odgrzewam swój stary temat.
Dlaczego zaznaczenie pozycji na wstążce działa tylko z Workbook_Open a nie przy każdym powrocie do mojego pliku?
Kod: | Private Sub Workbook_Activate()
Application.OnTime Now, "AktywujTab"
End Sub |
Cokolwiek innego przypnę do tej procedury to się wykonuje, a zaznaczanie wstążki niestety nie |
_________________ Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują. |
|
 | ID posta:
341027
|
|
|
 |
|
|
|
Artik


Wersja: Win Office 365
Pomógł: 3091 razy Posty: 10240
|
Wysłany: 22-02-2018, 09:32
|
|
|
W prcedurze AktywujTab, na czas testów, zakomentuj linię Kod: |
On Error Resume Next | Jeżeli będzie sypać błędem, to znaczy, że zmienna Rib jest pusta. I wtenczas dociekaj dlaczego.
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
341034
|
|
|
 |
|
|
Marti
ExcelSpec


Wersja: Win Office 2019
Pomógł: 98 razy Posty: 997
|
Wysłany: 22-02-2018, 10:11
|
|
|
No właśnie zmienna Rib jest pusta, a przecież jest zmienną publiczną
Kod: | Public Rib As IRibbonUI
Public Sub MyAddInInitialize(Ribbon As IRibbonUI)
Set Rib = Ribbon
End Sub |
Co może powodować jej zerowanie? Albo jak ją ponownie ustanowić? |
_________________ Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują. |
|
 | ID posta:
341038
|
|
|
 |
|
|
Artik


Wersja: Win Office 365
Pomógł: 3091 razy Posty: 10240
|
Wysłany: 22-02-2018, 11:04
|
|
|
Marti napisał/a: | Co może powodować jej zerowanie? | Wspomniane kiedyś użycie End oraz gwałtowne przerwanie wykonania kodu (nieobsłużony przez Ciebie błąd i naciśnięcie w pojawiającym się oknie przycisku [End]) a także, w trakcie budowy projektu, istotna zmiana kodu (szczególnie dodawanie lub usunięcie procedur z projektu), to trzy główne przyczyny zerowania wszystkiego.
Marti napisał/a: | Albo jak ją ponownie ustanowić? |
Może początkowo wyglądać strasznie, ale to nie jest nic trudnego. Zapoznaj się z dwoma wątkami:
http://www.excelforum.pl/viewtopic.php?p=227986 gdzie siwtom wykłada kawę na ławę. W RibbonLoad ważnym jest wywołanie procedury SaveRef. A potem wszędzie, gdzie będziesz się odwoływać do zmiennej rb najpierw sprawdzasz, czy nie jest Nothing. Jeżeli jest, to wywołujesz ReloadRibbon.
Drugi wątek, to mój
http://www.excelforum.pl/viewtopic.php?t=51069
Odrzuć w nim wszystko, co dotyczy próby rozwiązania problemu opisanego w wątku. W zasadzie cały mechanizm jest pokazany w pierwszym poście.
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
341044
|
|
|
 |
|
|
Marti
ExcelSpec


Wersja: Win Office 2019
Pomógł: 98 razy Posty: 997
|
Wysłany: 22-02-2018, 11:48
|
|
|
Artik, wielkie dzięki za namiary
Teraz kod odnośnie wstążki wygląda tak:
Kod: | Public Rib As IRibbonUI
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(destination As Any, source As Any, ByVal length As Long)
Public Sub MyAddInInitialize(Ribbon As IRibbonUI)
Set Rib = Ribbon
SaveRef Rib
End Sub
Sub SaveRef(obj As Object)
ThisWorkbook.Names.Add Name:="RibbonPointer", RefersTo:=ObjPtr(obj)
ThisWorkbook.Saved = True
End Sub
Public Function GetRef(ByVal RibbonPointer As Long) As Object
Dim obj As Object
CopyMemory obj, RibbonPointer, LenB(RibbonPointer)
Set GetRef = obj
Set obj = Nothing
End Function
Sub ReloadRibbon()
If Rib Is Nothing Then
Set Rib = GetRef(Replace(ThisWorkbook.Names("RibbonPointer").RefersTo, "=", ""))
End If
End Sub
Sub AktywujTab()
On Error Resume Next
Rib.ActivateTab "CustomTab"
End Sub |
No i jeszcze uzupełniłem w Workbook_Activate
Kod: | Private Sub Workbook_Activate()
Call ReloadRibbon
Application.OnTime Now, "AktywujTab"
End Sub |
Czy w tym przypadku metoda CopyMemory będzie bezpieczna dla mojego pliku? |
_________________ Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują. |
|
 | ID posta:
341047
|
|
|
 |
|
|
Marti
ExcelSpec


Wersja: Win Office 2019
Pomógł: 98 razy Posty: 997
|
Wysłany: 22-02-2018, 12:06
|
|
|
No niestety
Musiałem się szybciutko wycofać z wprowadzonych modyfikacji, bo za każdym razem przy otwieraniu wywalało mi całego Excela |
_________________ Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują. |
|
 | ID posta:
341051
|
|
|
 |
|
|
Artik


Wersja: Win Office 365
Pomógł: 3091 razy Posty: 10240
|
Wysłany: 22-02-2018, 12:15
|
|
|
Moje problemy opisane w przywoływanym wyżej wątku występowały na etapie budowy projektu, kiedy ciągle coś w nim zmieniałem. W tym także przypadkowe zmiany adresu pamięci wskaźnika do Rib.
Jak będziesz grzeczny, myślę że nie powinieneś mieć problemów.
Drobne zmiany:
1. Ukryłbym nazwę, by jakiś użyszkodnik jej nie zmienił grzebiąc w menadżerze nazw: Kod: | ThisWorkbook.Names.Add Name:="RibbonPointer", RefersTo:=ObjPtr(obj), Visible:=False | 2. Trochę inna konstrukcja wywołania: Kod: | ' moduł ThisWorkbook
Private Sub Workbook_Activate()
Application.OnTime Now, "AktywujTab"
End Sub
'moduł standardowy
Sub AktywujTab()
Call ReloadRibbon
On Error Resume Next
Rib.ActivateTab "CustomTab"
End Sub |
Obsługa błędu w tej ostatniej zostaje na wszelkij pożarnyj słuczaj bo chyba szybciej by doszło do zgonu aplikacji w przypadku źle zapisanego adresu pamięci. Ale niewiele kosztuje, a może pomoże.
Już po napisaniu powyższego pojawił się Twój nowy post.
Albo sam prześledzisz co jest nie tak, albo przedstawisz do analizy załącznik.
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
341052
|
|
|
 |
|
|
Marti
ExcelSpec


Wersja: Win Office 2019
Pomógł: 98 razy Posty: 997
|
Wysłany: 22-02-2018, 12:32
|
|
|
Artik napisał/a: | Drobne zmiany: |
Może i drobne, ale dzięki nim plik zaczął działać poprawnie
Cały czas obawiam się konsekwencji, bo projekt nie jest zrobiony "na cacy" i ciągle w nim grzebię (formularze i zwykłe moduły) |
_________________ Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują. |
|
 | ID posta:
341054
|
|
|
 |
|
|
Artik


Wersja: Win Office 365
Pomógł: 3091 razy Posty: 10240
|
Wysłany: 22-02-2018, 12:50
|
|
|
To na czas budowy wyłączaj odzysk wskaźnika. Najwyżej Ci tylko nie aktywuje Tab-a, a przynajmniej nie wywali aplikacji.
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
341057
|
|
|
 |
|
|
Marti
ExcelSpec


Wersja: Win Office 2019
Pomógł: 98 razy Posty: 997
|
Wysłany: 14-12-2018, 11:11
|
|
|
Wracam do tematu wstążki.
Od kilku miesięcy trwa w mojej firmie migracja Win7 do Win10 z pozostawieniem Office2010 (chociaż już są koszmarne plany przejścia na LibreOffice w ramach cięcia kosztów )
Dopadło w końcu i moją stację. Ten sam Office2010, a jednak niektóre pliki głupieją, te ze zmodyfikowaną wstążką. Tylko niektóre. Każde wciśnięcie przycisku na "mojej wstążce" powoduje automatyczne całkowite zamknięcie się pliku. Wywołanie samego makra które jest podpięte pod ten przycisk działa prawidłowo. Każde wciśnięcie jakiegokolwiek przycisku powoduje zamknięcie pliku bez możliwości podejrzenia co go boli.
np.
Kod: | Sub x_wskaznik_wykonania(control As IRibbonControl)
Call wskaznik_wykonania
End Sub |
wywołanie procedury wskaznik_wykonania zamyka mi plik.
Co ma zmiana Win7 na Win10 do prawidłowego działania Excela?
System operacyjny mam 64bit natomiast Office 32 bit. Ale Win7 też miałem 64bit i wszystko działało idealnie. |
_________________ Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują. |
|
 | ID posta:
358390
|
|
|
 |
|
|
Artik


Wersja: Win Office 365
Pomógł: 3091 razy Posty: 10240
|
Wysłany: 14-12-2018, 22:56
|
|
|
Pierwsze co bym zrobił, to w procedurze x_wskaznik_wykonania wstawił przed wywołaniem procedury wskaznik_wykonania i naciskając F8 sprawdził czy i kiedy się Excel wywali. Jeżeli analiza wykonywania kodu nie przyniesie rezultatów...
Drugie co bym zrobił, to wywołał procedurę wskaznik_wykonania przez OnTime: Kod: | Sub x_wskaznik_wykonania(control As IRibbonControl)
Application.OnTime Now, "wskaznik_wykonania"
End Sub | Trzecie co bym zrobił... Nie wiem, może bym się napił.
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
358430
|
|
|
 |
|
|
Marti
ExcelSpec


Wersja: Win Office 2019
Pomógł: 98 razy Posty: 997
|
Wysłany: 18-12-2018, 10:20
|
|
|
Cytat: | Drugie co bym zrobił, to wywołał procedurę wskaznik_wykonania przez OnTime: |
Zadziałało, przynajmniej obecnie plik się nie wysypuje.
Możesz mi to wytłumaczyć, skąd ten pomysł na zastąpienie Call metodą OnTime? |
_________________ Najlepszym dowodem na to, że w kosmosie istnieje inteligencja, jest to, że się z nami nie kontaktują. |
|
 | ID posta:
358654
|
|
|
 |
|
|
Artik


Wersja: Win Office 365
Pomógł: 3091 razy Posty: 10240
|
Wysłany: 18-12-2018, 13:27
|
|
|
Marti napisał/a: | skąd ten pomysł na zastąpienie Call metodą OnTime? | Z doświadczenia życiowego.
W sumie nie wiem co jest przyczyną. Być może chodzi o to, że focus jest na klikanej kontrolce, a chcemy coś zrobić w skoroszycie. Kiedy występują podobne problemy, próbuję wywołać procedurę w osobnym wątku (OnTime). W znacznej większości przypadków pomaga.
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
358662
|
|
|
 |
|
|
|
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
|