< návrat zpět
MS Excel
Téma: tuplované spuštění procedury listbox_change
Zaslal/a 12martin3 20.3.2018 6:09
dobrý den, v příloze je soubor, který kolabuje na příkazu listbox1.multiselect = 2.
Dvojklikem na sloupec D se otevře formulář, vlevo je listbox2 s problémovým kódem listbox2_change. Volba jakéhokoliv řádku v listbox2 má zrušit všechny výběry v listbox1 a provést nový výběr. Tyto detaily fungují, pro přehlednost jsem je z procedury smazal, odváděly pozornost od problému.
Chyba nastane asi po padesátém spuštění procedury (moje registrované pokusy jsou vypsány úplně vpravo, v buňce M1 se automaticky načítají pokusy od otevření sešitu.
Z různých pokusů jsem vydedukoval, že prvním příznakem problému je dvojí spuštění listbox2_change bez zjevného pokynu. Někdy hned po otevření formuláře a označení řádku v listbox2 se tento ihned odznačí. Zjistil jsem, že proto proběhne procedura dvakrát a při druhém běhu se občas zastaví na uvedeném multiselect. Příkaz multiselect = 0 provede vždy bez problému. Tušíte, čím to může být způsobeno? Alzheimra nemám, ruka se mi netřese. Díky.
12martin3(20.3.2018 6:11)#039918 příloha zde. Dalším mým problémem je, že po zastavení procedury při hlášce Debug - End již nelze znovu spustit proceduru listu doubleclick. Vždy se otevře buňka s kurzorem, nikdy formulář.
Příloha: 39918_pokus6.zip (67kB, staženo 24x) citovat
elninoslov(20.3.2018 10:33)#039919 Po dlhom skúšaní všetkého možného, som nakoniec chvíľu googloval a narazil som na tento nevysvetliteľný problém u mnohých ďalších nešťastníkov.
1. Vynechajte (na Form to nemá vplyv, iba na list):
Application.EnableEvents = False / True
Application.ScreenUpdating = False / True
2. Vložte toto:
Private Sub ListBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
ListBox2.SetFocus
End Sub
Vyskúšajte, vysvetlenie nežiadajte.
PS: Prečo nepokračujete v pôvodnom vlákne?
citovat
anyman(20.3.2018 17:17)#039926 Ahoj, co se týká toho dvojitého spuštění Události, tak jak píše Elnino.
No a přepínání Multiselect se třeba můžeš vyhnout.
Dim NicNerob As Boolean
Private Sub ListBox1_Change()
If Not NicNerob Then
'Tvuj Kod
End If
End Sub
Private Sub ListBox2_Change()
'smaže původní výběr
NicNerob = True
With ListBox1
For i = .ListCount - 1 To 0 Step -1
If .Selected(i) Then .Selected(i) = False
Next i
.ListIndex = -1
End With
NicNerob = False
Call ListBox1_Change
End Subcitovat
anyman(20.3.2018 19:34)#039927 Ještě k dvojitému spuštění Události.
https://social.msdn.microsoft.com/Forums/en-US/c1d2ae25-8893-423d-a65f-ef345d9a941f/listbox-change-event-triggers-twice?forum=isvvba
Tady píšou, že lze řešit taky:
Co jsem zjistil, je, že mohu obnovit správné fungování otevřením formuláře v editačním okně.
Přesunout seznam ve formuláři, vrátit zpět, obnovit předchozí umístění a potom uložit a restartovat formulář.
Potom to fungovalo správně jediným kliknutím. Netuším, proč to fungovalo, protože se v kódu nezměnilo nic.
Zkusil jsem, fachčí.
citovat
12martin3(21.3.2018 10:49)#039930 ahojte, díky za odpovědi, zařídím se. V prvním vlákně jem skončil, protože jsem měl dojem, že již s ničím nepřijde, leželo to tam dlouho bez reakce. Vřelý dík všem a pěkný den.
citovat
12martin3(21.3.2018 17:14)#039933 ještě tedy obecná otázka - při nekorektním zastavení makra (např. při krokování nebo při zastavení chybou a volbě "End" - je možno obnovit chod maker spouštěných nějakou událostí? Zatím vždy musím zavřít sešit a znovu jej otevřít. Díky.
citovat
elninoslov(21.3.2018 17:59)#039934 Áno, reakcia na udalosti pokračuje aj naďalej, ak bude
Application.EnableEvents = True
Ak to potrebujete dať na False, tak to následne ošetrite pomocou
On Error Goto KONIEC
A potom pred End Sub
KONIEC:
Application.EnableEvents = Truecitovat