paescu
Goto Top

Excel - Zeichen suchen und Text bis dahin kopieren

Hallo zusammen

wieder einmal eine weitere Frage von mir face-big-smile
Diesmal geht es um Excel und VBA. Ich habe einen Auftrag, bei dem ich unter Anderem in einer Zelle ein Raute-Zeichen oder einen Abstand (je nachdem) suchen muss, den Text vor diesem Zeichen in ein Array und den Text danach in ein anderes Array speichern muss.
Nur habe ich keine Ahnung, wie das geht und irgendwie muss es ja gehen... Wäre sehr froh über eine baldige Antwort...

Content-Key: 37954

Url: https://administrator.de/contentid/37954

Ausgedruckt am: 28.03.2024 um 23:03 Uhr

Mitglied: 8644
8644 14.08.2006 um 14:47:41 Uhr
Goto Top
Hi,

A1: 123asc#as232

Für den Text vor der Raute:
=LINKS(A1;FINDEN("#";A1)-1)

Für den Text nach der Raute:
=RECHTS(A1;LÄNGE(A1)-FINDEN("#";A1))

Psycho
Mitglied: Paescu
Paescu 14.08.2006 um 15:29:13 Uhr
Goto Top
Danke für deine Antwort. Es funktioniert zwar, aber habe mich ein bisschen unklar ausgedrückt... Ich sollte dies per VBA tun können, nicht direkt mit ner Formel... Makro aufzeichnen bringt nichts...

Pascal
Mitglied: 8644
8644 14.08.2006 um 15:31:13 Uhr
Goto Top
Hi,

ja, das mit dem unklar Ausdrücken ist ein Problem face-wink
Was soll denn am Ende mit den entstandenen Werten passieren?

Psycho
Mitglied: Paescu
Paescu 14.08.2006 um 15:34:23 Uhr
Goto Top
Ich möchte diese Werte in ein Array speichern und danach in einem neuen Dokument einfügen...
Mitglied: 8644
8644 14.08.2006 um 15:47:38 Uhr
Goto Top
Erstmal zur Erklärung: Eine Zeichenkette (String) ist bereits ein Array, welches aus einzelnen Zeichen besteht, welche über ihren Index angesprochen werden können:
Bsp.
Mein_Feld = "Psycho Dad"
Ein_Zeichen = Mein_Feld(3)

Ein_Zeichen ==> "y"

Und nun zu dir: Ich bin mir sicher, dir helfen zu können. Dazu sind dann aber doch genauere Angaben nötig. In welcher (welchen) Zellen stehen die zu analysierenden Daten?
In was für ein Dokument sollen die "Zieldaten" gespeichert werden. Wenn es sich hier auch um eine Excel-Tabelle handelt, geht es auch ohne Makro.
Beschreib dein Vorhaben mal etwas genauer!

Psycho

P.S. Klingt ja ganz schön Oberlehrermäßig -> Sorry 8-)
Mitglied: Paescu
Paescu 14.08.2006 um 16:18:24 Uhr
Goto Top
Aaalso face-wink mein Auftrag etwas genauer: Ich habe eine ziemlich umfangreiche Tabelle von einer Mitarbeiterin bekommen. Diese will nun, dass ich Daten aus vier verschiedenen Registern in ein neu erstelltes Dokument schreibe. Im ersten Register, das bearbeitet werden muss, ist in Zelle A2 die Anzahl (geht um Bestellungen). Nebenan in der Zelle B2 ist dann eine Part-Nummer. Diese besteht aus ein paar Zeichen, einem Raute-Zeichen oder einem Leerschlag und dann wieder ein paar Zeichen, also z.B. so: U5466S#4NK
Nun muss ich alle "vollen" Zellen in diesem Register durchgehen (mit "alle" meine ich alle Zellen in den Spalten A und B) und diese will ich in ein Array speichern. Mit der Anzahl ist das kein Problem, geht super. Jedoch möchte die Mitarbeiterin, dass die Part-Nummer in Spalte B in eine Artikel-Nummer und eine Option-Nummer aufgeteilt wird. Der Teil vor dem Raute-Zeichen soll Artikel-Nummer sein, der Teil danach Option-Nummer. Die Nummern sind immer unterschiedlich lang, kann also nicht immer die gleiche Anzahl stellen bis zum Raute-Zeichen nehmen... Ich möchte dann von jedem Artikel die Artikel-Nummer und die Option-Nummer in das Array speichern. Wenn alles durch ist, muss das nächste benötigte Register angewählt werden und dasselbe Spiel nochmal, einfach in ein anderes Array. Wenn dann alle vier Register durch sind, wird ein neues Dokument erzeugt, wo dann die Anzahl, Artikel-Nummer und Option-Nummer eingetragen wird...

Ui, jetzt habe ich aber genug geschrieben :-P Hoffe jetzt genügend Auskunft gegeben zu haben und wenn nicht, dann einfach nachfrage face-wink

Gruss Pascal

edit: Habe noch vergessen zu sagen, dass das Raute-Zeichen oder der Leerschlag wegfallen kann. face-wink
Mitglied: 8644
8644 14.08.2006 um 19:43:20 Uhr
Goto Top
Hi,

also wenn das so ist, würde ich folgende Variante wählen:

