Microsoft Excel

Herbers Excel/VBA-Archiv

Eine Art Transponieren

Betrifft: Eine Art Transponieren von: Markus
Geschrieben am: 06.08.2014 07:57:49

Hallo
in Tabelle1 sind 400 Mitglieder aufgeführt.
Spalten A bis L (12 Spalten).
Nicht alle Spalten-Felder sind gefüllt (Mail, Handy, Beruf etc.)
Nun soll ein Makro folgendes machen.
Übernehmen aller gefüllten Felder (ohne Blank) und in Tabelle2 einspaltig (Spalte A) schreiben.
Bei ca 400 Mitgliedern und 12 Spalten sollten also in Tabelle2 die Felder von A1 bis ca A47000 stehen.
Danke für einen Tipp oder Hilfe.
Markus

  

Betrifft: nachgefragt ... von: neopa C (paneo)
Geschrieben am: 06.08.2014 08:09:49

Hallo Markus,

... das sieht nach einer einmaligen Aktion aus. Das lies sich auch mit nur einer (MATRIX-)Formel bewerkstelligen.
Wie soll denn zusammen gefaßt werden? Erst alle Daten aus einer Spalte, dann die der nächsten Spalte oder erst die Daten aus Zeile1, dann aus Zeile 2 etc. Allerdings ist mir momentan auch unklar, welchen Sinn die Aktion hat, denn es gibt ja anschließend keine wirklich offensichtliche Struktur mehr zu erkennen.

Gruß Werner
.. , - ...


  

Betrifft: AW: nachgefragt ... von: Markus
Geschrieben am: 06.08.2014 08:16:28

Hallo Werner
von A1 bis L1 durchlesen,
dann A2 ....
In Tabelle2 müsste stehen:
A1: A1 aus Tabelle1
A2: B1 aus Tabelle1
A3: D1 aus Tabelle1 (C1 aus Tabelle1 ist LEER)
Markus


  

Betrifft: nachgefragt ... von: Matthias L
Geschrieben am: 06.08.2014 08:12:31

Hallo Markus

Zeig doch mal eine Bsp.Datei mit den 2 Tabellen
Dort zeigst Du mal händisch anhand von 3-4 Mitgliedern
wie Du Dir das Ergebnis vorstellst.

Ich bin mir nicht sicher wie Deine Quelle aussieht und das Ziel dargestellt werden soll.
Evtl. sieht die Quelle so aus?

Tabelle1

 ABCDEFGHIJKL
1NameMailHandyBeruf. . . . . . . . . . . . . . . . . . . . . . . .
2Name1           
3Name2           
4Name3           
5Name4           
6Name5           
7Name6           
8Name7           
9Name8           
10Name9           
11Name10           


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

Gruß Matthias


  

Betrifft: AW: Eine Art Transponieren von: Markus
Geschrieben am: 06.08.2014 08:23:19

Hallo
hier der LINK:
https://www.herber.de/bbs/user/91923.xlsx
(siehe Tabelle1 und Tabelle2)
Danke
Markus


  

Betrifft: Eine Art Transponieren von: Matthias L
Geschrieben am: 06.08.2014 08:37:15

Hallo Markus

hier eine Variante

Option Explicit
Sub Transp()
Dim WksQ As Worksheet 'Quelle
Dim WksZ As Worksheet 'Ziel
Dim Rng As Range, lfv&
lfv = 1
Set WksQ = Tabelle1
Set WksZ = Tabelle2
For Each Rng In WksQ.UsedRange
 If Rng.Row > 1 Then
   If Rng.Value <> "" Then
      WksZ.Cells(lfv, 1) = Rng.Value
      lfv = lfv + 1
      If Rng.Column = 12 Then lfv = lfv + 1
   End If
 End If
Next
End Sub
Gruß Matthias


  

Betrifft: AW: Eine Art Transponieren von: Markus
Geschrieben am: 06.08.2014 13:54:47

Hallo Matthias
besten Dank - eigentlich Super aber ..
Das Makro soll wirklich nur die ersten 12 Spalten abarbeiten.
Aber der 13 Spalte sind teilweise noch Formeln in der Tabelle die nicht in Tabelle2 eingefügt werden müssen.
Kann man das noch ändern?
Danke
Markus


  

