ID tematu: 70584
 |
Blokada myszki |
Autor |
Wiadomość |
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 06-04-2021, 11:36 Blokada myszki
|
|
|
Witam
Chciałbym zablokować ruch myszy w trakcie wykonywania procedury. W jaki sposób można to zrobić? |
|
 | ID posta:
403231
|
|
|
 |
|
|
|
Artik


Wersja: Win Office 365
Pomógł: 3138 razy Posty: 10389
|
Wysłany: 06-04-2021, 12:00
|
|
|
Możesz nieco szerzej opisać kontekst zadania? W czym przeszkadza ruch myszy w trakcie działania procedury?
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
403234
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 06-04-2021, 12:19
|
|
|
Problem jest z wykonywaniem procedury podczas, gdy kursor myszy jest nad wykresem.
Pod boczny guzik myszy podpięta jest procedura zmiany danych na wykresie. Trwa ok 13ms. Jeśli w trakcie wykonywania procedury będę poruszał myszą, wykres nie odświeża się, mimo zakończenia działania makra. Odświeży się dopiero po zatrzymaniu myszy.
Jeśli kursor myszy jest nad komórką wszystko działa poprawnie.
Dla wykresu nie ma zdarzenia mousemove. Application.screenupdating=true nie działa. Activechart.refresh nie działa. |
|
 | ID posta:
403237
|
|
|
 |
|
|
Artik


Wersja: Win Office 365
Pomógł: 3138 razy Posty: 10389
|
Wysłany: 06-04-2021, 12:21
|
|
|
Da się te słowa poprzeć jakimś testowym załącznikiem?
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
403238
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 06-04-2021, 12:39
|
|
|
Z załącznikiem będzie problem, projekt jest zbyt rozbudowany. Wygląda to na kolejny błąd Excela. |
|
 | ID posta:
403241
|
|
|
 |
|
|
Tajan

Pomógł: 4767 razy Posty: 10469
|
Wysłany: 06-04-2021, 12:54
|
|
|
Spróbuj na początku makra wstawić:
Kod: | Application.Interactive = False | a na końcu: Kod: | Application.Interactive = True | Nie wiem czy pomoże bo objawy są nietypowe ale spróbować można. |
|
 | ID posta:
403242
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 06-04-2021, 13:01
|
|
|
Interactive nie pomaga. |
|
 | ID posta:
403243
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 06-04-2021, 14:20
|
|
|
Zlokalizowałem co powoduje ten problem.
1. W każdym przypadku, gdy włączone jest ProtectSelection = True
2. W każdym przypadku, gdy w procedurze jest .activate wykresu
2. W każdym przypadku, gdy na wykresie mam serie wypełnione tablicą Double i Variant.
Jeśli ProtectSelection = False i nie ma aktywacji wykresu oraz wszystkie dane na wykresie są typu Double, problem z odświeżaniem podczas poruszania myszy znika.
W tablicy variant mam tylko dane typu double lub puste, wiec to dość dziwne zachowanie excela. |
|
 | ID posta:
403244
|
|
|
 |
|
|
Marecki
Excel Expert


Wersja: Win Office 2019
Pomógł: 2530 razy Posty: 8431
|
Wysłany: 07-04-2021, 15:49
|
|
|
Moim zdaniem źle jest napisana procedura.
W większości przypadków można się pozbyć metod Selection, czy też Activate.
Niestety bez konkretnego przykładu nie da się tego poprawić. |
_________________ Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.
Szkolenia z Excela , FB
Office 2019 Professional Plus , Windows 10 x64
Pozdrawiam, były mkkk23 teraz Marecki. |
|
 | ID posta:
403281
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 07-04-2021, 18:33
|
|
|
Marecki napisał/a: | Moim zdaniem źle jest napisana procedura.
W większości przypadków można się pozbyć metod Selection, czy też Activate.
Niestety bez konkretnego przykładu nie da się tego poprawić. |
Procedura jest zoptymalizowana pod kątem szybkości wykonywania. Dodanie nowego pustego wykresu powoduje mignięcie ekranu. Jeśli użyje się Activate, mignięcia nie ma. Wszystko działa płynnie kosztem ok 2ms. Jest to jedyna mi znana metoda na tą przypadłość.
Kodu nie podaje, bo jest go dość dużo. Są odwołania do klas, plików tekstowych i funkcji, dlatego może być mało czytelny. Na moje oko wszystko jest ok. Na wykresie są serie wykresu liniowego i punktowego ze słupkami błędów będącymi osiami pionowymi, z etykietami danych na osiach poziomych i pionowych. Nie ma żadnych połączeń do zakresów. Tablice dla słupków błędu są zadeklarowane jako variant, gdybym zmienił na double, wówczas w miejscu pustych rekordów będą zera i pojawią się niepotrzebne słupki błędów, wiec tego błędu Excela raczej nie wyeliminuje. |
|
 | ID posta:
403285
|
|
|
 |
|
|
Maciej Gonet
Excel Expert

Wersja: Win Office 2016
Pomógł: 2118 razy Posty: 6628

