• 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.

2d array opmaken en sorteren

Status
Niet open voor verdere reacties.

vaneijk

Gebruiker
Lid geworden
31 mrt 2017
Berichten
152
Geachte helpers van het forum,

Momenteel heb ik in een range (ListBox1.Column(20, i)) meerdere lokaties op een drive staan, als voorbeeld:

in range staat: c:\Temp\Voorbeeld\Nummer1 | C:\Temp\Voorbeeld\Overzicht | C:|Temp\Voorbeeld\Documenten

Nu wil ik hier een 2d array van maken, gesorteerd op alfabetische volgorde, maar daar loop ik mee vast. Ik heb ondertussen (een beetje) geleerd hoe ik een unieke 1d array kan laten opmaken en sorteren en hoe ik een 2d array kan opmaken maar die kan ik niet sorteren.
Welke beste helper kan mij vertellen waar ik niet uikom?

Het uitgangspunt is dus
myArray(aantal, 0) = naam laatste map "nummer1, Overzicht, Documenten"
myArray(aantal, 1) = Volledige locatie op hd-drive
en dan dit alles gesorteerd op naam van de laatste map

Voor de 1d array en sorteren gebruik ik als voorbeeld:
Code:
Sub Array1()
i = ListBox1.ListIndex
With CreateObject("System.Collections.ArrayList")
c02 = Split(ListBox1.Column(20, i), " | ")
For aantal = 0 To UBound(c02)
off_path_location = (Split(c02(aantal), "\")(UBound(Split(c02(aantal), "\"))))
If Trim(off_path_location) <> "" And Not .contains(off_path_location) Then
    .Add Trim(off_path_location)
''    .Add Trim(off_path_location), c02(aantal)  '' ( geprobeerd maar werkte niet zoals verwacht )
End If
Next
.Sort
TextBox16.List = .toarray()
End With
End Sub

Voor een 2d array (waarvan ik niet weet hoe ik deze moet sorteren) gebruik ik als voorbeeld
Code:
Sub Array2()
i = ListBox1.ListIndex
c02 = Split(ListBox1.Column(20, i), " | ")
ReDim myArray(UBound(c02), 1)
For aantal = 0 To UBound(c02)
off_path_location = (Split(c02(aantal), "\")(UBound(Split(c02(aantal), "\"))))
    myArray(aantal, 0) = Trim(off_path_location)
    myArray(aantal, 1) = c02(aantal)
Next
TextBox16.List = myArray
End Sub
 
Laatst bewerkt door een moderator:
met een voorbeeldje zou het natuurlijk gemakkelijker zijn, maar ik geef je alvast een voorzet.
Ik gok dat een entry voor die collection.arraylist maximaal 255 karakters lang mag zijn en nu weet ik niet precies hoeveel sleutels je wil gebruiken.
Veronderstel 4 sleutels, dan mag je alvast 60 karakters per sleutel reserveren.
dus iedere entry maak je dan uit die 4 sleutels, waarbij je de 60 linkse karakters neemt van die entry & space(60), eventueel met een separator ("") om straks gemakkelijk te splitsen.
Dan ben je er met 1 sort vanaf.

Moeilijke uitleg voor iets dat eigenlijk vrij simpel is.
 
@cow18
Dank voor de uitleg, maar ik kan dus beter alles laten wegschrijven naar een sheet, dan sorteren en opnieuw inladen?
 
Met een simpele DOS opdracht kun je sorteren op naam, grootte, datum

Code:
Sub M_snb()
   sn=split(createobejct("wscript.shell").exec("cmd /c dir C:\*.* /b /od /s").stdout.readall,vbcrlf)
End Sub

sn is de gesorteerde 1-dimensionale Array met alle bestanden in de subfolder van C:\
 
Laatst bewerkt:
Beste snb,
Dank voor uw reactie, ik heb ook enige tijd op uw site zitten zoeken voor een oplossing hiervan, echter kan ik daar niet vinden wat ik zoek. Wel vraag ik me af waar ik eventueel nog meer zou kunnen zoeken voor een goede oplossing en/of meer basisinformatie van de know-how van het vba script zoals cow18 bij #2 aangeeft. Uiteraard kan ik via een omweg (voor een leek zoals ik) zoals bij #3 de data eerst naar een sheet laten wegschrijven en dan opnieuw inladen.
 
snb's reactie een beetje aangepast
Code:
Sub M_snb()
   sn0 = Array("c:\Temp\Voorbeeld\Nummer1", "C:\Temp\Voorbeeld\Overzicht", "C:|Temp\Voorbeeld\Documenten", "C:\Forum\MijnDir", "C:\data\Mijnfotos") ' dit zou normaal het resultaat moeten zijn van je gesorteerde listbox1
   With Sheets(1)
        .Columns(1).ClearContents 'A-kolom leegmaken
     For Each it In sn0 'al je subdirectories aflopen
        sn = Split(CreateObject("wscript.shell").exec("cmd /c dir " & it & "\*.* /b /od /s").stdout.readall, vbCrLf) ' snb's DOS-commando
        If UBound(sn) > -1 Then 'er staat iets in die subdirectory
            With .Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(UBound(sn) + 1) 'onderaan in kolom A
                .Value = Application.Transpose(sn) 'waarden plakken
                .Sort .Range("A1"), Header:=False 'sorteren
            End With
        End If
     Next
   End With
End Sub
 
@cow18

Sorteren in Excel is overbodig als je dat eerst al in DOS hebt gedaan.
Mijn DOS opdracht sorteert oplopend op datum.
Daarna ga jij sorteren op naam.
Dan kun je beter in de DOS-opdracht al sorteren op naam met /on

/o(rder)n(ame): /on oplopend sorteren op naam
/o(rder)-n(ame): /o-n aflopend sorteren op naam

/o(rder)d(ate): /od oplopend sorteren op datum
/o(rder)-d(ate): /o-d aflopend sorteren op datum
 
Laatst bewerkt:
@snb,
ik was eigenlijk te lui om in de help van "dir" te gaan kijken wat die afkortingen wilden zeggen.
Parate kennis van 20 jaar terug, met die sort was ik er in 1 keer van af.

Jouw benadering zal beter zijn, want met mijn sort zal ik vermoedelijk fouten maken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan