• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Listbox vullen

Status
Niet open voor verdere reacties.

koster1984

Gebruiker
Lid geworden
4 jul 2012
Berichten
337
Goedemiddag,

Ik probeer een listbox te vullen obv een loop die door een array loopt (omdat de cellen niet naast elkaar liggen). Hij loopt alleen telkens fout op de een na laatste kolom in de eerste regel.. en ik begrijp maar niet waarom.

Onderstaande heb ik geschreven en een voorbeeldbestandje heb ik toegevoegd. Zou iemand willen helpen?

Code:
Private Sub UserForm_Activate()
Dim i As Long, j As Long, k As Long, m As Long, it As Range
i = Cells(Rows.Count, 1).End(xlUp).Row
If i = 6 Then Exit Sub
For Each it In Range("A7:A" & i)
    kolommen = Array(0, 2, 4, 9, 10, 11, 15, 23, 26, 33, 36, 40)
    ListBox1.AddItem
    m = 0
    For j = LBound(kolommen) To UBound(kolommen)
        ListBox1.List(k, m) = it.Offset(, kolommen(j))
        m = m + 1
    Next j
    k = k + 1
Next
End Sub
 

Bijlagen

  • Listbox.xlsm
    22,9 KB · Weergaven: 32
Kijk eens hier: https://www.snb-vba.eu/VBA_Fill_combobox_listbox.html

Vermijd additem.
'Columnheads' in een listbox werkt niet correct.

Code:
Private Sub UserForm_Initialize()
  sn = Cells(7, 1).CurrentRegion.Resize(, 41)
    
  ListBox1.List = Application.Index(sn, [row(2:4)], Array(1, 3, 5, 10, 11, 12, 16, 24, 27, 34, 37, 41))
End Sub
 
Laatst bewerkt:
Ja ik zie al wat je bedoelt, die additem methode is gewoon niet geschikt.

Je code is echt harstikke mooi compact, ik zal hem nog eens goed bestuderen hoe het nou precies werkt. Maar dat stukje "row 2:4".. als ik die in het doelbestand gooi, pakt hij hele andere cellen, namelijk wat er in rij 2 t/m 4 staat. Dus ik snap niet wat dat in de code doet en hoe ik het moet aanpassen om het naar mijn hand te zetten. En hoe kan ik de kolommen soort van dynamisch aanpassen aan de grootte van de tekst? Want die beweegt niet uit zichzelf mee. En hoe kan ik headers instellen obv diezelfde array?
 
Laatst bewerkt:
Blijkbaar is je voorbeeldbestand niet representatief.
Begin daar eerst eens mee.
 
Mijn voorbeeldbestand is op een klein element na representatief volgens mij, maar meestal kan ik uit de reacties die ik krijg op mijn problemen wel goed genoeg zelf improviseren. jouw functies ken ik niet, application.index en currentregion.resize, noch kan ik er goeie info over vinden op internet.

Hoe dan ook, zie bijgewerkt bestand in de bijlage. stel dat er in de rijen 2 t/m 6 ook tekst staat, dan doet die 'currentregion' gek. En stel dat ik eronder een extra regel toevoeg met gegevens die de listbox ook moet oppakken, dan wordt dat niet meegenomen.
 

Bijlagen

  • Listbox1.xlsm
    23,5 KB · Weergaven: 30
Waarom gebruik je geen tabel? Waarom gebruik je geen kolomkoppen? Waarom laad je niet alle gegevens in jouw listbox en laat je alleen de kolommen zien die je wil laten zien? Is even 1 keer het formulier goed ontwerpen en je hebt maar 1 regel code nodig om de listbox te vullen.
 

Bijlagen

  • Listbox1.xlsm
    24,7 KB · Weergaven: 53
Hallo VenA,
Snap ik, in dat geval had ik het ook zonder vraag zelf kunnen afhandelen. Echter is dit een soort template wat wordt gebruikt om in een CSV te veranderen om boekingen in ons financieel systeem in te lezen. Dus ik kan óf een omweg maken door het eerst naar een andere sheet weg te schrijven, vanaf daar een listbox vullen en vanaf de listbox weer terugschrijven naar het template. Óf er is gewoon een goeie code waardoor ik dat in een keer kan.

Ik hoop uiteraard op dat laatste..
 
Dat kan veel eenvoudiger.
bv. via data van tekst de gegevens importeren volg de wizzard (je kan kolommen overslaan)
 
ik sta open voor andere suggesties hoor, maar weet niet waar je precies op doelt. Hoe doe je dat?
 