|
Wysłany: 07-04-2021, 20:06
|
|
|
Trudno jest cokolwiek radzić nie widząc kodu i nie mając możliwości sprawdzenia.
Jeszcze pomyślałem o funkcji ukrywającej kursor myszy (na obszarze okna Excela):
Kod: | Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long | Mysz działa normalnie, niewidoczny jest tylko jej kursor. Nie wiem czy to w czymkolwiek pomoże, ale można spróbować.
sanctus napisał/a: | Dla wykresu nie ma zdarzenia mousemove | To też nie do końca prawda, chociaż nie wiem jak chciałbyś to wykorzystać.
Przerabiałem kiedyś załącznik Mareckiego pod potrzeby innego zapytania. Tam jest pokazane jak można użyć zdarzenia myszy na wykresie osadzonym w arkuszu. Tam jest MouseDown, ale łatwo zmienić na MouseMove, tylko w tym przypadku jest to mniej wygodne. Wykres musi być zaznaczony i wtedy należy kliknąć Włącz. Kliknięcie myszką na wykresie zaznacza punkt.
wykres XY_Marecki2.xlsm
|
Pobierz Plik ściągnięto 5 raz(y) 25.63 KB |
Test_ShowMouse.xlsm
|
Pobierz Plik ściągnięto 4 raz(y) 16.9 KB |
|
|
|
 | ID posta:
403290
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 07-04-2021, 22:02
|
|
|
Ukrycie kursora oczywiście nie pomaga. Zdarzenia mam zdefiniowane do wykresów, ale mimo że wszystkie wyłączyłem problem pozostał. Nie pomaga nawet ukrycie wykresu na początku procedury.
Wszystko działa jak należy jeśli kursor myszy porusza się poza obszarem wykresu lub jeśli na wykres nałożę transparentny kształt. |
|
 | ID posta:
403293
|
|
|
 |
|
|
Artik


Wersja: Win Office 365
Pomógł: 3138 razy Posty: 10389
|
Wysłany: 11-04-2021, 10:50
|
|
|
Jako, że nie ma na czym testować, to jeszcze jeden strzał (mój ostatni) z zawiązanymi oczami.
Kod: | Option Explicit
Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Declare Function SetCursorPos Lib "user32" _
(ByVal x As Long, ByVal y As Long) As Long
Type POINTAPI
X_Pos As Long
Y_Pos As Long
End Type
Sub Test()
Dim i As Long
Dim a
Dim x As Long
Dim y As Long
Dim Hold As POINTAPI
'zapamiętaj pozycję kursora
GetCursorPos Hold
x = Hold.X_Pos
y = Hold.Y_Pos
'ustaw kursor w lewym górnym rogu ekranu
SetCursorPos 0, 0
'wykonaj swoją procedurę
For i = 1 To 10 ^ 7
a = (Sqr(i) + Sqr(i / 2)) ^ 2
Next i
'przywróć pierwotną pozycję kursora
SetCursorPos x, y
End Sub | Ponieważ Twoja procedura wykonuje się krótko prawie nie ma szans, by użytkownik w tym czasie (13 ms) przesunął kursor myszy nad wykres. Czas działania procedury specjalnie wydłużyłem, by dać Ci szansę na przesunięcie kursora w trakcie działania makra.
Artik |
_________________ Persistence is a virtue in the world of programming. |
|
 | ID posta:
403406
|
|
|
 |
|
|
apollo
ExcelSpec

Pomógł: 1317 razy Posty: 4544
|
Wysłany: 11-04-2021, 13:53
|
|
|
Jeśli kod wykonuje się bardzo długo lub użytkownik działa bardzo szybko to
Kod: |
Option Explicit
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
#If VBA7 Then
Private Declare PtrSafe Function ClipCursor Lib "user32" (lpRect As Any) As Long
#Else
Private Declare Function ClipCursor Lib "user32.dll" (lpRect As Any) As Long
#End If
Sub test()
Dim i As Long, a, rc As RECT
rc.Right = 1
rc.Bottom = 1
ClipCursor rc
For i = 1 To 2 * 10 ^ 7
a = (Sqr(i) + Sqr(i / 2)) ^ 2
Next i
ClipCursor ByVal 0
End Sub
|
Nie masz szansy na przesunięcie kursora w trakcie działania makra. |
|
 | ID posta:
403412
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Pomógł: 37 razy Posty: 307
|
Wysłany: 11-04-2021, 14:43
|
|
|
Artik testowałem wcześniej to rozwiązanie. Nie działa tak jak by się można tego spodziewać. Wysłanie kursora poza obszar wykresu rozwiązuje problem, jeśli kursor nie powraca w miejsce początkowe. Jeśli powrócimy kursorem w miejscu pierwotne, wówczas wykres nie odświeży się. To jest jakiś problem z plotarea. Gdy kursor najedzie poza ten obszar np na chartarea, tytuł wykresu, czy range od razu następuje oświeżenie danych. |
|
 | ID posta:
403413
|
|
|
 |
|
|
|