Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
640to644
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
640to644
640to644
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Werte aus einer Zeile untereinander setzen

Werte aus einer Zeile untereinander setzen
27.07.2005 19:03:57
Markus
Hallo Leute,
folgendes Problem:
in einer Zeile stehen div. nebeneinander gruppierte Werte (z.B. Name, Grund1 - 3, Verursacher, 1 - 3, Kosten, etc.). Ich möchte nun, dass anhand der 3 möglichen Gründe und Verursacher die Zeile gesplittet und untereinander aufgelistet wird, wobei alle anderen davor und dahinterliegenden Werte (Name, Kosten, etc.) übernommen werden. Dabei ist zu berücksichtigen, dass mind. Grund1/Verursacher1 aber nicht G2-3/V2-3 befüllt sein könnten. Damit nicht genug, würde ich gern (der Übersicht halber) die dadurch überflüssigen Spalten (also Grund2-3/Verursacher2-3) wegfallen lassen.
Ich habe einmal ein kleines Beispiel upgeloaded, aus dem die Basisdaten und das gewünschte Ergebnis hervorgeht:
https://www.herber.de/bbs/user/25065.xls
Jemand eine Idee?
Danke Euch schonmal!!
Gruß Markus

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 20:44:20
Reinhard
Hi Marjus,
Optionen--Ansicht--Nullwerte wegklicken

Option Explicit
Sub tt()
Dim n As Byte, wsQ As Worksheet, wsZ As Worksheet
Dim zeiQ As Long, zeiZ As Long
Set wsQ = Worksheets("Basisdaten")
Set wsZ = Worksheets("Ergebnis")
zeiZ = 1
zeiQ = 1
With wsZ
While (wsQ.Cells(zeiQ + 1, 1)) <> ""
zeiQ = zeiQ + 1
For n = 4 To 8 Step 2
If wsQ.Cells(zeiQ, n) <> "" Then
zeiZ = zeiZ + 1
wsQ.Range(Cells(zeiQ, 1), Cells(zeiQ, 3)).Copy Destination:=.Cells(zeiZ, 1)
wsQ.Range(Cells(zeiQ, n), Cells(zeiQ, n + 1)).Copy Destination:=.Cells(zeiZ, 5)
wsQ.Range(Cells(zeiQ, 10), Cells(zeiQ, 12)).Copy Destination:=.Cells(zeiZ, 7)
End If
Next n
Wend
End With
End Sub

Frage noch offen weill ich grad nich durchschaue warum es einen Fehler 1004 gibt wenn man in "Ergebnis" steht.
Gruß
Reinhard
Anzeige
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 21:02:27
Markus
Hallo Reinard,
super! den Fehler 1004 habe ich bei mir nicht. Kann der Code noch so angeglichen werden, dass die "0er" gar nicht erst mit im Ergebnis aufgeführt werden, sprich bei dem Beispiel "Jochen" nur mit zwei Zeilen ausgewiesen wird?
Gruß Markus
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 21:43:25
Erich
Hallo Markus,
ein wenig Bednken habe ich dabei, die POS- und Lohnkosten mehrfach in die Tabelle zu schreiben, wenn in einer Basiszeile mehr als ein Grund belegt ist. Könnte man die Kosten künstlich auf die Gründe gleich verteilen? Dann stimmt nachher die Summe der Kosten über alle Sätze.
Mein Vorschlag:
Option Explicit
Sub untereinander()
Dim qz&, zz&, anzGr%, ii%
Dim qws As Worksheet, zws As Worksheet
Set qws = Sheets("Basisdaten")
Set zws = Sheets("Ergebnis")
qz = 2
zz = 1
While Not IsEmpty(qws.Cells(qz, 1))
zz = zz + 1
anzGr = 0
Range(qws.Cells(qz, 1), qws.Cells(qz, 5)).Copy _
zws.Cells(zz, 1)
If Not IsEmpty(qws.Cells(qz, 6)) Then
If qws.Cells(qz, 6) <> "0" Then
zz = zz + 1
anzGr = anzGr + 1
Range(zws.Cells(zz - anzGr, 1), zws.Cells(zz - anzGr, 5)).Copy _
zws.Cells(zz, 1)
Range(qws.Cells(qz, 6), qws.Cells(qz, 7)).Copy _
zws.Cells(zz, 4)
End If
End If
If Not IsEmpty(qws.Cells(qz, 8)) Then
If qws.Cells(qz, 8) <> "0" Then
zz = zz + 1
anzGr = anzGr + 1
Range(zws.Cells(zz - anzGr, 1), zws.Cells(zz - anzGr, 5)).Copy _
zws.Cells(zz, 1)
Range(qws.Cells(qz, 8), qws.Cells(qz, 9)).Copy _
zws.Cells(zz, 4)
End If
End If
For ii = 0 To anzGr
zws.Cells(zz - ii, 6) = Round(qws.Cells(qz, 10) / (anzGr + 1), 2)
zws.Cells(zz - ii, 7) = Round(qws.Cells(qz, 11) / (anzGr + 1), 2)
Next ii
qz = qz + 1
Wend
Range(zws.Cells(2, 8), zws.Cells(zz, 8)).FormulaLocal = "=F2+G2"
End Sub

