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

Kolom-gegevens omzetten naar rij-gegevens met VBA

Status
Niet open voor verdere reacties.

anton44

Verenigingslid
Lid geworden
20 mei 2005
Berichten
1.597
In een werkblad met ca 10.000 rijen zijn 2 kolommen gevuld.
Kolom 1 bevat tekst en kolom 2 datumwaardes, bv

Kolom 1 Kolom 2
A 20080603
A 20080606
A 20080621
B 20080615
B 20080618
C
enz

Het aantal rijen van A wordt verschillend en wordt bepaald door het aantal datumgegevens behorend bij A
Dit geldt ook voor B enz. Het aantal A, B, C enz kan oplopen tot 2000.
De bedoeling is dat per A de datumgegevens getransponeerd moeten worden, vb.
Kolom 1 Kolom 2 Kolom 3 Kolom 4 enz
A 20080603 20080606 20080621
B 20080615 20080618

Wie helpt me uit de brand ?
Handmatig zou ik het zo doen:
1. Rijen sorteren kolom 1, kolom2
2. Subtotalen tonen
3. Per subtotaal de cellen in kolom 2 transponeren en de rijen waarvan getransponeerd, verwijderen. enz

Een voorbeeldbestand is bijgevoegd met inputgegevens en gewenst resultaat.
 

Bijlagen

  • Transponeren.xls
    21 KB · Weergaven: 117
Code:
Sub verplaats()
  sq=activesheet.cells(1,1).currentregion
  activesheet.cells(1,1).currentregion.clear
  c0=sq(1,1) & "|" & sq(1,2) & "|"
  for j=2 to ubound(sq)
     if sq(j,1)= left(c0,1) then 
       c0=c0 & sq(j,2) & "|"
     else
       c1=c1 & c0 & vbcr
       c0=sq(j,1) & "|" & sq(1,2) & "|"
     end if
  next
  sq=filter(split(c1 & c0,vbcr),"|")
  for j=0 to ubound(sq)
    activesheet.cells(j+1,1).resize(,ubound(split(sq(j),"|")))=split(sq(j),"|")
  next
End Sub
 
Laatst bewerkt:
Met dank voor zo'n snelle reactie. Ik heb de codes in een module gekopieerd en krijg op de 3e regel van onder
active.sheet.cells een foutmelding (compileerfout - syntaxfout)
 
Na het plaatsen van een 3e haakje-sluiten is de foutmelding verdwenen en kan ik de macro runnen, echter met als resultaat dat kolom 2 verdwijnt (leeg)

activesheet.cells(j+1,1).resize(,ubound(split(sq(j),"|"))=split(sq(j),"|")

activesheet.cells(j+1,1).resize(,ubound(split(sq(j),"|")))=split(sq(j),"|")
 
Vorige code aangepast.

Als je na het uitvoeren van de macro kolom B verwijdert, heb je niettemin het gewenste resultaat ?
Met de gewijzigde code is ook dat overbodig.
 
Alleen kolom 1 is nog gevuld met de oorspronkelijke gegevens. Alle andere kolommen zijn leeg.
 
In een werkblad met ca 10.000 rijen zijn 2 kolommen gevuld.
Kolom 1 bevat tekst en kolom 2 datumwaardes, bv

Kolom 1 Kolom 2
A 20080603
A 20080606
A 20080621
B 20080615
B 20080618
C
enz

Het aantal A, B, C enz kan oplopen tot 2000.
Wellicht lees ik het verkeerd maar je kunt in Excel 2003 maar 256 kolommen hebben en als ik het zo lees heb je er meer nodig.

Met vriendelijke groet,


Roncancio
 
Roncancio, bedankt voor het reageren.
Momenteel kom ik met het handmatig transponeren tot een breedte van 194 kolommen en blijft dus binnen de grenzen van Excel2003.
Het aantal inputregels is momenteel 6500. Na transponeren is het aantal rijen verminderd tot 158.
Dus
2 kolommen met 6500 regels is getransformeerd naar
158 rijen met 194 kolommen.
 
Ik hoop dat je mijn code hebt geknipt en geplakt en niet overgetypt.
Ik heb er nog een kleine wijziging in aangebracht.
De test verliep vlekkeloos.
 
Bedankt voor je hulp. Ik heb inderdaad de codes met kopiëren/plakken in een module geplaatst. Hij runt nu met je wijziging wel, kolom B wordt niet meer geledigd maar het gewenste resultaat blijft achterwege. Ik heb het bestand met daarin de macro hierbij gevoegd met de vraag deze te verifiëren (blad 2)
Gr. Ton
 
Laatst bewerkt:
Het helpt enorm als je het bestand in overenstemming brengt met de inhoud van je eerste vraag.
Zorg dat in cel A1 al het eerste gegeven staat.
Zoals blijkt uit de code wordt daar gestart met het lezen van gegevens.
Met samengevoegde cellen kan VBA niets.
 
Ik denk dat er een misverstand is. Bij mijn vraagstelling heb ik de inhoud van cellen in kolom 1 voorgesteld als A, B enz. Hiermee heb ik bedoeld dat de letter een getal, tekststring od. voorstelt. Mijn vraag behelst niet het splitsen van een samengestelde string in een cel, maar de inhoud als zodanig te behouden. Blad 1 ban mijn aanhangsel geeft in verkorte vorm aan wat ik bedoel. Excuses als het verkeerd begrepen is en hoop dat je deze aangevulde uitleg toch kunt helpen.
 
Verwijder de 1e rij uit jouw blad.
Draai de macro en zie.
 
SNB,
Uit je boodschap proef ik enthousiasme en dat het werkt. Als ik de rij met kolomnamen verwijder (dus niet leeg maak) en de macro run, worden alle cellen in kolom B gevuld met de waarde van cel B1.
Dit heb ik uitgevoerd zowel in Excel2003 als Excel2007.
 
Laatst bewerkt:
Inmiddels heb ik de proef gedaan op het eerder gestuurd modelbestand en daar functioneert je macro wonderwel.
Heb mijn bestand met 6500 rijen toegevoegd.
 

Bijlagen

  • Transponeren-2.rar
    61,3 KB · Weergaven: 83
Het is nu voor jou een koud kunstje om de macro zo aan te passen dat ie doet wat je wil.
Het is overigens wel onhandig, dat je niet meteen een correct voorbeeld van je bestand hebt getoond.
 
SNB, wat bedoel je met gemakkelijk bij te werken ? Was je bedoeling een al dan niet gewijzigd bestand mee te sturen ?

De moeilijkheid van een voorbeeldbestand is om dat weer te geven zonder overbodige ballast om de lezer te informeren wat de bedoeling is. Nogmaal, als ik het te mager heb gedaan, dan kan ik met je terugkoppeling alleen maar van leren. Terugdraaien van de feiten kan ik helaas niet.
 
Proefondervindelijk is gebleken dat de macro wel werkt als er maar één karakter in de cellen van kolom A staat. Met een string van meerdere karakters werkt die niet, ook niet als er allleen één of meerdere getallen (waarden) in staan.
Wie kan me helpen de macro aan te passen. Met de gebruikte codes heb ik geen enkele ervaring.
 
Probeer eerst de code te begrijpen.
Van wijzer wordt je niet slechter.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan