3.8k Aufrufe
Gefragt in Tabellenkalkulation von woenni Einsteiger_in (75 Punkte)
Beispiel: In einer Spalte stehen untereinander Zahlen, Texte und Kombination aus Zahl und Text. Bei Kombination steht zuerst immer die Zahl. Entsprechend sind unterschiedliche Aktionen erforderlich. Wenn in der Spalte eine Zahl steht, muß diese ausgeschnitten und in eine andere Spalte übertragen werden, in der dann nur Zahlen stehen. Gleichzeitig muß die Zahl aus der ursprünglichen Zelle entfernt werden, damit in dieser Spalte nur noch Text steht. Wenn nur Text in der Spalte steht ist folglich nichts zu tun.
Im Klartext:
Spalte enthält:
123 Muster
Muster ohne Zahl
456
Daraus sollen zwei Spalten werden:
Spalte A Spalte B
123 Muster
Muster ohne Zahl
456
Es wäre toll, wenn ich das mit einem Makro oder einer Formel lösen könnte, denn es geht um ein paar 100 Einträge die korrigiert werden müssen.

14 Antworten

0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo,

wenn ich davon ausgehe, dass zwischen Zahl und Text, wie im Beispiel, immer ein Leerzeichen steht, würde ich die Funktion "Text in Spalten" verwenden.

Gruß
Rainer
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo Rainer,
vielen Dank für Deine Antwort. Ich bin bzgl. Excel leider immer noch ziemlich grün hinter den Ohren und habe zum ersten Mal die vorgeschlagene Funktion "Text in Spalten" verwndet. Das Ergebnis ist gut und löst die Aufgabe, wenn der Eintrag "ZahlLeerstelleText" also "123 BlaBla" ist. In der Spalte kommen aber auch reine Texte direkt ab 1.Stelle links vor also "BlaBla". Dann funzt es nicht. Das 2. Problem, das ich mit der Funktion habe ist, daß ich keine (sichtbare) Formel in der Zelle erhalte, die ich dann für alle anderen Zeilen kopieren könnte. Ich müßte also pro Zeile die Funktion eingeben- und würde noch in 100 Jahren dran sitzen :)
Wie gesagt, so stellt es sich mir als "Grünling" dar.
Ich denke ich müßte die Sacjhe in einem Makro lösen, in dem ich in einer Schleife zeilenweise abfrage ob die erste Stelle der Zelle eine Ziffer ist; wenn ja sollten die ersten 5 Stellen in eine zusätzlich eingefügte Spalte übertragen werden und aus der Ursprungsspalte gelöscht werden. Anschließend sollte der verbleibende Rest in der Ursprungsspalte linksbündig gestellt werden. Wenn die erste Stelle keine Ziffer ist, sollte nichts passieren.
Ich hoffe, daß ich die Aufgabe deutlich genug geschildert habe und würde mich über eine Lösung sehr freuen.
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo,

stell bitte eine Beispielmappe, bei der man zweifelsfrei erkennt um welche Werte es sich handelt, ins Netz und verlinke sie nach hier.

Über diese Adresse wäre das möglich.

Gruß
Rainer
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Das mit "und würde noch in 100 Jahren dran sitzen :)" kann ich korrigieren, da ich die vorgeschlagene Funktion ja auf den vollständig markierten Bereich auf einmal anwenden kann (statt nur auf eine markierte Zelle, wie in meinem 1. Versuch). Problem bereitet aber der Text, der in sich auch mehrere Leerstellen enthalten kann. Dann wird nach jeder Leerstelle eine neue Spalte eingefügt, falls ich als Datentyp "Getrennt" und als Trennzeichen "Leerzeichen" gewählt habe. Der gesamte Text soll aber in einer Spalte bleiben. Wenn ich als Datentyp "Feste Breite" gewählt habe besteht das Problem darin, daß bei der Konstellation nur Text in Ursprungszelle der Text in die Spalte übertragen wird, die nur die Zahlen enthalten soll. Das wäre aus meinem ursprünglichen Beispiel "Muster ohne Zahl" der Wert "Muste". In diesem Fall dürfte aber gar nichts in die neue Spalte übertragen werden.

Ich hoffe das Problem verständlich geschildert zu haben. Eine Lösung könnte ich mir schon vorstellen, wenn ich wüßte, wie man in einem Makro feststellen kann, ob an einer bestimmten Stelle einer Zelle (z.B. links) eine Ziffer steht, wenn ja kann ich als Folgeaktion die ersten 5 Zeichen kopieren und in die neue Spalte übertragen. Wenn das erste Zeichen keine Ziffer ist, tue ich nichts
Gibt es dafür einen einfachen Algorythmus?
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi,

dein Tabellenaufbau ist also in allen Zellen so, dass entweder nur Text vorkommt oder eine Kombination aus 3 Zahlen, 1 Leerstelle und Text? Von der Kombination sollen in einer Spalte nur die ersten 5 Stellen ausgegeben werden und in der anderen alles ab der 6. Stelle und bei nur Text der gesamte Text in der zweiten Spalte?

Angenommen deine Daten stehen in Spalte A, beginnend ab Zeile 1 - schreibe in B1 diese Formel:

=WENN(UND(CODE(LINKS(A1;1))>47;CODE(LINKS(A1;1))<60);LINKS(A1;5);"")

und in C1 diese Formel

=WENN(B1<>"";"";A1)

und ziehe beide so weit nach unten wie deine Datenr reichen.

Bis später,
Karin
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo Rainer,
ich habe das gerade mit dem Upload über den angegebenen Link versucht . Habe aber das Gefühl, daß es nicht geklappt hat, da es kein feedback nach Auswahl der Datei und Betätigen des Upload Buttons mehr gab.
Jetzt muß ich für ein paar Stunden nach draußen, so daß ich mich erst gegen Nachmittag wieder an den PC setzen kann.
Ich reagiere dann wieder auf alle Nachrichten.

Erst mal schon Danke.
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo Karin,
ja, die Aufgabenstellung hast Du gut zusammengefaßt. Ich werde die Lösung heute Nachmittag versuchen und dann ein Feedback geben. Erst schon mal vielen Dank
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo Rainer und Karin,

vielen Dank für eure wirksame Mithilfe bei meinem Problem. Karins Antwort bringt die Lösung, d.h. alle Daten stehen nun richtig in den Spalten. Nun ist es wie so oft: "Naschen macht hungrig". Ich soll nun doch ein Makro schreiben, mit dem die Aufbereitung der umfangreichen Tabelle im Handumdrehen geht. deshalb die Frage, Wie kann ich Karins Vorschlag möglichst elegant in ein Makro einbauen. In diesem Makro muß ich u.a. auch je Zeile das nachstehende Minuszeichen im Betragsfeld nach vorne setzen, um eine gültige negative Zahl zu erhalten.
Es wäre ganz prima, wenn ich dazu noch Hilfe erhalten könnte.

Im Moment kann ich euch als Gegenleistung nur sonnige und freundliche Grüße aus der Vulkaneifel schicken und meinen herzlöichen Dank sagen.
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi,

leider weiß ich nicht, welche Spalte dein Betragsfeld enthält, deshalb habe ich einfach mal angenommen es sei Spalte E (5):

Sub Umwandeln()
Dim lngZeile As Long
For lngZeile = 1 To 20
If IsNumeric(Left(Cells(lngZeile, 1), 1)) Then
Cells(lngZeile, 2) = Left(Cells(lngZeile, 1), 5)
Else
Cells(lngZeile, 3) = Cells(lngZeile, 1)
End If
' Zellinhalt Spalte E in Zahl umwandeln
If Cells(lngZeile, 5) <> 0 Then Cells(lngZeile, 5) = Cells(lngZeile, 5) * 1
Next lngZeile
End Sub


Bis später,
Karin
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo Karin,
vielen Dank für Deinen Lösungsvorschlag. Ich bin gerade dabei ihn auszuprobieren, habe aber noch Schwierigkeiten mit der Interpretation der Makroanweisungen, die ich ja an meine Verhältnisse anpassen muß.
Die Betragsdaten stehen ab Zeile 11 in den Spalten L (12) und M (13). Spalte N saldiert die Daten.
Ein weiteres Problem ist, ich weiß noch nicht die genaue Anzahl der Zeilen. Das Makro müßte also feststellen, wieviel Zeilen die Tabelle hat und dann bis zur letzten Zeile den Umwandlungsalgorythmus durchführen.
Entspricht die erste For Anweisung 1 To 20 der Annahme, daß es 20 Zeilen sind? das habe ich auf 11 To 50 (für den Test der ersten 50 Zeilen genommen).
Ich füge mal das auf meine Verhältnisse angepaßte Makro hier ein, um sicherzustellen, daß ich es richtig verstanden habe.

Sub Betragsfelderaufbereiten()
'
' Betragsfelderaufbereiten Makro
' In den Quelldaten steht bei negativen Betragsfeldern das Minuszeichen hinten d.h. rechts. Gültige Werte müssen das Minuszeichen jedoch vor der bzw. links der Zahl haben.
'
' Tastenkombination: Strg+Umschalt+A
'
Dim lngZeile As Long
For lngZeile = 11 To 48
If IsNumeric(Left(Cells(lngZeile, 12), 1)) Then 'Das verstehe ich nicht
Cells(lngZeile, 12) = Left(Cells(lngZeile, 12), 12) 'und das auch nicht
Else
Cells(lngZeile, 12) = ""
End If
' Zellinhalt Spalte L in Zahl umwandeln
If Cells(lngZeile, 12) <> 0 Then Cells(lngZeile, 12) = Cells(lngZeile, 12) * 1
Next lngZeile
End Sub

Der Testlauf brachte ein Spitzenergebnis. Gratuliere! Alles ist richtig. Nun muß ich das ganze auch für die nächste Spalte machen Hierzu werde ich nochmals den gleichen Algorithmus kopieren und einfügen und die 12 durch 13 ersetzen. Ok?

Ich wäre sehr dankbar, wenn meine Begriffsstutzigkeit großzügig übersehen werden würde und ich noch eine Erklärung der ersten IF Anweisung und ihrer Folgezeile bekäme.

Viele Grüße
Wönni
...