Betrifft: der Vollständigkeithalber hier die Formel ... von: neopa C (paneo)
Geschrieben am: 06.08.2014 08:44:39

Hallo Markus,

... allerdings interessiert mich immer noch, für was das gut sein soll.

Formel entsprechend weit nach unten kopieren:

 A
1Meier
2Markus
3Seldwyla 17
48000 Zürich
5044 123 456 77
6044 123 44 88
7052 320 55 66
8hans@mail.ch
9www.grosshandel.ch
1059
11D1485
12Abegg
13Fritz
14Dorf 18
159000 St. Gallen
16052 333 44 44
17079 441 85 67
18fritz@abegg.ch
1962
20K13856
21 

Formeln der Tabelle
ZelleFormel
A1{=WENN(ZEILE(C1)>ANZAHL2(Tabelle1!A$2:L$500); "";INDEX(Tabelle1!A:L;KKLEINSTE((Tabelle1!A$2:L$500="")*10^9+ZEILE($2:$500)*1000+SPALTE(A:L); ZEILE(C1))/1000;REST(KKLEINSTE((Tabelle1!A$2:L$500="")*10^9+ZEILE($2:$500)*1000+SPALTE(A:L); ZEILE(C1)); 1000)))}
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!


 ABCDEFGHIJKL
1AnredeName VornameStrassePLZ OrtTelefonHandyGeschäftFaxMailHomepageAlterCode
2MeierMarkusSeldwyla 178000 Zürich044 123 456 77 044 123 44 88052 320 55 66hans@mail.chwww.grosshandel.ch59D1485
3AbeggFritzDorf 189000 St. Gallen052 333 44 44079 441 85 67  fritz@abegg.ch 62K13856
4            


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

Gruß Werner
.. , - ...


  

Betrifft: AW: der Vollständigkeithalber hier die Formel ... von: Markus
Geschrieben am: 06.08.2014 10:06:20

Hallo Werner
ganz einfach!
Nach dem Kopieren werde ich die Daten nach Word kopieren für ein Mitglieder-Verzeichnis.
Dieses möchten wir nicht tabellarisch, sondern als Absatz ausdrucken.
Hier ein Muster das mir besonders gut gefällt.
http://www.svit.ch/fileadmin/user_upload/SEK/Verzeichnis_der_SEK-Mitglieder_17.07.2014.pdf
Seite 7 folgende
Markus


  

Betrifft: AW: Eine Art Transponieren von: Rudi Maintaire
Geschrieben am: 06.08.2014 16:47:02

Hallo,
eine Möglichkeit:

Sub aaa()
  Dim arrIn, i As Long, j As Long, n As Long
  With Sheets("Tabelle1")
    arrIn = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 12)
    ReDim arrOut(1 To WorksheetFunction.CountA(.Range("A:L")), 1 To 1)
  End With
  For i = 1 To UBound(arrIn)
    For j = 1 To UBound(arrIn, 2)
      If arrIn(i, j) <> "" Then
        n = n + 1
        arrOut(n, 1) = arrIn(i, j)
      End If
    Next j
  Next i
  Sheets("tabelle2").Cells(1, 1).Resize(UBound(arrOut)) = arrOut
End Sub

Gruß
Rudi


  

Betrifft: und wenn du noch ... von: Rudi Maintaire
Geschrieben am: 06.08.2014 16:58:40

Hallo,
...eine Leerzeile nach jedem Datensatz haben willst:

Sub aaa()
  Dim arrIn, i As Long, j As Long, n As Long
  With Sheets("Tabelle1")
    arrIn = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 12)
    ReDim arrOut(1 To WorksheetFunction.CountA(.Range("A:L")) + UBound(arrIn) - 1, 1 To 1)
  End With
  For i = 1 To UBound(arrIn)
    For j = 1 To UBound(arrIn, 2)
      If arrIn(i, j) <> "" Then
        n = n + 1
        arrOut(n, 1) = arrIn(i, j)
      End If
    Next j
    n = n + 1
  Next i
  With Sheets("tabelle2")
    .Columns(1).Clear
    .Cells(1, 1).Resize(UBound(arrOut)) = arrOut
  End With
End Sub
die Felder von A1 bis ca A47000 stehen
Wie kommst du eigentlich bei 400 x 12 auf ca. 47000?

Gruß
Rudi