Grüße aus Kamp-Lintfort
Erich
Anzeige
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 21:58:13
Markus
Hallo Erich,
danke für deine Bendenken. Du hast natürlich recht, dass die Kosten nicht im Gesamten unter jeder Position zu berechnen sind. Hierbei handelt es sich jedoch nur um ein Beispiel für eine größere Tabelle. Bei der werden die Kosten unter jeder Position mit einem Faktor multipliziert und somit auf die jeweilige Position aufgeteilt. Es ist jedoch für die Endfassung wichtig, dass unter jeder Position die Gesamtkosten zunächst aufgeführt werden und unter einer anderen Spalte der zu belastende Kostensatz steht.
Zu deinem Vorschlag: hier bringt Excel mir eine Fehlermeldung raus. Excel hat ein problem bei Zeile:
For ii = 0 To anzGr
zws.Cells(zz - ii, 6) = Round(qws.Cells(qz, 10) / (anzGr + 1), 2)
zws.Cells(zz - ii, 7) = Round(qws.Cells(qz, 11) / (anzGr + 1), 2)
Next ii
... mit dem "Round". Es sagt dazu: Sub oder Function nicht definiert.
Danke für deine Hilfe. Zurück zu Reiners Vorschlag, mit deiner Hilfestellung klappt es wunderbar. Nur noch eins: bekommt man es auch so hin, dass die 0-Werte (also in den Zellen, in denen nichts drin steht) gar nicht erst im Ergebnis aufgeführt werden. Also Beispiel "Jochen" nur mit zwei Zeilen untereinander aufgeführt wird?
Gruß Markus
Anzeige
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 22:15:03
Erich
Hallo Markus,
ohne Kostenverteilung gehts kürzer:
Option Explicit
Sub untereinander()
Dim qz&, zz&, ii%, qws As Worksheet, zws As Worksheet
Set qws = Sheets("Basisdaten")
Set zws = Sheets("Ergebnis")
qz = 2
zz = 1
With zws
While Not IsEmpty(qws.Cells(qz, 1))
zz = zz + 1
Range(qws.Cells(qz, 1), qws.Cells(qz, 5)).Copy zws.Cells(zz, 1)
Range(qws.Cells(qz, 10), qws.Cells(qz, 11)).Copy zws.Cells(zz, 6)
For ii = 6 To 8 Step 2
If Not IsEmpty(qws.Cells(qz, ii)) Then
If Not IsNumeric(qws.Cells(qz, ii)) Or qws.Cells(qz, ii) > 0 Then
zz = zz + 1
Range(qws.Cells(qz, 1), qws.Cells(qz, 3)).Copy zws.Cells(zz, 1)
Range(qws.Cells(qz, 10), qws.Cells(qz, 11)).Copy zws.Cells(zz, 6)
Range(qws.Cells(qz, ii), qws.Cells(qz, ii + 1)).Copy zws.Cells(zz, 4)
End If
End If
Next ii
qz = qz + 1
Wend
Range(.Cells(2, 8), .Cells(zz, 8)).FormulaLocal = "=F2+G2"
End With
End Sub

Grüße aus Kamp-Lintfort
Erich
Anzeige
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 22:42:42
Markus
Hallo Erich,
Excel hat ein Problem mit folgender Zeile
If Not IsNumeric ....
Laufzeitfehler 13, Typen unverträglich
Hast du ein Ahnung warum?
Gruß Markus
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 23:07:35
Erich
Hallo Markus,
könnte am Ausdruck "Or qws.Cells(qz, ii) > 0" liegen. Wenn es in deiner Tabelle keine numerischen Gründe (außer 0 - den leeren) gibt, kannst du diesen Teil der fehlerhaften Zeile streichen. Dann sollte es laufen.
"könnte", weil bei mir der Fehler nicht auftritt.
Bei mir (Excel 10.0 - XP) optimiert VBA den Code wohl anders als bei dir. Bei mir wird der "Or"-Zweig dieser If-Anweisung anscheinend nur dann geprüft, wenn in der Zelle ein Wert steht, der in eine Zahl umgewandelt werden kann. Wenn also "Not IsNumeric(qws.Cells(qz, ii))" zutrifft, wird "qws.Cells(qz, ii) > 0" nicht mehr geprüft - und der Fehler tritt nicht auf.
Falls es doch numerische Gründe > 0 geben sollte, hier eine neue Version, die auch damit laufen sollte:
Option Explicit
Sub untereinander()
Dim qz&, zz&, ii%, istGrund As Boolean
Dim qws As Worksheet, zws As Worksheet
Set qws = Sheets("Basisdaten")
Set zws = Sheets("Ergebnis")
qz = 2
zz = 1
With zws
While Not IsEmpty(qws.Cells(qz, 1))
zz = zz + 1
Range(qws.Cells(qz, 1), qws.Cells(qz, 5)).Copy zws.Cells(zz, 1)
Range(qws.Cells(qz, 10), qws.Cells(qz, 11)).Copy zws.Cells(zz, 6)
For ii = 6 To 8 Step 2
istGrund = False
If Not IsEmpty(qws.Cells(qz, ii)) Then
If IsNumeric(qws.Cells(qz, ii)) Then
If qws.Cells(qz, ii) > 0 Then istGrund = True
Else
istGrund = True
End If
End If
If istGrund Then
zz = zz + 1
Range(qws.Cells(qz, 1), qws.Cells(qz, 3)).Copy zws.Cells(zz, 1)
Range(qws.Cells(qz, 10), qws.Cells(qz, 11)).Copy zws.Cells(zz, 6)
Range(qws.Cells(qz, ii), qws.Cells(qz, ii + 1)).Copy zws.Cells(zz, 4)
End If
Next ii
qz = qz + 1
Wend
Range(.Cells(2, 8), .Cells(zz, 8)).FormulaLocal = "=F2+G2"
End With
End Sub

Grüße aus Kamp-Lintfort
Erich
Anzeige
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 23:22:06
Erich
Hallo Markus,
die Funktion Round() kommt zwar aktuell nicht mehr vor, aber für künftige Fälle noch ein Tipp (hier in der der Recherche gefunden):
Wenn die Funktion Round() nicht gefunden wird, verwendet man an deren Stelle die Tabellenfunktion RUNDEN, also in VBA:
Application.WorksheetFunction.Round()
Grüße aus Kamp-Lintfort
Erich
AW: Werte aus einer Zeile untereinander setzen
28.07.2005 17:49:39
Markus
Hallo Erich,
alles wunderbar funktioniert. Ich danke dir vielmals für deine Hilfe!
Beste Grüße
Markus
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 20:44:47
Reinhard
Hi Marjus,
Optionen--Ansicht--Nullwerte wegklicken

Option Explicit
Sub tt()
Dim n As Byte, wsQ As Worksheet, wsZ As Worksheet
Dim zeiQ As Long, zeiZ As Long
Set wsQ = Worksheets("Basisdaten")
Set wsZ = Worksheets("Ergebnis")
zeiZ = 1
zeiQ = 1
With wsZ
While (wsQ.Cells(zeiQ + 1, 1)) <> ""
zeiQ = zeiQ + 1
For n = 4 To 8 Step 2
If wsQ.Cells(zeiQ, n) <> "" Then
zeiZ = zeiZ + 1
wsQ.Range(Cells(zeiQ, 1), Cells(zeiQ, 3)).Copy Destination:=.Cells(zeiZ, 1)
wsQ.Range(Cells(zeiQ, n), Cells(zeiQ, n + 1)).Copy Destination:=.Cells(zeiZ, 5)
wsQ.Range(Cells(zeiQ, 10), Cells(zeiQ, 12)).Copy Destination:=.Cells(zeiZ, 7)
End If
Next n
Wend
End With
End Sub

Frage noch offen weill ich grad nich durchschaue warum es einen Fehler 1004 gibt wenn man in "Ergebnis" steht.
Gruß
Reinhard
Anzeige
AW: Werte aus einer Zeile untereinander setzen
27.07.2005 21:38:33
Erich
Hallo Reinhard und Markus,
der 1004 kommt wegen der falschen Range-Festlegung.
Statt
wsQ.Range(Cells(zeiQ, 10), Cells(zeiQ, 12))
muss es
Range(wsQ.Cells(zeiQ, 10), wsQ.Cells(zeiQ, 12))
heißen.
Bei der ersten Möglichkeit geht VBA von den Cells(zeiQ, ..) im aktiven Blatt aus, soll aber einen Bereich im Blatt wsQ bestimmen. Wenn wsQ nicht (zufällig) das aktive Blatt ist, geht das schief.
Bei der korrekten zweiten Schreibweise bestimmt VBA den Bereich, der durch die beiden Zellen in wsQ begrenzt ist - dieser Bereich befindet sich dann natürlich automatisch in Blatt wsQ.
Grüße aus Kamp-Lintfort
Erich
Anzeige
aargs, Wald vor lauter Bäumen, merci o.w.T
27.07.2005 22:43:06
Reinhard
Gruß
Reinhard

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige