Toon posts:

Rijen opslitsen

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste allemaal,

Ik heb een groot bestand met datagegevens.
In rij staan meerdere datagegevens. In een bepaalde cel (enkel in die) staan meerdere waardes.
Deze waardes gelden voor de gehele rij. Ik wil graag deze opsplitsen in een nieuwe rij.

Bijvoorbeeld:
Dit is wat ik heb

Datum - Naam - Totaal uur pauze
01-08 - Joop, Bart - 0:38

Dit is wat ik wil:

Datum - Naam - Totaal uur pauze
01-08 - Joop - 0:38
01-08 - Bart - 0:38

Is dit mogelijk in Excel ?

Alvast bedankt!

Alle reacties


Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Ja, dat kan, zoek maar eens op Tekst naar Kolommen

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RaZ schreef op vrijdag 27 oktober 2017 @ 16:18:
Ja, dat kan, zoek maar eens op Tekst naar Kolommen
Dat is tekst naar kolommen. Ik moet ze in rijen hebben of is hetgeen wat ik wil ook mogelijk met Tekst naar Kolommen?

Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Whoops, iets te snel gelezen. Ik zag die komma even over het hoofd. My bad.

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

  • Raznov
  • Registratie: December 2006
  • Nu online
Ik verwacht dat je in de VBA code moet duiken om dit te kunnen.
Echt eenvoudig gaat het niet worden.
Het lijk er op dat je dit wil bereiken:
1 - a, b - 2
1 - a - 2
1 - b - 2
Maar is je data altijd zo opgebouwd, of is er mogelijk nog een 3 of 4 etc.?

Strava & Untappd - Do not combine!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Raznov schreef op vrijdag 27 oktober 2017 @ 16:28:
Ik verwacht dat je in de VBA code moet duiken om dit te kunnen.
Echt eenvoudig gaat het niet worden.
Het lijk er op dat je dit wil bereiken:
1 - a, b - 2
1 - a - 2
1 - b - 2
Maar is je data altijd zo opgebouwd, of is er mogelijk nog een 3 of 4 etc.?
Het kan verschillen van 1 tot 6 waardes in die cel

Acties:
  • +4 Henk 'm!

  • breew
  • Registratie: April 2014
  • Laatst online: 10:16
Omdat het vrijdagmiddag is, heb ik wat geknutseld. Het werkt hier met de voorbeelddata die je hebt geleverd.. aanpassen naar eigen inzicht :)

Ik heb de code ruim voorzien van commentaar. Lees het, en probeer te begrijpen wat de code precies doet.

Visual Basic:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Option Explicit

Sub ProbeerDitEens()

'declaratie
Dim wsData As Worksheet         'werkblad met je brondata
Dim wsOutput As Worksheet       'werkblad voor output
Dim cel As Range                'cellen in bereik rngData
Dim rngData As Range            'het bereik met je brondata
Dim str1 As String              'string met de datum
Dim str2 As String              'string met de tijd
Dim str3 As String              'string met alle namen
Dim strNamen() As String        'array met de namen
Dim intPos1 As Integer          'positie van de eerste " - " in de data
Dim intPos2 As Integer          'positie van de laatste " - " in de data
Dim lonLaatsteRijData As Long   'onderste rij met data in wsData
Dim lonLaatsteRijOutput As Long 'onderste rij met data in wsOutput
Dim i As Integer                'lusteller

'initialisatie
'instellen werkblad met data
Set wsData = ActiveWorkbook.Sheets(1)
'toevoegen van een werkblad voor de output
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Output"
'instellen werkblad voor output
Set wsOutput = ActiveWorkbook.Sheets("Output")

'bepalen bereik met data
With wsData
  'onderste rij met data (in kolom A) bepalen
  lonLaatsteRijData = .Cells(Rows.Count, 1).End(xlUp).Row
  'instellen bereik met data
  Set rngData = .Range(.Cells(1, 1), .Cells(lonLaatsteRijData, 1))
End With

'loop door alle cellen in rngData
For Each cel In rngData
  'bepaal de positie van de eerste eerste " - "
  intPos1 = InStr(cel.Value, " - ")
  'de datum (str1) is vanaf links de waarde van de cel, tot de positie van de eerste " - "
  str1 = Left(cel.Value, intPos1 - 1)
  'bepaal de positie van de tweede " - "
  intPos2 = InStr(intPos1 + 2, cel.Value, " - ")
  'de tijd (str2) is vanaf rechts de waarde van de cel, tot de positie aan het eind van de tweede " - "
  str2 = Right(cel.Value, Len(cel.Value) - intPos2 - 2)
  'de namen staan tussen str1 en str2 in
  str3 = Mid(cel.Value, intPos1 + 3, intPos2 - intPos1 - 3)
  'vervang alle spaties tussen de namen voor "" (niks)
  str3 = Replace(str3, " ", "")
  'splitst de string met namen naar een array, splits op een komma (,)
  strNamen = Split(str3, ",")
  'schrijf nu de waarden weg naar wsOuput
  With wsOutput
    'bepaal de onderste rij met dta in wsoutput
    lonLaatsteRijOutput = .Cells(Rows.Count, 1).End(xlUp).Row
    'voor elke gevonden naam  (uit de array met namen; strNamen)
    For i = 0 To UBound(strNamen)
      'schrijf str1 naar de eerste kolom
      .Cells(lonLaatsteRijOutput + 1 + i, 1).Value = str1
      'schrijf de entry uit de array (de naam) naar de tweede kolom
      .Cells(lonLaatsteRijOutput + 1 + i, 2).Value = strNamen(i)
      'schrijf de datum str2 naar de derde kolom
      .Cells(lonLaatsteRijOutput + 1 + i, 3).Value = str2
    'ga naar de volgende naar in de array strNamen
    Next i
  End With
'ga naar de volgende cel in wsData
Next cel

'KLAAR

End Sub

Acties:
  • 0 Henk 'm!

  • Neodymium
  • Registratie: Juli 2007
  • Niet online

Neodymium

De Baron van 't Westen

Importeer text als data met de -
Dan transponeren
Importeer text als data met ,
Terug transponeren
Et voila?

Vereist wellicht het e.e.a. aan tussenbewerkingen om wat witregels toe te voegen, vast ook op te lossen met een draaitabel...

N00dlesoup alleen op afhalen (4,29EUR)


Acties:
  • +1 Henk 'm!

  • Boeryepes
  • Registratie: Januari 2016
  • Niet online
dit kan ook met formules alleen.
Bron staat in kolom A:
1. splits de string op de '-'. Dit geeft je 01-08 en Joop, Bart en 0:38 -> dit levert 3 kolommen op: B, C en D
2. splits kolom C op de ','. Dit geeft je Joop en Bart -> dit levert kolommen E en F op
3. bouw nieuwe strings obv kolommen B, E, D en nog een keer voor kolommen B, F, D -> bij voorkeur in een ander tabblad
4. Autofilter aan en sorteren (handmatig) OF een pivottable (automatisch)

Hoe je strings splitst dat laat ik je liever zelf uitzoeken, hier wat goede voorbeelden:
http://www.excelfunctions.net/split-string-in-excel.html

The biggest communication problem is we do not listen to understand. We listen to reply.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
breew schreef op vrijdag 27 oktober 2017 @ 17:21:
Omdat het vrijdagmiddag is, heb ik wat geknutseld. Het werkt hier met de voorbeelddata die je hebt geleverd.. aanpassen naar eigen inzicht :)

Ik heb de code ruim voorzien van commentaar. Lees het, en probeer te begrijpen wat de code precies doet.

Visual Basic:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Option Explicit

Sub ProbeerDitEens()

'declaratie
Dim wsData As Worksheet         'werkblad met je brondata
Dim wsOutput As Worksheet       'werkblad voor output
Dim cel As Range                'cellen in bereik rngData
Dim rngData As Range            'het bereik met je brondata
Dim str1 As String              'string met de datum
Dim str2 As String              'string met de tijd
Dim str3 As String              'string met alle namen
Dim strNamen() As String        'array met de namen
Dim intPos1 As Integer          'positie van de eerste " - " in de data
Dim intPos2 As Integer          'positie van de laatste " - " in de data
Dim lonLaatsteRijData As Long   'onderste rij met data in wsData
Dim lonLaatsteRijOutput As Long 'onderste rij met data in wsOutput
Dim i As Integer                'lusteller

'initialisatie
'instellen werkblad met data
Set wsData = ActiveWorkbook.Sheets(1)
'toevoegen van een werkblad voor de output
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Output"
'instellen werkblad voor output
Set wsOutput = ActiveWorkbook.Sheets("Output")

'bepalen bereik met data
With wsData
  'onderste rij met data (in kolom A) bepalen
  lonLaatsteRijData = .Cells(Rows.Count, 1).End(xlUp).Row
  'instellen bereik met data
  Set rngData = .Range(.Cells(1, 1), .Cells(lonLaatsteRijData, 1))
End With

'loop door alle cellen in rngData
For Each cel In rngData
  'bepaal de positie van de eerste eerste " - "
  intPos1 = InStr(cel.Value, " - ")
  'de datum (str1) is vanaf links de waarde van de cel, tot de positie van de eerste " - "
  str1 = Left(cel.Value, intPos1 - 1)
  'bepaal de positie van de tweede " - "
  intPos2 = InStr(intPos1 + 2, cel.Value, " - ")
  'de tijd (str2) is vanaf rechts de waarde van de cel, tot de positie aan het eind van de tweede " - "
  str2 = Right(cel.Value, Len(cel.Value) - intPos2 - 2)
  'de namen staan tussen str1 en str2 in
  str3 = Mid(cel.Value, intPos1 + 3, intPos2 - intPos1 - 3)
  'vervang alle spaties tussen de namen voor "" (niks)
  str3 = Replace(str3, " ", "")
  'splitst de string met namen naar een array, splits op een komma (,)
  strNamen = Split(str3, ",")
  'schrijf nu de waarden weg naar wsOuput
  With wsOutput
    'bepaal de onderste rij met dta in wsoutput
    lonLaatsteRijOutput = .Cells(Rows.Count, 1).End(xlUp).Row
    'voor elke gevonden naam  (uit de array met namen; strNamen)
    For i = 0 To UBound(strNamen)
      'schrijf str1 naar de eerste kolom
      .Cells(lonLaatsteRijOutput + 1 + i, 1).Value = str1
      'schrijf de entry uit de array (de naam) naar de tweede kolom
      .Cells(lonLaatsteRijOutput + 1 + i, 2).Value = strNamen(i)
      'schrijf de datum str2 naar de derde kolom
      .Cells(lonLaatsteRijOutput + 1 + i, 3).Value = str2
    'ga naar de volgende naar in de array strNamen
    Next i
  End With
'ga naar de volgende cel in wsData
Next cel

'KLAAR

End Sub
Niet normaal, wat een werk heb je ervan gemaakt!
Echt super tof. Ga hem proberen aan te passen naar hetgene wat ik nodig heb.

Acties:
  • 0 Henk 'm!

  • breew
  • Registratie: April 2014
  • Laatst online: 10:16
Verwijderd schreef op maandag 30 oktober 2017 @ 17:08:
[...]
Niet normaal, wat een werk heb je ervan gemaakt!
Echt super tof. Ga hem proberen aan te passen naar hetgene wat ik nodig heb.
succes!

Acties:
  • 0 Henk 'm!

  • JeanPaul28
  • Registratie: Oktober 2017
  • Laatst online: 11-07-2019
test deze eens
Sub test()
[G2:I1000000].ClearContents
For Each cl In Range("B2:B" & Range("B" & Rows.Count).End(xlUp).Row)
sq = Split(cl, ",")

Cells(Rows.Count, "G").End(xlUp).Offset(1).Resize(UBound(sq) + 1, 1).Value = WorksheetFunction.Transpose(cl.Offset(0, -1))
Cells(Rows.Count, "H").End(xlUp).Offset(1).Resize(UBound(sq) + 1, 1).Value = WorksheetFunction.Transpose(sq)
Cells(Rows.Count, "I").End(xlUp).Offset(1).Resize(UBound(sq) + 1, 1).Value = WorksheetFunction.Transpose(cl.Offset(0, 1))

Next
End Sub
Pagina: 1