nee, het is een template waarmee ik een CSV maak, ik haal niks op uit een CSV. Echter voor ik de CSV maak wil ik een aantal bewerkingen doen, de listbox is een klein deel van het geheel.
 
Ik vind het een beetje warrig en half verhaal. Het voorbeeldbestand is niet representatief. Er moeten nog bewerkingen gedaan worden welke?

Als je gebruik maakt van een tabel (zie #6) kan je er eenvoudig een .csv van maken.

Code:
Sub VenA()
  Set lo = Sheets("Blad1").ListObjects(1)
  If lo.ListRows.Count Then
    With Workbooks.Add
      .Sheets(1).Cells(1).Resize(lo.ListRows.Count, 2) = Application.Index(lo.DataBodyRange, Evaluate("row(1:" & lo.ListRows.Count & ")"), Array(1, 4))
      .SaveAs "E:\temp\export_" & Format(Now, "yyyymmdd hhmmdd") & ".csv", 6
    End With
  End If
End Sub
 
Het is een half verhaal omdat ik slechts hulp bij een deel nodig heb, voor hetgeen ik de vraag stel is het wel degelijk een representatief voorbeeldbestand. Voor je beeldvorming: de opbouw van de CSV heeft 41 velden, deze CSV wordt gebruikt voor het aanmaken van stamgegevens in Exact. Welke van die 41 velden ik gebruik ligt aan wat ik nodig heb voor een specifiek record, soms zijn het er twee en maximaal zijn het die twaalf die ik in het voorbeeldbestand heb. Ik heb dus geen hulp nodig bij het maken van de CSV zelf, noch bij de rest van het proces.

Om mijn vraag te versimpelen, kan ik de velden zoals ze in het voorbeeldbestand staan naar een listbox halen en de lege velden in de listbox overslaan (zodat het in de listbox wel overzichtelijk wordt) waarbij het aantal regels vanaf regel 7 t/m een variabele regel is? Zo nee, dan bedankt voor het meedenken maar dan doe ik het via een omweg.

Het antwoord van snb was dus heel dicht in de buurt van wat wat ik zocht, alleen zorgt die 'currentregion' ervoor dat eventuele gevulde cellen boven de targetcel worden meegenomen terwijl dat niet de bedoeling is en zijn die rijen als constant ingevoerd. Maar sindsdien dwalen we af..
 
Laatst bewerkt:
Je hebt geen listbox nodig om een csv-bestand te maken.
Het is beter te formuleren wat je wil bereiken dan hoe je het wil bereiken.
Je VBA-kennis schiet veel te kort om het met je over het hoe te hebben.
 
Je hebt geen listbox nodig om een csv-bestand te maken.
Het is beter te formuleren wat je wil bereiken dan hoe je het wil bereiken.
Je VBA-kennis schiet veel te veel te kort om het met je over het hoe te hebben.
 
Ik ben het met je eens dat mijn kennis te kort schiet, máár.. ik leer wel snel.

Ik zeg ook niet dat ik een listbox nodig heb om een csv te maken, ik zeg dat ik er een wil hebben om de template op een overzichtelijke wijze te tonen vóór ik de csv aanmaak. Dus als je me een stukje code kan laten zien die ik variabel kan maken wat betreft het aantal rijen, waarbij ik ook de headers kan instellen én die de lege cellen weglaat heb ik daar al voldoende aan.
 
Dat valt wel mee. Je hebt mijn bijdrage in #2 nog steeds niet volledig gelezen/begrepen.
 
Je bepaalt de aaneengesloten cellen en vergroot dat bereik tot aan rij 41. vervolgens maak je een index van dat bereik en geef je middels de array aan welke kolommen je wilt meenemen, alleen staat je rij vast op 2 t/m 4. Dus nogmaals.. hoe maak je die variabel?
Ik ben gewend dat je dat zo noteert:
Code:
rows("2:4")
Op die manier kan ik met rows.count en end(xlup) de laatste cel bepalen en die 4 variabel maken.

Alleen kolomkoppen lees ik nu pas inderdaad.
 
We zijn er nog niet...
type 'resize' in de VBEditor, markeer die tekst, sla op F1 en lees die tekst eens grondig door.
Dan kom je tot een andere interpretatie van mijn code dan wat je in je laatste bericht schreef.
 
Hoe je het aantal rijen variabel kan maken staat in #12. Hier kan je ook vinden hoe resize werkt. Wat is er op tegen om een echte tabel te gebruiken?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan