< návrat zpět

MS Excel


Téma: tuplované spuštění procedury listbox_change rss

Zaslal/a 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.

Zaslat odpověď >

#039918
avatar
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: zip39918_pokus6.zip (67kB, staženo 24x)
citovat
#039919
elninoslov
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
#039926
avatar
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 Sub
citovat
#039927
avatar
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
#039930
avatar
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
#039933
avatar
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
#039934
elninoslov
Á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 = True
citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje