Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.  (gelezen 2070 keer)

0 leden en 1 gast bekijken dit topic.

Offline Streuby

  • Nieuw lid
  • Berichten: 4
  • Geslacht: Man
  • Hey, ik ben nieuw hier !
Beste,

Ik ben nieuw hier en heb al eens door de topics gezocht, maar ik vind niet direct een oplossing voor mijn probleem. Ik ben iemand die met "trial and error" m'n weg een beetje kan vinden in vba, maar ik ben zeker geen specialist.

Ik heb nu het volgende probleem: ik heb een lijst met "toestellen" in een excel sheet en bij die toestellen hoort een omschrijving. Op een UserForm heb ik een ComboBox en een Label geplaatst en de bedoeling is dat ik via de ComboBox de toestellen op de pagina "Toestellen" kan selecteren en dat ik ook de omschrijving van het toestel kan weergeven in het label. Liefst van al zou ik de omschrijving van al de toestellen in de lijst kunnen weergeven, maar als ik de omschrijving van de ingevoerde naam al kan weergeven, is dat goed. Het lukt me tot op één punt; als ik de ingevoerde data verander, dan verandert de omschrijving niet mee. Ik heb al een code gevonden waarmee ik de toestellen kan aanvullen in de ComboBox en zou dit ook graag behouden. (momenteel is de lijst vrij kort, maar de lijst met toestellen is heel lang en als je dan dor heel de lijst moet scrollen, verlies je onnodig tijd)

Mvg,  Streuby

Offline Warme bakkertje

  • Volledig lid
  • **
  • Berichten: 215
  • Geslacht: Man
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #1 Gepost op: 29 augustus 2022, 04:43:05 »
Kijk eens of je met deze verder kan.
Windows 10 Home   NLD 64bit

Microsoft Office Professional Plus 2016 US

Offline Streuby

  • Nieuw lid
  • Berichten: 4
  • Geslacht: Man
  • Hey, ik ben nieuw hier !
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #2 Gepost op: 30 augustus 2022, 01:27:16 »
Hoi Warme Bakker, m'n excuses dat ik zo laat reageer, maar toen ik eerder na het inloggen op "Toon nieuwe reacties..." klikte, kreeg ik geen melding dat er reacties waren. Waarschijnlijk heb ik iets fout gedaan, maar soit.

Ik heb uw oplossing bekeken en dat is zeker wat ik gevraagd heb. Ik heb echter - nadat ik mijn vraag gepost heb - nog wat verder geknutseld en ik kwam zelf ook al tot een oplossing. Uw oplossing geeft de omschrijving na het invoeren van het laatste karakter en mijn oplossing - en ik herhaal ik werk niet uit kennis maar uit "trial and error" - gaf al na het invoeren van het 2 of 3e karakter een omschrijving.
Opgelost denk je dan. Nee, want in mijn versie kan ik niet via de "backspace" een karakter wissen. De ingevoerde karakters blijven geselecteerd en ik kan ze alleen maar wissen via de "delete" knop. Ik moet ook heel de tekst in de Combobox wissen om de omschrijving (inhoud label) te verwijderen. Een voordeel van mijn "trail and error" versie is dan weer dat de toestellen al weergegeven worden bij de invoer van enkel de cijfers. Dit is voor mij ook belangrijk want verschillende toestellen hebben dezelfde nummer en door enkel de cijfers in te voeren, kan ik een keuze in toestellen maken. Ik moet dus in de combinatie van de 2 oplossingen zoeken en nu ik toch mijn verlanglijstje aan plaatsen ben. Ideaal zou zijn dat ik de omschrijving mee in de lijst te zien krijg.
Dat kan, maar dan moet ik een extra tabel maken waarin ik de inhoud van de tabel "Toestellen" en de tabel "omschrijving" samenvoeg. Is er een andere oplossing om dit te doen?
Ik heb mijn 2 probeersels in de bijlage toegevoegd.

Offline Warme bakkertje

  • Volledig lid
  • **
  • Berichten: 215
  • Geslacht: Man
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #3 Gepost op: 30 augustus 2022, 05:44:34 »
Probeer dan eens met deze.
Windows 10 Home   NLD 64bit

Microsoft Office Professional Plus 2016 US

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #4 Gepost op: 30 augustus 2022, 11:41:38 »
Hallo Streuby,

Tenzij je per se wil vasthouden aan het combobox-idee kan je ook deze eens bekijken. Ik heb er onderaan meteen nog 2 textboxes aan toegevoegd die gevuld worden als je een item uit de lijst selecteert. Die heb je misschien nu nergens voor nodig maar kan handig zijn als je later misschien nog meer code wil toevoegen.
Van je lijst met gegevens heb ik maar liever een echte tabel gemaakt.

