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

Gegevens uit tabel categoriseren

Status
Niet open voor verdere reacties.

jelle87

Gebruiker
Lid geworden
13 nov 2013
Berichten
278
Goedenmorgen,

We zijn bezig om een nieuwe website te vullen met bepaalde informatie uit een Excel feed bestand. Ik heb even een voorbeeld bestandje gemaakt die de situatie weergeeft, zie bijlage.

Het idee is dat we een overzicht willen hebben waarin we kunnen zien welke specificatie in welke categorie is gebruikt. Het probleem is echter dat niet alle specificaties hetzelfde zijn, bijvoorbeeld:
diameter objectief : 100
diameter objectief : 50

De zoekopdracht zou dus op een deel van de tekst moeten gebeuren.

Wat ik zou willen weten is bijvoorbeeld:
In welke categorieën staat de spec 'Diameter objectief'
In welke categorieën staat de spec 'Infrarood ingebouwd'
etc.

Het probleem is dat het echte bestand 35 kolommen met specificaties heeft en 12000 artikelen op eigen regels. En ze staan compleet door elkaar heen, in verschillende kolommen.

In het voorbeeld bestand zou ik dus als resultaat willen krijgen:
Diameter objectief:

  • Categorie 1
    Categorie 2
    Categorie 3
    Categorie 4
    Categorie 6
    Categorie 7
    Categorie 8
    Categorie 9
In dit voorbeeld wordt deze spec dus niet getoond in categorie 5, verder overal wel.

Infrarood ingebouwd:

  • Categorie 1
    Categorie 3
    Categorie 5
    Categorie 7
    Categorie 9

Kleur:

  • Categorie 1
    Categorie 7

Ik zat zelf al e.e.a. te proberen met een draaitabel, maar dat krijg ik niet voor elkaar omdat de specificaties in verschillende kolommen staan.

Ik hoop dat het voorbeeld zo een beetje duidelijk is. En misschien is het wel onmogelijk, maar mogelijk weet 1 van jullie wel een oplossing :)?
 

Bijlagen

Wellicht kun je de tabel beter omwerken naar een tabel op basis van specificaties.
Toegepast in het geplaatste bestand:

Code:
Sub M_snb()
  sn = Cells(1).CurrentRegion
   
  With CreateObject("scripting.dictionary")
    For j = 2 To UBound(sn)
      For jj = 5 To UBound(sn, 2)
        If sn(j, jj) <> "" Then .Item(sn(j, jj)) = .Item(sn(j, jj)) & "|" & Join(Array(sn(j, 1), sn(j, 2), sn(j, 3), sn(j, 4)), "_")
      Next
    Next
   
    ReDim sp(.Count, 1)
    For j = 0 To .Count - 1
      sp(j, 0) = .keys()(j)
      sp(j, 1) = .Items()(j)
    Next
 End With
   
 Cells(20, 1).Resize(UBound(sp), 2) = sp
End Sub
 
Laatst bewerkt:
Ja, dat zou best wel kunnen werken inderdaad!

Als ik jouw code toepas, dan krijg ik bijvoorbeeld dit als resultaat:
diameter objectief : 100 |26711_-1_Artikel A_Categorie 1|20398_100_Artikel C_Categorie 3|20455_1001_Artikel D_Categorie 4|29570_1014_Artikel F_Categorie 6|20466_1016_Artikel G_Categorie 7|20488_1019_Artikel I_Categorie 9

In principe heb ik alle codes die er voor staan niet nodig, ik zou al genoeg geholpen zijn met alleen 'Categorie'.

Ik ben nog niet zo bekend met VBA, maar met trial en error kom ik een heel eind denk ik. Het echte bestand gaat echter tot en met kolom AP en is 11.986 regels lang. Dus daarom zou het wellicht mooier zijn om op een nieuw tabblad de gegevens neer te zetten, maar hoe doe ik dat?

Bedankt zo ver in ieder geval!
 
Hoeveel categorieën heb je ?

Wil je een overzihct hebben van
categorieën met per categorie welke specificaties voorkomen
of een overzicht van
specificatie met per specificatie in welke categorieën die voorkomen

Inventarisatie per categorie:

