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
ID tematu: 70584 Skopiuj do schowka 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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
sanctus 
Stały bywalec Excelforum


Pomógł: 37 razy
Posty: 307
Wysłany: 06-04-2021, 13:01   

Interactive nie pomaga.
ID posta: 403243 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie 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