Ga naar inhoud

[VBA] Sorteren


anoniem

Aanbevolen berichten

Als beginnerling ben ik bezig met het maken van een sorteer functie met VBA in Word. Het is de bedoeling dat er een aantal tekstbestanden worden gelezen. Deze bevatten altijd 2 regels. Nu wil ik graag dat o.b.v. de eerste regel er nieuwe textbestanden worden weggeschreven waarbij de volgorde van wegschrijven afhangt van de eerste regel van elk bestand. Dit moet namelijk alfabetisch gebeuren. Stel ik heb: testbestand0001.txt, met op regel1: "Bedankt" en op regel2: "100" testbestand0002.txt, met op regel1: "Alvast" en op regel2: "50" Nu wil ik de bestanden weer wegschrijven waarbij alfabetisch gesorteerd wordt op de eerste regel van elk bestand, dus nu zou het resultaat moeten zijn: testbestand0001.txt, met op regel1: "Alvast" en op regel2: "50" testbestand0002.txt, met op regel1: "Bedankt" en op regel2: "100" Het lezen van tekstbestanden lukt uiteraard wel. Ik weet alleen niet hoe ik het voorelkaar krijg om daarna te sorteren. Al veel gezocht maar helaas het juiste antwoord nog niet gevonden. Is er iemand die me op weg kan helpen??
Link naar reactie
Het komt dus ruwweg neer op het hernoemen van de bestanden. Een ideetje hoe je het zou kunnen aanpakken: Bouw een array op met daarin de waarden van "regel1" en "regel2" Sorteer vervolgens deze array op "Regel1" Maak nieuwe bestanden aan voor elke rij in het array in een andere map bijvoorbeeld. (evt. verwijder je de oorspronkelijke bestanden daarna) Suc6,
Link naar reactie
Ik ga eerst zoeken naar het aantal testbestanden, dit kan namelijk verschillen. Daarna ga ik ze inlezen. Maar dan? Hoe kan ik dan sorteren? [code:1:6a21bb9fd3]Sub alfabet() Dim Regel1(100000) As String Dim Regel2(100000) As String Dim tmp As String Dim i As Integer Dim b As Integer bestanden = "C:\Mijn Documenten\" With Application.FileSearch .NewSearch .LookIn = bestanden .SearchSubFolders = False .FileName = "testbestand" .MatchAllWordForms = True .FileType = msoFileTypeAllFiles If .Execute() > 0 Then aantal = .FoundFiles.Count i = 1 For b = 1 To aantal Open .FoundFiles(b) For Input As #1 Line Input #1, tmp Line Input #1, tmp2 Regel1(i) = tmp Regel2(i) = tmp2 i = i + 1 Close #1 Next b[/code:1:6a21bb9fd3] Of ben ik zo verkeerd bezig.
Link naar reactie
  • 2 weken later...
Ik ken VBA niet. Je bent volgens mij op de goede weg. Dimensioneer eerst een twee dimensionele array FoundF(b,2) For b = 1 To aantal Open .FoundFiles(b) For Input As #1 Line Input #1, tmp Line Input #1, tmp2 FoundF(b,1) = tmp FoundF(b,2) = tmp2 Close #1 Next b Ik hoop dat VBA een standaard sorteer commando kent (ook voor 2 dimensionele array's natuurlijk) SORT FoundF(),2,1 of iets dergelijks. Het bovenstaande betekent dat op het tweede element opvolgend gesorteerd moet worden. Is dit wat? Of maak ik het van kwaad tot erger? Suc6 Abcott
Link naar reactie
Poe, ben wel benieuwd naar het doel van de applicatie ;) Maargoed alle bestanden tegelijk openen is niet goed voor je resources he? ;) als je veel bestanden hebt wordt dit een hell :lol: Maargoed, een simpel sorteeralgoritme kan als volgt werken: Open een bestand. Vergelijk het eerste karakters van het bestand met de het eerste karakter van een volgend bestand (kan met de < of > operator op karakters) Zet ze daarna in de goede volgorde in de array, als het tweede bestand > is dan het eerste bestand, zet je hem achteraan de array. Open daarna een volgend bestand en vergelijk het eerste karakter met het laatse huidige element uit de array. Is die ook groter, zet hem dan achteraan de array. Is hij kleiner, dan wandel je net zo lang van het EIND naar het BEGIN van de array, totdat er een keer een > uitkomt. Dan zet je hem op die positie, net zolang totdat er geen bestanden meer zijn. De clue is dus om een groter dan vergelijking te maken en die dan op de huidige-positie vergelijking neer te zetten. Zo voorkom je dat je op een slordige manier al die files gaat openen en gaat zitten prutsen ;) Dit is echt een allersimpelst voorbeeld, er zijn een heleboel algoritmen in omloop voor dit soort problemen. Suc6 :)
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...