Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
Przesunięty przez: Artik
27-09-2019, 00:14
Excel 2010 - Zaznaczanie wybranej pozycji na wstążce
Autor Wiadomość
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 988
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 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
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 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 988
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 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
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 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 988
Wysłany: 22-02-2018, 11:48   

Artik, wielkie dzięki za namiary :beer

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 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 988
Wysłany: 22-02-2018, 12:06   

No niestety :niee

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 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
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 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 988
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 :cool1

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 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
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 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 988
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 :angry )
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 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
Wysłany: 14-12-2018, 22:56   

Pierwsze co bym zrobił, to w procedurze x_wskaznik_wykonania wstawił
Kod:
Stop
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 Skopiuj do schowka
 
 
Marti 
ExcelSpec



Wersja: Win Office 2010
Pomógł: 98 razy
Posty: 988
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 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
Wysłany: 18-12-2018, 13:27   

Marti napisał/a:
skąd ten pomysł na zastąpienie Call metodą OnTime?
Z doświadczenia życiowego. :mrgreen:

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 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

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