Code:
Sub M_snb()
     sn = Cells(1).CurrentRegion
     
     With CreateObject("scripting.dictionary")
         For j = 2 To UBound(sn)
             For jj = 5 To UBound(sn, 2)
                 If sn(j, jj) <> "" Then .Item(sn(j, 4)) = .Item(sn(j, 4)) & "|" & sn(j, jj) 
      Next
        Next
   
        ReDim sp(.Count, 1)
        For j = 0 To .Count - 1
            sp(j, 0) = .keys()(j)
            sp(j, 1) = .Items()(j)
        Next
    End With
   
    Cells(20, 1).Resize(UBound(sp), 2) = sp
End Sub
 
Laatst bewerkt:
In totaal zijn er 160 categorieën.

Het liefst zou ik een overzicht hebben van:
Specificatie met per specificatie in welke categorieën die voorkomen
 
Dit doet dat:

Code:
Sub M_snb()
  sn = Cells(1).CurrentRegion
   
  With CreateObject("scripting.dictionary")
    For j = 2 To UBound(sn)
      For jj = 5 To UBound(sn, 2)
        If sn(j, jj) <> "" Then .Item(sn(j, jj)) = .Item(sn(j, jj)) & "|" & sn(j, 4)
      Next
    Next
   
    ReDim sp(.Count, 1)
    For j = 0 To .Count - 1
      sp(j, 0) = .keys()(j)
      sp(j, 1) = .Items()(j)
    Next
  End With
   
  Cells(20, 1).Resize(UBound(sp), 2) = sp
End Sub
 
We zijn er bijna volgens mij!

Laatste vraag, denk ik:
hoe zet ik de resultaten op een apart tabblad, in plaats van op regel 20?
 
Of met Power Query?

Dat lijkt ook heel goed werkbaar.

Ik krijg de gegevens wel omgezet en ook kan ik de editor van Power Query wel openen. Maar op welke manier stel je dan de resultaten in? Hij staat nu op deze 3:
Diameter objectief
Infrarood ingebouwd
kleur

maar waar kan ik daar meer toevoegen zeg maar?
 
Laatst bewerkt:
Op het tweede blad (dat er natuurlijk wel moet zijn)

Code:
Sub M_snb()
  sn = Cells(1).CurrentRegion
   
  With CreateObject("scripting.dictionary")
    For j = 2 To UBound(sn)
      For jj = 5 To UBound(sn, 2)
        If sn(j, jj) <> "" Then .Item(sn(j, jj)) = .Item(sn(j, jj)) & "|" & sn(j, 4)
      Next
    Next
   
    ReDim sp(.Count, 1)
    For j = 0 To .Count - 1
      sp(j, 0) = .keys()(j)
      sp(j, 1) = .Items()(j)
    Next
  End With
   
  sheets(2).Cells(1).Resize(UBound(sp), 2) = sp
End Sub
 
Laatst bewerkt:
Als je gebruik van een draaitabel wil maken kan deze bron handig zijn:
Code:
Sub M_snb()
   sn = Cells(1).CurrentRegion
   
   ReDim sp(UBound(sn) * UBound(sn, 2), 1)
   sp(0,0)="Categorie"
   sp(0,1)="Specificatie"

   For j = 2 To UBound(sn)
      For jj = 5 To UBound(sn, 2)
        If sn(j, jj) <> "" Then
           n = n + 1
           sp(n, 0) = sn(j, 4)
           sp(n, 1) = sn(j, jj)
        End If
      Next
    Next
   
   Sheets(2).Cells(1).Resize(n+1, 2) = sp
End Sub
 
toch nog eentje met geavanceerd filter: start zelf het geavanceerd filter. (als je het filter met een macrootje wil starten geef dat dan even aan.)
in de rode cellen staat het filter. daar moet je niets doen
de grijze cellen mag je invullen. je hoeft niet volledig te zijn "obj 100" geeft ook al resultaat.
door meerdere grijze cellen in te vullen wordt er verder gefilterd.
er wordt gefilterd in de toegevoegde kolom.

je geeft niet aan met welke excel je werkt, dus ik ben van 365 uit gegaan.
 

Bijlagen

Ideeën zijn altijd welkom, dus bedankt :)

We gebruiken Office2019, ik weet niet of dat wat verschil maakt? En als die filter met een macro gestart kan worden, is dat alleen maar makkelijker haha!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan