[ACCESS/VB] Dubbele items uit listbox verwijderen

Pagina: 1
Acties:
  • 120 views sinds 30-01-2008
  • Reageer

  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Ik heb een listbox op een form in accesss met allemaal namen erin staan.
Het gaat dan om achternaam, voornaam tussenvoegsel
bv

Meer, Piet van der
Dijkstra, Jan Jaap
Dijkstra, Jan Jaap
Meer, Piet van der

Nu wil ik alle dubbele items eruit verwijderen.
Ik kom niet verder dan het volgende stukje code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim strTemp As String
Dim i As Integer
    
Do While i <= Me.Keuzelijst20.ListCount
    If i = Me.Keuzelijst20.ListCount Then
        Exit Sub
    End If
        If strTemp = Me.Keuzelijst20.ItemData(i) Then
            Me.Keuzelijst20.RemoveItem (i)
        Else
            strTemp = Me.Keuzelijst20.ItemData(i)
            i = i + 1
        End If
    Loop


Echter nu krijg ik als er 2 namen onder elkaar staan het volgende:

Meer, Piet van der
Dijkstra, Jan Jaap, Jan Jaap

Dus hij haalt de achternaam weg en zet dan de voornaam achter de vorige.
Waar ga ik de fout in?

  • lier
  • Registratie: Januari 2004
  • Laatst online: 11:11

lier

MikroTik nerd

Hoe wordt je listbox gevuld ?
Kan je misschien iets meer code laten zien ?

Eerst het probleem, dan de oplossing


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
lier schreef op woensdag 26 juli 2006 @ 13:15:
Hoe wordt je listbox gevuld ?
Kan je misschien iets meer code laten zien ?
De listbox is van te voren al gevuld. Deze actie wordt aangeroepen door een knop, dus meer zit er niet achter, althans niet wat relevant is lijkt mij. Dit is dus de complete code achter de knop.

Voor de duidelijkheid, de listbox wordt gevuld dmv andere button met de volgende code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim x As Integer
Dim s As String
If Me.OMAfdLst.ListIndex = -1 Then
Else
    s = Me.OMAfdLst.Value
    Me.Keuzelijst20.RowSource = ""
        For x = 1 To Me.OMAfdLst.ListCount
           If Me.OMAfdLst.ItemData(x) = s Then
              Me.Keuzelijst20.AddItem Me.OMAfdLst.Column(10, x)
              Me.Keuzelijst20.AddItem Me.OMAfdLst.Column(11, x)
           Else
           End If
        Next
End If

[ Voor 42% gewijzigd door MaxEagle op 26-07-2006 13:36 ]


  • lier
  • Registratie: Januari 2004
  • Laatst online: 11:11

lier

MikroTik nerd

Ik neem aan dat je list die je daar gebruikt op enig moment (voorafgaand aan onderstaande code) gevuld wordt op basis van gegevens in de database ? Kan je misschien die code laten zien. En eventueel het bijbehorend SQL statement ?

Eerst het probleem, dan de oplossing


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 17:48
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Sub CommandButton1_Click()
Dim i As Integer

For i = 0 To ComboBox1.ListCount
  
  'Kijk of dit het laatste item is
  If i + 1 > ComboBox1.ListCount Then
    Exit For
  End If

  'Kijk of het item hetzelfde is als het volgende item
  If ComboBox1.List(i) = ComboBox1.List(i + 1) Then
    'Verwijderen
    ComboBox1.RemoveItem (i)
  End If
Next
End Sub

'Lijstje vullen
Private Sub UserForm_Initialize()
  ComboBox1.AddItem "Item 1"
  ComboBox1.AddItem "Item 1"
  ComboBox1.AddItem "Item 2"
  ComboBox1.AddItem "Item 2"
  ComboBox1.AddItem "Item 3"
  ComboBox1.AddItem "Item 3"
End Sub


Dit heb ik net in Excel gemaakt en dit werkt! Maak van een lijst met 6 items een lijst met 3 items.

[ Voor 61% gewijzigd door urk_forever op 26-07-2006 14:41 . Reden: ff wat getest ]

Hail to the king baby!


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
lier schreef op woensdag 26 juli 2006 @ 14:22:
Ik neem aan dat je list die je daar gebruikt op enig moment (voorafgaand aan onderstaande code) gevuld wordt op basis van gegevens in de database ? Kan je misschien die code laten zien. En eventueel het bijbehorend SQL statement ?
Onderstaande code wordt uitgevoerd bij het openen van het formulier. Dit werkt op zich perfect.
Heb je hier wat aan?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Dim Path As String
Dim x As Integer
Dim s, q1, q2, q3, q4 As String
Path = Application.CurrentProject.Path & "\"

s = ""
Me.ImportLst.RowSourceType = "Value List"
Me.ImportLst.RowSource = Join(Split(CreateObject("Scripting.FileSystemObject").GetFile((Path + "_qry-agenda-afd.txt")).OpenAsTextStream(1).ReadAll, vbCrLf), ";")

For x = 1 To Me.ImportLst.ListCount - 1
  If s = "" Then
    s = "(((tbl_casus.Id)=" + Me.ImportLst.ItemData(x)
  Else
    s = s + " or " + "(tbl_casus.Id)=" + Me.ImportLst.ItemData(x)
  End If
Next
q1 = "SELECT * "
q2 = "FROM tbl_casus "
q3 = "WHERE " + s + ") AND ((tbl_casus.[Dat terug])<>Date())) OR " + s + ") AND ((tbl_casus.[Dat terug])Is Null))"
q4 = "ORDER BY tbl_casus.[X-pol], tbl_casus.Achternaam, tbl_casus.Voornaam;"


Me.OMAfdLst.RowSource = q1 + q2 + q3 + q4
Me.OMAfdLst.Requery
urk_forever schreef op woensdag 26 juli 2006 @ 14:30:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim strTemp As String
Dim i As Integer
    
Do While i <= Me.Keuzelijst20.ListCount
  strTemp = Me.KeuzeLijst20.ItemData(i)
  
  'Kijk of het item hetzelfde is als het volgende item
  if strTemp = Me.KeuzeLijst20.ItemData(i + 1) then
    Me.Keuzelijst20.RemoveItem(i)
  end if

  i = i + 1
Loop


Zoietsch misschien (niet getest trouwens)
Net even getest en hij doet ongeveer precies hetzelfde als mijn eigen stukje code.
Hij zet alleen de voornaam nu nog eentje hoger achter de vorige...beetje vreemd dus.

ongeveer zoiets als dit:

Meer, Piet van der , Jan Jaap
Dijkstra, Jan Jaap
Meer, Piet van der

[ Voor 28% gewijzigd door MaxEagle op 26-07-2006 14:42 ]


  • lier
  • Registratie: Januari 2004
  • Laatst online: 11:11

lier

MikroTik nerd

Neem eens een DISTINCT of een GROUP BY op in je query. Hiermee kan je zorgen dat alleen unieke waarden in je listbox terecht komen.

Eerst het probleem, dan de oplossing


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
lier schreef op woensdag 26 juli 2006 @ 14:52:
Neem eens een DISTINCT of een GROUP BY op in je query. Hiermee kan je zorgen dat alleen unieke waarden in je listbox terecht komen.
Als ik het goed begrijp wil je de code die in de startpost heb gezet omzetten naar een stukje SQL om de waarden uit de 2 kolommen van de andere listbox te verplaatsen naar de listbox waar deze namen inkomen? Zal vast mogelijk zijn, kan het mij alleen ff niet bedenken hoe..

De listbox welke gevuld wordt tijdens het openen van het form moet in deze hoedanigheid blijven bestaan dus daar kan ik iig geen DISTINCT of GROUP BY op los laten.

[ Voor 15% gewijzigd door MaxEagle op 26-07-2006 14:58 ]


  • lier
  • Registratie: Januari 2004
  • Laatst online: 11:11

lier

MikroTik nerd

Ik ken Access (gelukkig niet meer) zo goed.
Weet je of er iets als een array of een list of iets dergelijks bestaat ?
Of kan je misschien een sort uitvoeren op je datasource, waarna je een
(recursieve) methode kan aanroepen om alle dubbelen eruit te halen ?

Overigens, je hele opzet is voor mij nog steeds onduidelijk...
Kan je misschien nog aangeven wat de applicatie (functioneel) doet ?

Eerst het probleem, dan de oplossing


  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
lier schreef op woensdag 26 juli 2006 @ 15:31:
Ik ken Access (gelukkig niet meer) zo goed.
Weet je of er iets als een array of een list of iets dergelijks bestaat ?
Of kan je misschien een sort uitvoeren op je datasource, waarna je een
(recursieve) methode kan aanroepen om alle dubbelen eruit te halen ?

Overigens, je hele opzet is voor mij nog steeds onduidelijk...
Kan je misschien nog aangeven wat de applicatie (functioneel) doet ?
Het gaat eigenlijk heel simpel om 1 listbox welke gevuld wordt uit een andere listbox.
Ik wil door middel van een button de listbox filteren van alle dubbele namen welke op dat moment in de listbox zitten. Thats all, echter om dat uit te voeren is wat lastig, voor mij dan.

  • MaxEagle
  • Registratie: Oktober 2001
  • Laatst online: 27-07 21:36
Kan het misschien komen omdat de waarden in de listbox er zo uitzien:

Achternaam, voornaam
Achternaam, voornaam

Dus dat access de komma tussen de namen als scheidingsteken ziet ofzo?

[Edit]
En inderdaad daar lag het dus aan.
Ipv listbox eerst de waarden naar een array geschreven en dan de dubbelen eruit halen met een dubbele for lus. Werkt perfect op deze manier.

[ Voor 34% gewijzigd door MaxEagle op 28-07-2006 11:35 ]

Pagina: 1