Mvg,
Molly
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline Streuby

  • Nieuw lid
  • Berichten: 4
  • Geslacht: Man
  • Hey, ik ben nieuw hier !
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #5 Gepost op: 30 augustus 2022, 14:49:13 »
Wauw, Warm bakkertje en MollyVH, dit is perfect wat ik zocht.  \o/ \o/ \o/

Het is nu wel duidelijk dat ik met "trial and error" soms wel het beoogde resultaat kan behalen, maar dat ik met kennis van zaken veel sneller-, veel verder- en met minder code mijn doel kan bereiken. Blijkbaar moet ik me - als ik het goed zie - meer gaan focussen op de kennis over- en het gebruik van array's.

Nogmaals bedankt voor de snelle- en goede oplossingen.

Mvg,

Streuby

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #6 Gepost op: 30 augustus 2022, 19:15:32 »
@Molly,

Als je jouw volledige code achter je userform vervangt door onderstaande heb je een betere zoekfunctie. Filtering werkt ook op kolom B in dit geval.
Ook kun je met de .column() property direct de juiste waarde oproepen in je textboxen.

Onder het mom van efficiënt schrijven ;)

Dim sq

Private Sub txt_zoek_Change()
 With lst_toestellen
   .List = sq
   For i = .ListCount - 1 To 0 Step -1
     If InStr(1, .List(i, 0) & "|" & .List(i, 1), txt_zoek.Text, 1) = 0 Then .RemoveItem i
   Next
 End With
End Sub

Private Sub lst_toestellen_Click()
  With lst_toestellen
    txt_toestel = .Column(0)
    txt_omschrijving = .Column(1)
  End With
End Sub

Private Sub UserForm_Initialize()
sq = Sheets("Toestellen").ListObjects(1).DataBodyRange.Value
lst_toestellen.List = sq
txt_zoek.SetFocus
End Sub

Offline Streuby

  • Nieuw lid
  • Berichten: 4
  • Geslacht: Man
  • Hey, ik ben nieuw hier !
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #7 Gepost op: 31 augustus 2022, 00:19:52 »
Hoi JEC, die optie had ik niet direct in gedachte, maar ze biedt ook zeker perspectieven.

Ik wil jullie nogmaals allemaal bedanken - Warme bakkertje, MollyVH en JEC - voor jullie inbreng. Jullie hebben mij goed geholpen. Ik heb weer een stukje in mijn puzzel gevonden en kan weer verder met mijn project(je). Ik hoop dat ik later, als ik weer voor een probleem sta, nog eens beroep op jullie kennis mag doen.

Met vriendelijke groeten,

Streuby

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #8 Gepost op: 31 augustus 2022, 09:43:28 »
@ JEC,

Aan het ontbreken van Databodyrange in mijn code heb je ongetwijfeld ook gemerkt dat ik het mezelf zo makkelijk mogelijk had gemaakt (stukje code gekopieerd dus uit een eerder project van en voor mezelf waarin ik niet alle kolommen uit een tabel in mijn listbox moest opnemen, en daarbij niet echt nagedacht).

Citaat
Als je jouw volledige code achter je userform vervangt door onderstaande heb je een betere zoekfunctie
Ben je daar wel zeker van?

Zoeken uitbreiden naar meerdere kolommen is ook eenvoudig te realiseren binnen mijn werkwijze: "If InStr(full_arr(i, 1), txt_zoek) Then" vervangen door "If InStr(full_arr(i, 1), txt_zoek) Or InStr(full_arr(i, 2), txt_zoek) Then" volstaat. Ik maak trouwens ook dikwijls gebruik van méérdere zoekvelden (op zoek naar een Annita Van den Berghe uit Oosterzele zijn dat er 3 - gdpr indachtig bestáát ze dus niet).

Dat het gewoon kán is uiteraard geen reden om hierop terug te komen (het is niet mijn gewoonte om absoluut gelijk te willen hebben). Wel belangrijk is: met je RemoveItem-methode heb je inderdaad maar één loop nodig, maar of dat volstaat om het efficiënter te noemen is nogal kort door de bocht. Hoewel ik van 2 loops gebruik maak gaat dat aanzienlijk sneller. Ik werk vaak met enorme gegevenstabellen en heb dat meermaals ervaren.
Ik heb deze ervaring natuurlijk ook op het huidige project losgelaten door de tabel wat langer te maken, en met amper  ;) 100.000 records gaat het met RemoveItem al enerverend traag. De mijne gaat dan ook niet aan lichtsnelheid, hoor, maar het verschil is meer dan de moeite.

No hard feelings, hoop ik? In elk geval niet van mijn kant! Misschien krijg je wel zin om zelf eens de vergelijking te maken?
En in een volgende stap samen zoeken of het nog sneller kan?

Mvg,
Molly
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline Warme bakkertje

  • Volledig lid
  • **
  • Berichten: 215
  • Geslacht: Man
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #9 Gepost op: 31 augustus 2022, 10:40:28 »
Het is algemeen geweten dat de RemoveItem methode vanaf 3K rijen begint te vertragen en hoe groter de data wordt hoe groter de vertraging

Als je dus op voorhand weet dat je data groter zal zijn dan 3K rijen gebruik je best een array.

@molly

Het enige dat ik zou wijzigen aan jouw code is de array 1-malig inladen bij het openen van het UF zodat je niet telkens bij elke zoekactie terug moet inlezen.
Option Compare Text
Dim full_arr As Variant

Private Sub UserForm_Initialize()
full_arr = Sheets("Toestellen").[tbl_toestellen[[toestellen]:[omschrijving]]].Value
With lst_toestellen
    .List = full_arr
    .ListIndex = -1
End With
txt_zoek.SetFocus

End Sub

Private Sub txt_zoek_Change()

If Len(txt_zoek) > 0 Then
    'full_arr = Sheets("Toestellen").[tbl_toestellen[[toestellen]:[omschrijving]]].Value
    For i = 1 To UBound(full_arr)
        If InStr(full_arr(i, 1), txt_zoek) Then
            aantal = aantal + 1
        End If
    Next i
    If aantal > 0 Then
        ReDim new_arr(aantal - 1, 3)
        t = 0
        For i = 1 To UBound(full_arr)
            If InStr(full_arr(i, 1), txt_zoek) Then
                new_arr(t, 0) = full_arr(i, 1)
                new_arr(t, 1) = full_arr(i, 2)
                t = t + 1
            End If
        Next i
        lst_toestellen.List = new_arr
    Else
        lst_toestellen.Clear
    End If
Else
    lst_toestellen.List = Sheets("Toestellen").[tbl_toestellen[[toestellen]:[omschrijving]]].Value
End If
lst_toestellen.ListIndex = -1
txt_toestel = ""
txt_omschrijving = ""

End Sub
Windows 10 Home   NLD 64bit

Microsoft Office Professional Plus 2016 US

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #10 Gepost op: 31 augustus 2022, 11:03:19 »
@ Warme bakkertje,
Mooie aanvulling  :thumbsup:
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #11 Gepost op: 31 augustus 2022, 13:41:31 »
Hi Molly,

Uiteraard geen hard feelings! :) Ik werk zelf ook met grote databases en merk inderdaad dat de ".Removeitem" manier traag wordt.
Maar het is niet altijd zo dat men met duizende regels werkt.

Zelf heb ik al eens gezocht naar de snelste manier om dit te doen. Ik kom op onderstaande oplossing(no looping), gebaseerd op jouw voorbeeldbestand.
Deze vertraagt niet. Bovendien doet het heel veel met weinig code.  ;D

Private Sub txt_zoek_Change()
lst_toestellen.List = Filter(Evaluate("transpose(Toestellen & ""  "" & Omschrijving)"), txt_zoek.Text, 1, 1)
End Sub

Private Sub lst_toestellen_Click()
  With lst_toestellen
    txt_toestel = Split(.Column(0))(0)
    txt_omschrijving = Split(Application.Trim(.Column(0)), " ", 2)(1)
  End With
End Sub

Private Sub UserForm_Initialize()
lst_toestellen.List = Sheets("Toestellen").ListObjects(1).DataBodyRange.Value
txt_zoek.SetFocus
End Sub

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: Item selecteren dmv ComboBox, maar ook omschrijving van item meegeven.
« Reactie #12 Gepost op: 31 augustus 2022, 14:02:55 »
Hallo JEC,

We zullen het nog helemaal eens raken...  :D
De Filter-methode heb ik ook her en der in gebruik, maar beperkt tot gebruik op één veld.
Puike oplossing om ze met Evaluate aan te vullen  \o/
In mijn 100.000 records-bestand merk ik nog wat vertraging maar ze begint echt wel verwaarloosbaar (0,07 ipv 0,92 sec.) te worden  :thumbsup:
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

 


www.combell.com