Du benutzt die beiden Formeln und kopierst sie nach unten.
Dann markierst du die Ergebnisse und kopierst sie in die Zwischenablage.
Nun öffnest du das neue Dokument und gehst über das Menü Bearbeiten -> Inhalte einfügen -> Werte.
Das geht meiner Meinung nach am schnellsten.

Psycho
Mitglied: Paescu
Paescu 15.08.2006 um 08:21:02 Uhr
Goto Top
Das wäre natürlich schon ne Variante, aber kann ich dann einfach vom einen zum anderen Dokument wechseln? Denn wenn ich das so mache, muss ich ja nach jedem Register die Daten in das neue Dokument schreiben... Geht das so eifach?

Pascal
Mitglied: 8644
8644 15.08.2006 um 08:27:14 Uhr
Goto Top
Moin,

klar geht das. Du öffnest beide Dokumente und wechselst über das Menü Fenster hin und her.

Psycho
Mitglied: Paescu
Paescu 15.08.2006 um 08:47:07 Uhr
Goto Top
Ich meine alles automatisch... Es soll am Ende eine Arbeitserleichterung für die Mitarbeiterin werden...
Mitglied: 8644
8644 15.08.2006 um 09:00:56 Uhr
Goto Top
Moin,

theoretisch geht alles! Aber was du jetzt möchtest, geht schon weit über das hinaus, was ich unter einen Tipp im Forum geben verstehe! Sollte ich etwas Zeit und meine soziale Ader finden, lässt sich da vielleicht was machen.

Psycho
Mitglied: Paescu
Paescu 15.08.2006 um 09:23:09 Uhr
Goto Top
Nun, da kann man nichts machen face-wink
Möchte mich ausserdem noch bedanken, dass du mir diese Tipps überhaupt gegeben hast.

Des Weiteren komme ich der Lösung immer näher, hoffe, ich habe es bald einmal... face-wink

Pascal
Mitglied: Paescu
Paescu 21.08.2006 um 10:32:47 Uhr
Goto Top
So, habe es geschafft, dass es getrennt wird, nun muss ich das nur noch automatisieren und alles in ein Array und nicht in ne Zelle schreiben...

Meine Lösung sieht so aus:
  Do Until Cells(1, 1).Characters(i, 1).Text = "#"  
    Cells(2, 1) = CStr(Cells(2, 1)) + Cells(1, 1).Characters(i, 1).Text
    i = i + 1
    links = links + 1
  Loop
  
  For links = links To Cells(1, 1).Characters.Count
    Cells(3, 1) = CStr(Cells(3, 1)) + Cells(1, 1).Characters(links, 1).Text
  Next

Hat vielleicht jemand noch Verbessernungsvorschläge oder so etwas?
Mitglied: Biber
Biber 21.08.2006 um 12:09:21 Uhr
Goto Top
Moin Päscu,
VB ist ja nicht gerade mein Fachgebiet,...
Aber ein erstes Zusammendampfen Deines Ansatzes ergibt diesen Basis-Schnipsel:
Sub SubstringGeraffel()
Const ROWMAX = 5000
Dim i, nRow As Long

For nRow = 1 To ROWMAX
  i = InStr(1, Cells(nRow, 1), "#")  
  If i > 0 Then
     Cells(nRow, 2) = Mid(Cells(nRow, 1), 1, i - 1)
     Cells(nRow, 3) = Mid(Cells(nRow, 1), i + 1)
   End If
Next
End Sub

Wenn also in der ersten Spalte diese Strings a la "U5466S#4NK" stehen, werden in die zwei Spalten rechts daneben "U5466S" und "4NK" geschrieben.
Und zwar ROWMAX = 5000x.

Hope that Helps
Biber
Mitglied: Paescu
Paescu 23.08.2006 um 09:05:41 Uhr
Goto Top
face-smile danke, auch nicht n schlechter Ansatz... *-) Es funktioniert nun mit meinem Ansatz auch, aber irgendwie finde ich, deiner sieht besser aus und ist eigentlich auch nich so kompliziert... mal schauen, was ich noch machen werde.

Pascal
Mitglied: miniversum
miniversum 24.08.2006 um 13:30:47 Uhr
Goto Top
Nur als Tip:
Schau dir mal in der Hilfe von vba die Split-Funktion an. Ist das das was Du suchst?

miniversum
Mitglied: Paescu
Paescu 28.08.2006 um 10:04:14 Uhr
Goto Top
@miniversum

Funktioniert die Split-Funktion auch mit zweidimensionalen Arrays? Habe nur was mit eindimensionalen Arrays gefunden in der Hilfe...

Pascal
Mitglied: miniversum
miniversum 28.08.2006 um 19:30:37 Uhr
Goto Top
Die Split Funktion liefert die doch die zwei Zeichenfolgen in Variablen. Wo die dann "hingeschoben" werden ist ja egal.

miniversum
Mitglied: Paescu
Paescu 28.08.2006 um 19:40:02 Uhr
Goto Top
Hmm... *-) hat was, dann muss ich einfach noch diese Variabeln dem Array zuweisen... So weit habe ich gar noch nicht gedacht... Habe meine alte, 15-zeilige Version beibehalten face-wink
Ich habe einfach probiert, diese zwei Strings direkt in das zweidimensionale Array zu speichern, aber mit der Split-Funktion ist da nichts zu machen... Werde es mit Variabeln probieren, morgen dann face-wink
Danke noch für den Tipp

Pascal