< návrat zpět

MS Excel


Téma: zrušit výběr listboxu rss

Zaslal/a 16.3.2018 15:19

Ahoj, mám listbox1 se seznamem vozidel a listbox2 s několika obvyklými kombinacemi vozidel. Kliknutím na soupravu v listbox2 se její vozidla vyberou v listbox1, zde mohu doplnit další vozidla. Klikem na button se seznam z listbox1 vypíše do buňky tabulky. Při každé změně výběru v listbox2 se výběr v listbox1 nejprve zruší a pak provede nový výběr podle listbox2. Funguje to na 90%. Problémy:
1. někdy se stane, že při prvním výběru po aktivaci formuláře se po dokončení kódu listbox2 výběr v listbox2 zruší a kód se spustí znovu (jako bych udělal dvě změny za sebou, ale nevím o tom)
2. pro zrušení výběru v listbox1 změním jeho multiselect na 0, listindex na -1 a znovu multiselect na 1. Jednou za asi 20 pokusů se provede změna multiselect na 0 ale nejde provést změnu zpět na 1. Run-time error Could not set the mustiselect property.
Mezi změnou multi na 0 a zpět se jen nastavuje listindex na -1.
Děkuji všem za tipy k řešení.
Děkuji všem za radu.

Zaslat odpověď >

#039892
avatar
toto je část kódu pro zrušení výběru v sousedním listboxu:

UserForm2.ListBox1.MultiSelect = 0 UserForm2.ListBox1.Value = ""
UserForm2.ListBox1.MultiSelect = 2

první dva řádky proběhnou, na třetím se program zastaví. Je to podle https://stackoverflow.com/questions/18654252/reset-listbox-selection-in-vbacitovat
#039897
elninoslov
Vložte prílohu. Buď sa zaregistrujte a budete môcť prikladať prílohy (XLSM zabalte do ZIP), alebo upnite prílohu niekde na úložisko. Ak tam máte citlivé dáta, tak ich zmažte alebo prepíšte. Nech nemusíme my vymýšľať zadanie, príklad, aj riešenie.citovat
#039899
avatar
Ať je navržený kód podle čehokoli, čiší z toho nepochopení těch nejzákladnějších věcí:

1. UserForm2 samozřejmě zná své objekty, je zbytečné mu vysvětlovat, že jsou jeho; proto
ListBox1.MultiSelect = 0
ListBox1.Value = ""
ListBox1.MultiSelect = 2

2. Stoosmnáckrát opakovat totéž je nesmysl; proto
With ListBox1
.MultiSelect = 0
.Value = ""
.MultiSelect = 2
End With

3. Pracovat s pomalými stringy (navíc u property Value, která přijímá a vrací ještě mnohem pomalejší typ Variant), když můžu pracovat s bleskově rychlými celými čísly, je typické pro nejzačátečnější začátečníky, kteří ještě vůbec nerozumějí tomu, co píšou; proto
With ListBox1
.MultiSelect = 0
.ListIndex = -1
.MultiSelect = 2
End Withcitovat
#039900
avatar
v příloze je torzo souboru, které vykazuje stejnou chybu. Formulář otevřete dvojklikem na sloupec D, vlevo je listbox2 s výběrem souprav, vpravo je listbox1 s jednotlivými vozy. Po kliknutí na levý listbox proběhne procedura jednou správně a vzápětí dojde k chybě - sám se odznačí řádek v levém listboxu a vymaže výběr v pravém. Tato chyba se stane cca v jednom z pěti pokusů. Druhá výše zmíněná chyba se stane cca po dvaceti opakováních výběru.
Honzovi dík za připomínky, jeho diagnoza je správná, nicméně uvedené zjednodušené zápisy (které se postupně učím) problém neřeší. Vyzkoušel jsem též již dříve.
Příloha: zip39900_pokus2.zip (91kB, staženo 22x)
citovat
#039901
avatar
náhodnými pokusy jsem "omezil" chybu (omezil tak, že se zatím při asi 30 opakováních neobjevila), když jsem smazal sub commandbutton3 v tomto formuláři. Nenašel jsem ale nikde ve smazaném kódu odkaz na listbox2, takže nechápu souvislost. Stejným způsobem chyba zatím zmizela, když jsem v sub befordoubleclick, která volá problémový form2, zrušil nastavení cancel = true. Pro mně je sice nežádoucí otevření buňky po dvojkliku, ale aspoň přitom nedělá chybu listbox2. Souvislost opět nechápu.citovat
#039902
elninoslov
Je to poriadna pakáren, ten kód :)
Bolo by ho treba prekopať asi celý, okrem toho čo písal Honza53, treba sa pozrieť na používanie Split(), a polí celkovo, znížil by sa počet cyklov, lebo horizontálne pole sa dá spojiť naraz cez Join().
Ale najväčší problém si tam robíte v tom, že predpokladáte rovnako ako v liste, nevykonanie udalosti keď zadáte
Application.EnableEvents = False
Chyba! Toto vo formulári nefunguje. Na to si musíte deklarovať nejaký globálny príznak formulára typu Boolean, ktorý si obhospodárite sami. Teda si vždy pri vyvolaní zmeny prvku najskôr skontrolujte tento príznak, a konajte na základe toho.

Nechce sa mi to terazky celé študovať, prekopávať, keď štúdiom kódu sa nedá vždy presne vydedukovať čo by dotyčný chcel dosiahnuť. Na to by bol potrebný mimo iného príklad konkrétneho správania pri konkrétnych akciách užívateľa a konkrétnych hodnotách vstupov a výstupov. Plus lepší, pochopiteľnejší popis (pochopiteľnejší pre nás, lebo mi vieme, že Vy viete čo chcete, ale my do Vašej hlavy nevidíme, takže pre nás je treba vysvetľovať to inak. Proste ako pre niekoho, kto netuší čo u Vás znamená súprava, prečo sa musí kopírovať kombinácia napr "Ce(Pra)" šesť krát a pod...).citovat
#039903
avatar
díky moc za reakci, mezitím jsem celý kód přepsal, protože vznikal samozřejmě cestou pokus - omyl. Přepsáním se mi podařilo také celkově jej zjednodušit a chyba se už neobjevuje. Díky i za nové poznatky o poli, mrknu na to. U tohoto programu mám trochu problém, že někteří kolegové mají ještě excel 2005 a ne všechny příkazy VBA jim fungují, ale to se týkalo hlavně filtrů a datumů. Bez všemožných diskuzí zde, na lašákovi i některých cizích, bych byl v kýblu. Mějte se a přeju žádné "run-time error"citovat
#039904
avatar
jak říkají u nás v dílně: "Závada odstraněna, příčina nezjištěna."citovat
#039909
avatar
ahoj, tak se výše popsaná chyba objevuje znovu, bez zásahu do kódu. Klikem na levý listbox se vyberou jednotlivé položky v pravém listboxu. Funguje to třeba celý den a pak se chyba projeví nejprve tím, že se po kliknutí vlevo vyberou položky vpravo, ale hned zmizí a můj vybraný řádek se odznačí. Zjistil jsem, že po prvním správném běhu makra listbox2.change (až po end sub) se totéž makro spustí znovu. Dělá to i na jiném počítači. Máte tipy na možný důvod druhého běhu? Alzheimra nemám, ruka se mi na myši netřepe, Ani když úmyslně kliknu dvakrát či třikrát na stejný řádek, neznamená to dvojí spuštění vždy. Právě při druhém běhu se stane i chyba s multiselect.citovat

Uživatelské menu

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

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

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

Aktivní diskuse

odpocet a storno tl.

PavDD • 28.3. 8:53

odpocet a storno tl.

Začátečník • 26.3. 14:39

odpocet a storno tl.

PavDD • 26.3. 10:22

odpocet a storno tl.

elninoslov • 26.3. 7:50

odpocet a storno tl.

PavDD • 26.3. 7:26

odpocet a storno tl.

elninoslov • 25.3. 22:34

odpocet a storno tl.

Začátečník • 25.3. 15:09