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

Aangepast sorteren

Status
Niet open voor verdere reacties.

Frankell87

Gebruiker
Lid geworden
7 mei 2015
Berichten
141
Heren,

ik heb 2 probleempjes waar jullie waarschijnlijk wel raad mee weten.

Ik ben een bestand aan het maken waarin erg veel data komt te staan. Het tabel waar de data in komt te staan wil ik in een volgorde kunnen sorteren volgens een lijst die ik in een ander tabblad(gegevens) heb gemaakt. Nu loop ik echter tegen het probleem aan dat er maximaal 255 tekens mogen worden gebruikt..... (dit heb ik al gevonden in de sorteerfunctie).

Het 2e probleem is dat ik eventueel de lijst (uit gegevens) wil kunnen aanpassen en dat ik dan niet weer het 'aangepaste sorteren' moet aanpassen. Het moet dus eigenlijk een tabel verwijzing worden.

Hoop dat ik mijn probleem een beetje duidelijk heb omschreven.

Gr Frank
 
welkom hier Frank.
het is handig voor de helpers als je een voorbeeld bestand bijvoegt.
 
Met deze routine kun je tot 10000 items sorteren:

Code:
Sub tsh()
    Dim Br, Ref, Rn
    Dim strS As String
    Dim i As Long
    
    With CreateObject("System.Collections.Arraylist")
        Br = Sheets([COLOR="#FF0000"]"Blad2"[/COLOR]).ListObjects([COLOR="#FF0000"]"tabel2"[/COLOR]).DataBodyRange
        Ref = Sheets([COLOR="#FF0000"]"Gegevens"[/COLOR]).ListObjects([COLOR="#FF0000"]"tabel1"[/COLOR]).DataBodyRange.Columns(1)
        For i = 1 To UBound(Br)
            .Add Application.Match(Br(i, 1), Ref, 0) + i / 10000
        Next
        .Sort
        Rn = .ToArray
    End With
    For i = 0 To UBound(Rn)
        strS = strS & "|" & Round((Rn(i) - Round(Rn(i))) * 10000)
    Next
    Rn = Application.Transpose(Split(Mid(strS, 2), "|"))
    Sheets([COLOR="#FF0000"]"Blad2"[/COLOR]).ListObjects([COLOR="#FF0000"]"tabel2"[/COLOR]).DataBodyRange = Application.Index(Br, Rn, Array(1, 2, 3))
End Sub
 
Laatst bewerkt:
Bedankt! ik ga het even proberen, dit moet ik neem ik aan in een macro kopiëren.

Kun je me ook uitleggen hoe je dit erin hebt gezet, dat begrijp ik het namelijk misschien beter.....

Alvast bedankt!
 
Om de macro in te voegen moet je met ALT-F11 naar de IDE, een module invoegen en de programmatekst kopiëren. Is dat je vraag?
Bijgevoegd het voorbeeldbestand met de macro erin.
 

Bijlagen

Dit is me inderdaad gelukt! werkt geweldig dank je wel.

Maar met mijn vraag bedoel ik eigenlijk hoe je de macro zelf hebt gemaakt, hoe heb je die stappen erin gezet. ik ben nu aan het proberen hem in het bestand te zetten waar hij ook daadwerkelijk in moet komen maar loop tegen fouten aan...... krijg ze er nog niet uit. Als je me kan uitleggen hoe ik de macro moet opnemen kan het me misschien wel lukken en snap ik ook misschien beter wat je nodig hebt om die macro te maken.

Ben nog een beginneling op dat gebied en wil er graag meer over leren. Kan over dit specifieke onderwerp niks vinden op het internet, komt denk ik omdat het geen 'beginners' macro is.
 
Deze macro is niet met de recorder gemaakt.
Als je hem wilt aanpassen naar je eigen bestand moet je opletten dat de namen van de werkbladen en de tabellen overeenkomen. Ik heb ze hierboven even rood gemaakt.
Je kunt de routine verder laten zoals hij is, en vanuit de met de macrorecorder gegenereerde code aanroepen met
Code:
Call tsh
 
Dat ben ik inderdaad aan het proberen. Inmiddels al een keer of 3 gedaan. ik weet zeker dat ik de namen van de bladen en de tabellen goed heb. zodra ik de macro wil uitvoeren krijg ik telkens de volgende melding:
Fout 9 tijdens uitvoering:
Het subscript valt buiten het bereik.

Wanneer ik dan op 'Foutopsporing' klik is de regel in de macro Br = Sheets......... geel gekleurd.

EDIT: lijkt erop dat ik nog ergens een kolom nummer in moet vullen. Mijn gegevens staan in het originele bestand in gegevens kolom 8 en in het andere blad in kolom 3(als je kolommen en tabel telt en anders kolom 4)
 
Laatst bewerkt:
Plaats even de door jou aangepaste versie van de routine.
 
Laatst bewerkt:
Option Explicit

Sub Sorteren()
Dim Br, Ref, Rn
Dim strS As String
Dim i As Long

With CreateObject("System.Collections.Arraylist")
Br = Sheets("Martin1228").ListObjects("Machine_deel").DataBodyRange
Ref = Sheets("Gegevens").ListObjects("Martin1228").DataBodyRange.Columns(1)
For i = 1 To UBound(Br)
.Add Application.Match(Br(i, 1), Ref, 0) + i / 10000
Next
.Sort
Rn = .ToArray
End With
For i = 0 To UBound(Rn)
strS = strS & "|" & Round((Rn(i) - Round(Rn(i))) * 10000)
Next
Rn = Application.Transpose(Split(Mid(strS, 2), "|"))
Sheets("Martin1228").ListObjects("Machine_deel").DataBodyRange = Application.Index(Br, Rn, Array(1, 2, 3))
End Sub
 
De optie van VenA is misschien makkelijker.
Anders zou je het originele bestand moeten plaatsen zodat ik kan zien waar het misgaat.

EDIT @VenA volgens mij is dit al voldoende:
PHP:
=VERGELIJKEN(Tabel2[[#This Row];[Machine deel]];Machine;0)
 
Laatst bewerkt:
@Timshel,

Inderdaad is jouw formule voldoende alleen Engelse en Nederlandse onderdelen in een formule werkt niet bij mij.:confused:

In XL-2007 NL
Code:
=VERGELIJKEN(Tabel2[[#Deze rij];[Machine deel]];Machine;0)
werkt beter:d

Als ik het toepas in XL-2010 EN krijg ik deze
Code:
=MATCH([@[Machine deel]];Machine;0)
 
Top jongens hiermee is het gelukt! Kan helaas het bestand zelf niet invoegen, is voor mijn werk en bevat informatie die niet gedeeld mag worden!
Moet ik deze topic afsluiten?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan