[VBA / Excel 2007] Data van kolom naar rij

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • The Executer
  • Registratie: Juli 2005
  • Laatst online: 16:32

The Executer

Lekker belangrijk!

Topicstarter
Vanwege een beperking van het spamfilter om een fatsoenlijk report uit te draaien, ben ik op zoek naar een manier om de data fatsoenlijk in Excel te zetten. Wanneer ik de data in Excel plak als tekst, komt deze in 1 kolom te staan. De data moet uiteindelijk in rijen komen te staan. Voorbeeld:

Van:
datum & tijd
emailadres afzender
onderwerp e-mail
ontvanger
grootte bericht
datum & tijd
emailadres afzender
onderwerp e-mail
ontvanger
grootte bericht


Naar:

datum & tijdemailadres afzenderonderwerp e-mailontvangergrootte bericht
datum & tijdemailadres afzenderonderwerp e-mailontvangergrootte bericht
datum & tijdemailadres afzenderonderwerp e-mailontvangergrootte bericht
datum & tijdemailadres afzenderonderwerp e-mailontvangergrootte bericht
datum & tijdemailadres afzenderonderwerp e-mailontvangergrootte bericht


Nu ben ik al bezig geweest met een macro handmatig op te nemen. Hierbij knip ik de data uit cel a2, plak deze in B1, knip de data uit A3, plak in C3 etc etc. Dit werkt wel, maar Excel voert dit hierna maar 1 maal uit. Ook wel logisch, meer staat er dan ook niet uit de macro. De code die dit oplevert:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub Macro2()
'
' Macro2 Macro
'
' Sneltoets: CTRL+l
'
    Range("A2").Select
    Selection.Cut
    Range("B1").Select
    ActiveSheet.Paste
    Range("A3").Select
    Selection.Cut
    Range("C1").Select
    ActiveSheet.Paste
    Range("A4").Select
    Selection.Cut
    Range("D1").Select
    ActiveSheet.Paste
    Range("A5").Select
    Selection.Cut
    Range("E1").Select
    ActiveSheet.Paste
    Rows("2:5").Select
    Selection.Delete Shift:=xlUp
End Sub


Nu ben ik op internet gaan zoeken voor een oplossing, en kwam hierbij op de volgende code:

code:
1
2
3
4
5
6
Sub test()
x = WorksheetFunction.CountA(Range("A:A")) / 5
For i = 1 To x
Cells(i, 2).Resize(, 5) = Application.Transpose(Cells((i - 1) * 5 + 1, 1).Resize(5))
Next i
End Sub


Deze code doet zijn werk, maar laat de data in de eerste kolom staan, en zet maar 6 blokken om:

Afbeeldingslocatie: http://i20.photobucket.com/albums/b215/TheExecuter/Tweakers/screenshot.jpg

Dit zou op zich geen probleem zijn, immers die eerste kolom kan ik wel wissen. Probleem is: als hij maar verder gaat zolang er nog data staat (of desnoods de hele werkmap). Ik weet niet welke van de opties ik hiervoor aan moet passen zodat hij de rest van de data omzet. Overal waar 5 staat, heb ik deze als test al vervangen door 10 :X , maar dit levert geen macro op die verder gaat.

Zoals jullie misschien merken, heb ik weinig VBA kennis. Ik ben meer van de uitvoerende kant, lekker met de handen bezig :$

"We don't make mistakes; we just have happy accidents" - Bob Ross


Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

offtopic:
.Select, .Cut en .Paste zijn IMO drie doodzondes in VBA :X Maar goed, da's niet zo belangrijk.


Of het nu VBA of enige andere taal is maakt niet uit. Misschien goed als je in "Nederlands" even bedenkt wat ieder van de regels doet.

2 telt het aantal regels en deelt door vijf
3 doet een loopje: begin bij i=1, dan 2, dan 3 en door tot en met het eerdere aantal regels
4 (Moeilijk :+ )
5 einde loop, begin opnieuw

Maar nu je weet dat for een loopje doet, kan je dat mechanisme gebruiken om je eigen opgenomen macro aan te passen: bepaal het aantal keer dat het moet lopen en zet het gehaal in die loop om het zoveel keer te laten uitvoeren :)

[ Voor 6% gewijzigd door F_J_K op 26-10-2012 11:51 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

  • LiquidT_NL
  • Registratie: September 2003
  • Laatst online: 13-05-2021
Ik zou het veul makkelijker doen persoonlijk. Ik zou gewoon iedere regel laten uitlezen en daar zo'n outputregel van bouwen, en dan bij 5 elke keer weer terug naar de eerste kolom van de output.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub test()
Dim oCol as integer
Dim oRow as integer

x = WorksheetFunction.CountA(Range("A:A"))
oRow = 1
oCol = 2

For i = 1 To x
cells(oRow, oCol) = cells(i, 1)

if oCol = 6 Then 
  oCol = 2
  oRow = oRow + 1
Else
  oCol = oCol + 1
end if

Next i

End Sub


Even simpel in elkaar gezet. Er zijn snellere manieren, maar dit zou vlot zat moeten zijn voor jouw toepassing en wat beter te gebruiken.

2 en 3 is gewoon voor de vorm (ja ik had X dan ook moeten doen)

6 en 7 geven de eerste waarden mee. Ik ga dus invullen vanaf kolom 1 (dan kun je achteraf de eerste kolom met de brondata verwijderen, dit kan ook in VBA maar ik heb de juiste commando's even niet bij de hand en geen toegang tot Excel a.t.m.)

10 vult in

12-17 check dus of hij bij kolom 6 is: if so, dan moet hij weer terug naar de volgende regel (14) en de kolom weer terugzetten naar 2 (13). Anders kan hij gewoon naar de volgende kolom.

Explorers in the further regions of experience...demons to some, angels to others.


Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

LiquidT_NL schreef op vrijdag 26 oktober 2012 @ 12:15:
Ik zou het veul makkelijker doen persoonlijk. Ik zou gewoon iedere regel laten uitlezen en daar zo'n outputregel van bouwen, en dan bij 5 elke keer weer terug naar de eerste kolom van de output.
offtopic:
Helemaal eens, leek me alleen een brug te ver :P

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

  • The Executer
  • Registratie: Juli 2005
  • Laatst online: 16:32

The Executer

Lekker belangrijk!

Topicstarter
Inmiddels heb ik zelf iets in elkaar gezet. Bij het opnemen van de macro heb ik nu relatieve verwijzingen gebruikt, waardoor hij nu automatisch de volgende regel omzet. Nu hoef ik alleen maar heel vaak op de sneltoets te drukken, en zet hij de data om.

Zal zometeen ook nog even kijken naar de macro van LiquidT_NL.

"We don't make mistakes; we just have happy accidents" - Bob Ross