Listbox verwijst naar een verkeerde rij

Status
Niet open voor verdere reacties.

tomme

Gebruiker
Lid geworden
25 nov 2011
Berichten
9
Hoi Forumleden,

Ik heb een listbox weten te maken die alleen de rij (die de titel van een document bevat) laat zien als er in een bepaalde kolom "Not Checked yet!" staat. De bedoeling is om de nog niet gecheckte documenten via de ListBox weer te geven en te kunnen voorzien van een persoonsnaam die het document gecheckt heeft.
Voor een verduidelijking: dit heb ik voor elkaar gekregen door een ALS functie in kolom C

Code:
=ALS(B2="Not Checked Yet!";A2;"")

Kolom B is een rij waarin een persoonsnaam of Not Checked Yet! Staat.
Kolom A bevat de titel van het document

Als je nu kolom C weergeeft in een Listbox krijg je ook de lege cellen er tussen. Je zou deze kunnen aanklikken en dan alsnog een naam opgeven die dan is kolom B terecht komt. (dit mag niet en wil ik daarom uitsluiten). Daar heb ik als volgt een manier voor gevonden:

Code:
    For Each cell In ws.Range("unchecked")  "Uncheckt is dus Kolom C
        If cell.Value <> "" Then
            lbdoclist.AddItem cell.Value
        End If
    Next cell

Hierdoor worden nu geen blanke cellen getoond in de listbox, alleen de documenten die nog gecheckt moeten worden. So far so good..
Alleen als ik nu zo'n "Not Checkt Yet!" document selecteer in de ListBox en die wil voorzien met een persoonsnaam die hem gecheckt heeft dan zet ie die naam niet in de juiste rij in sheet "Document list". Dat gebeurt met deze code:

Code:
    i = lbdoclist.ListIndex + 1 
    With ThisWorkbook.Sheets("Document list")
        .Rows.Cells(i + 1, 2).Value = Me.cbocheckedby.Value  "de namen haalt ie uit een combobox btw
    End With

Wat er fout gaat is dat de listbox telt hoeveel rijen hij heeft en doet alsof de eerste in de listBox ook de eerste in de "Document list" is. Dat hoeft niet zo te zijn want die kan al voorzien zijn van een persoonsnaam die hem reeds gecheckt heeft.
Hoe moet mijn code zijn om alleen de "not checkt yet!" documenten weer te geven. En die dan een juiste verwijzig maken naar de juiste rij in de sheet "Document List".?
Als iemand een manier weet, help mij asjeblieft uit de brand :confused: Zit er spreekwoordelijk al 2 dagen in :o Alvast bedankt!:)
 
Laatst bewerkt:
Extra

Kom er net achter dat de lege regels in de ListBox toch niet nogmaals kunt aanklikken en dan voorzien van een naam zoals in mijn bericht hier boven staat. Alsnog zou het mooi zijn als de witte regels niet te zien zijn in de ListBox.
 
Je geeft eigenlijk zelf het antwoord al. Je moet van elke rij ook de rij van het werkblad weten

Wat je kunt doen is het volgende:

Het instellen van de Eigenschap ColumnCount van je listbox veranderen in 2, om vervolgens het rijnummer en het documentnummer in dezelfde rij van de listbox op te slaan
Je kunt de rij met het documentnummer dan verbergen door de ColumnWidhts in te stellen op bijvoorbeeld 0 voor de rij met rijnummers. (zie voorbeeld)

Let wel op dat als het aantal kolommen in een listbox groter is dan 0, de eigenschap Listbox.Value de waarde teruggeeft van de BoundColumn van de geselecteerde rij. (BoundColumn is NIET zero based.)

Ik heb hieronder twee voorbeeldjes. waar bij ik constanten gebruik om mijn gebrekkige geheugen eraan te herinneren welke kolom welke data bevat.

Zet dit boven alle procedures in je userform code:
Code:
Const RIJ_NUMMER As Long = 0        'de listbox kolom met het rijnummer
Const DOCUMENT_NAAM As Long = 1     'de listbox kolom met de document naam


Instellen listbox:

Code:
    ' // Jouw code hier boven //
    
    Dim nextitem As Long                    'volgende listitem
    Dim cell As Excel.Range

    'dit kun je ook instellen in het venster eigenschappen..
    lbdoclist.ColumnCount = 2           'twee kolommen
    lbdoclist.ColumnWidths = "0;100"    'wat je wenst

    For Each cell In ws.Range("unchecked")
        
        If cell.Value <> vbNullString Then
            lbdoclist.AddItem
            lbdoclist.List(nextitem, RIJ_NUMMER) = cell.row
            lbdoclist.List(nextitem, DOCUMENT_NAAM) = cell.Value
            'volgende item:
            nextitem = nextitem + 1
        End If
    
    Next cell

    ' // Jouw code hier onder //

En het terugzetten van waarden in het werkblad:

Code:
    ' // Jouw code hier boven //
    
    Dim rij As Long     'rij opgeslagen in listbox
    rij = lbdoclist.List(lbdoclist.ListIndex, RIJ_NUMMER)
    ThisWorkbook.Sheets("Document list").Cells(rij, 2) = cboCheckedBy.Value
    
    ' // Jouw code hier onder //
 
Laatst bewerkt:
Opgelost!

Hoi Mark, Super, dit truucje had ik nodig, na wat gegoochel in vba staat ie er in! Heel erg bedankt:thumb:!!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan