Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1540to1544
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
Inhaltsverzeichnis

Wort finden und mit nachfolgendem Wort kopieren

Wort finden und mit nachfolgendem Wort kopieren
17.02.2017 20:59:01
Kirk

Hallo und schon im voraus Danke für Eure Hilfe.
Es geht um eine Such-Funktion, die in einem langen Text mit vielen Bezugszeichen nach diesen Bezugszeichen sucht und mir das Wort davor kopiert. Den Text könnte ich z.B. in 1 Zelle kopieren, hier wäre ich aber offen (auch txt oder Word-Datei könnte ich machen. Im Text steht z.B.
"Wie Figur 1 zu entnehmen ist, weist die Vorrichtung eine Kurbel 10 und ein Pleuel 11 und eine oder mehrere Sperrklinken 4 auf ... Die Sperrklinke 4 ..."
Nun möchte ich eine Liste aller Bezugszeichen erhalten z.B.
4 Sperrklinken
4 Sperrklinke
10 Kurbel
11 Pleuel
Ich würde also einfache eine Schleife basteln, in der ich von 1 bis 9999 alle Bezugszeichen ab fragt... Ist das Bezugszeichen 1 im Text? JA, Dann kopiere es mit dem nachfolgenden Wort, ist es sonst noch wo... NEIN, dann nächstes Bezugszeichen...
Mir ist bewusst, dass ich aus den Zeichen "Wie Figur 1 zu entnehmen ..." dann in meiner Liste auch ein
1 Figur

erhalte. Aber das wäre nicht so schlimm.
1000 DANK, Kirk

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
17.02.2017 22:06:33
littletramp
Hallo Kirk
Hier ein Ansatz wie es gehen kann.
Füge den Text in Zelle A1 ein und führe folgenden Code aus:
Sub Demo()
Dim Woerter() As String
Dim i As Long, Anz As Long, r As Long
r = 3   ' Startzeile für Ausgabe
Woerter = Split(Range("A1").Text, " ")
Anz = UBound(Woerter)
For i = 2 To Anz
If IsNumeric(Woerter(i)) Then
Cells(r, 1).Value = Woerter(i)
Cells(r, 2).Value = Woerter(i - 1)
r = r + 1
End If
Next
End Sub
Gruss Markus
AW: Wort finden und mit nachfolgendem Wort kopieren
17.02.2017 22:09:47
littletramp
Ups, noch eine kleine Korrektur. Es müsste wie folgt heissen:
    For i = 1 To Anz

Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 10:33:32
Kirk
VIELEN DANK... SUPER!!!
Damit kann ich gut starten und meine Erfahrungen sammeln. Werde anschließend noch ein wenig sortieren, und unnützes Rauslöschen... Habe noch Zweifel, ob 1 Zelle auch für längere Texte funktioniert, aber dann würde ich mich nochmals melden.
ALSO 1000 DANK und herzliche Grüße,
Christoph
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 12:51:59
littletramp
Hallo Kirk
In einer Zelle kannst du max. 32'767 Zeichen haben.
Du hast ja geschrieben, dass der Text auch in einer Textdatei sein könnte. Wenn dein Text mehr Zeichen hat / haben könnte, so würde ich dir raten diesen aus einer Textdatei in eine Variable einzulesen.
Also bei meinem Code die Zeile

Woerter = Split(Range("A1").Text, " ")
mit der Einleseroutine des Texts aus der Datei in die Variable zu ersetzen.
Gruss Markus
Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 15:35:28
Kirk
Hallo Markus,
vielen DANK! Es funktioniert... schon fast. Am Ende der Zeile steht in meinen Texten immer einen Zeilenumbruch ohne Leerzeichen. Somit "Splittet" dein CODE noch nicht ganz richtig und zieht quasi das letzte Wort einer Zeile mit dem nächsten der nächsten Zeile zusammen. Hast Du hier noch einen Tipp?
Und zu deinem TXT-Einleseroutine... Klingt suoer... Nur wie :-) Sorry, habe keine genaue Vorstellung was Du meinst.
LG und nochmals DANKE!!!!
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 15:52:57
Kirk
Nachtrag... Oder könnte ich den TEXT nicht evtl. direkt aus der Zwischenablage in die Variable Woerter eintragen? Das wäre für mich am besten... Also bevor ich den CODE starte habe ich ihn in einem anderen Programm in die Zwischenablage kopiert. Und der CODE liest es von dort??? Das wäre genial, wobei mich der TXT Weg auch interessieren würde.
Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 16:12:39
littletramp
Hallo Kirk
Betreff Zeilenumbruch: Lösung Zeilenumbruchzeichen durch Leezeichen ersetzen.
Betreff Zwischenablage: Direkt aus Zwischenablage einlesen geht.
Ich mache dir den Code mit Textdatei und Zwischenablage, komme aber erst später dazu, da ich für einen Kunden noch ein Projekt fertigstellen muss, dass ich für heute versprochen habe.
Gruss Markus
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 16:28:25
Kirk
Mei Wahnsinn... Vielen vielen herzlichen DANK!!!!!!! Bin gespannt...
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 16:53:34
Kirk
Hallo, eine Frage noch... Wieviele Wörter kann die Variable Woerter eigentlich aufnehmen. Beim testen habe ich das Gefühl, dass ab einer bestimmten Textgröße ein Teil des Textes nicht mehr in die Variable geschrieben werden... Aber ich teste weiter, vielleicht liegt es an etwas anderem... DANKE
Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
20.02.2017 17:02:41
littletramp
Hallo Kirk
Erzeuge mir eine Textdatei mit dem grösstmöglichen Text und lade diese hier hoch, oder wenn es sensible Daten sind kannst du sie mir auch gleich direkt mailen (markus.schmid at maschmid punkt ch).
Dann kann ich es gleich mit Echtdaten testen.
Gruss Markus
AW: Wort finden und mit nachfolgendem Wort kopieren
21.02.2017 10:17:21
Kirk
Hallo Markus,
Lag wohl nicht an der Variablen, sondern an der Zelle A1. Die war auf STANDARD eingestellt und hat einen Teil des Textes einfach weggelöscht. Wenn man Sie als TEXT formatiert und im CODE statt .text. value eingegibt, klappt es schon ganz gut.
Aber mit dem TXT-Datei oder noch besser Zwischenablagen-Einlesen dürfte dies ja eh irrelevant werden. Da ich Deinen CODE schon in mein Tool eingebaut und angepasst habe, wäre mir ein Tipp mit den wichtigsten Befehlen lieber. In meinem Tool sucht er schon doppelte Einträge raus, Sortiert die Bezugszeichen und findet auch Bezugszeichen die z.B."7a" lauten (mit isnumeric(left(..., 1)) ...) usw.. Also Danke vielmals fürs Angebot, weiß es zu schätzen, aber mit Daten schicken ist eher schwierig... Ich hoffe Du verstehst das... nicht böse gemeint. LG Christoph
Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
21.02.2017 10:31:48
littletramp
Hallo Kirk
Hier trotzdem noch meine Lösung. Vielleicht gibt sie dir noch Ideen zur Verbesserungen deines Codes.
Der Text kann max. 2^31-1 = 2'147'483'647 Zeichen enthalten.
Die Grenze für das Array sind ebenfalls 2^31-1 Elemente je Dimension, d.h., man könnte jedes Zeichen eines Strings in ein Element einer Dimension des Arrays einlesen.
Ich habe mit einer Datei mit 65'000 Verweiseinträgen getestet (Dauer ca. 6 Sekunden).
Ich habe dir das Projekt hochgeladen https://www.herber.de/bbs/user/111623.xlsm
In folgendem Bereich kannst du Anpassungen vornehmen:
    '----- Gewünschte Quelle aktivieren -----   (ev. anpassen!)
Const cQuelle = 1   ' 1: Zelle, 2: Textdatei, 3: Clipboard
Const cEingabezelle = "B1"  ' Eingabezelle  (ev. anpassen!)
strDatei = ThisWorkbook.Path & "\text.txt" '(ev. anpassen!)
' Ausgabeposition festlegen
Const c = 1     ' Ausgabespalte festlegen  (ev. anpassen!)
r = 3           ' Startzeile für Ausgabe   (ev. anpassen!)
Hier der Code:
Option Explicit
'   Markus Schmid   -   Homepage: www.maschmid.ch
' Verweis auf "Microsoft Forms 2.0 Object Library"
' erforderlich -> Menü Extras | Verweise...
Public Sub ErzeugeVerweisliste()
Dim strDatei As String
Dim strWoerter() As String, strText As String
Dim i As Long, r As Long, lngAnz As Long
'----- Gewünschte Quelle aktivieren -----   (ev. anpassen!)
Const cQuelle = 1   ' 1: Zelle, 2: Textdatei, 3: Clipboard
Const cEingabezelle = "B1"  ' Eingabezelle  (ev. anpassen!)
strDatei = ThisWorkbook.Path & "\text.txt" '(ev. anpassen!)
' Ausgabeposition festlegen
Const c = 1     ' Ausgabespalte festlegen  (ev. anpassen!)
r = 3           ' Startzeile für Ausgabe   (ev. anpassen!)
On Error GoTo ErrHandler
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.Cursor = xlWait
End With
' Alte Werte löschen
Range(Cells(r, c), Cells(Rows.Count, c + 1)).Clear
' Text aus Einlesequelle lesen
Select Case cQuelle
Case 1      ' Quelle: Zellinhalt
strText = Range(cEingabezelle).Text
Case 2      ' Quelle: Textdatei
strText = ReadFromTextfile(strDatei)
Case 3      ' Quelle: Zwischenspeicher
strText = ReadFromClipboard
Case Else
Err.Raise vbObjectError + 100, _
"ErzeugeVerweisliste", "Einlesequelle existiert nicht!!"
End Select
' Zeilenumbrüche und Tabulatoren ersetzen
strText = Replace(strText, vbLf, " ")
strText = Replace(strText, vbCrLf, " ")
strText = Replace(strText, vbCr, " ")
strText = Replace(strText, vbTab, " ")
' Leerzeichenserien entfernen (Bsp.: "     " -> " ")
Do
lngAnz = Len(strText)
strText = Replace(strText, "  ", " ")
Loop While lngAnz <> Len(strText)
strWoerter = Split(strText, " ")
lngAnz = UBound(strWoerter)
' Ergebnisliste ausgeben
For i = 1 To lngAnz
If IsNumeric(strWoerter(i)) Then
Cells(r, c).Value = strWoerter(i)
Cells(r, c + 1).Value = strWoerter(i - 1)
r = r + 1
End If
Next
ErrExit:    ' ab hier weiter nach Fehlerbehandlung
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.Cursor = xlDefault
End With
Exit Sub
ErrHandler:     ' Fehlerbehandlung
Select Case Err.Number
Case vbObjectError To vbObjectError + 65535
MsgBox "Ups, da ist etwas schief gelaufen!" & vbLf & vbLf _
& "Prozedur: " & Err.Source & vbLf _
& Err.Description
Case Else
MsgBox "Ups, da ist etwas schief gelaufen!" & vbLf & vbLf _
& "Fehler-Nr: " & Err.Number & vbLf _
& Err.Description
End Select
Resume ErrExit
End Sub
' Liest Text aus Textdatei und gibt diesen zurück
Private Function ReadFromTextfile(DateiPfadName As String) As String
Dim strZeile As String
Dim strText As String
Dim f As Long
If Len(Dir(DateiPfadName)) Then
f = FreeFile
Open DateiPfadName For Input As #f
Do Until EOF(1)
Line Input #f, strZeile
strText = strText & strZeile
Loop
Close #f
ReadFromTextfile = strText
Else
' Fehler erzeugen, wenn Textdatei nicht existiert
Err.Raise vbObjectError + 101, _
"ReadFromTextfile", _
"Die Datei existiert nicht!"
End If
End Function
' Liest Text aus Zwischenablage + gibt diesen zurück
' Verweis auf "Microsoft Forms 2.0 Object Library"
' erforderlich -> Menü Extras | Verweise...
Private Function ReadFromClipboard() As String
Dim objData As New DataObject
' Zwischenablage auslesen
objData.GetFromClipboard
' Fehlerbehandlung ausschalten, da Fehler
' falls Zwischenablage keinen Text enthält
On Error Resume Next
ReadFromClipboard = objData.GetText
Set objData = Nothing
' Fehler erzeugen, wenn kein Text in Zwischenablage
If Err.Number <> 0 Then
On Error GoTo 0     '
Err.Raise vbObjectError + 102, _
"ReadFromClipboard", _
"Die Zwischenablage enthält keinen Text!"
End If
End Function
Gruss Markus
Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
21.02.2017 10:49:52
Kirk
STARK!!! Bin baff... Herzlichen Dank... werde es integrieren und testen und Dir dann Feedback geben. Schon jetzt HERZLICHEN DANK für Deine Hilfe... Großartig :-)
Schöne Grüße, Kirk
AW: Wort finden und mit nachfolgendem Wort kopieren
21.02.2017 14:32:05
Kirk
Hallo Markus,
habe es übertragen und in meinen CODE reingebastelt... Großartig... Ich musste nur an 2 Stellen GrößerzeichenKleinerzeichen eintragen, da er die Zeilen rot eingefäbrt hat... Z.B. hattest Du
if err.number 0 then...
Das mochte er nicht... Mit
if err.number UNGLEICH (Mist der schreibt die Zeichen in diesem Editor einfach nicht... sorry) 0 then... hat es funktioniert.
Ich werde noch etwas weiter testen, aber bisher... GENIAL!
Vielen lieben DANK !!! Melde mich in ein paar Tagen um endgültiges FEEDBACK zu geben und dann virtuelle Blumen zu verschicken!
LG Kirk
Anzeige
AW: Wort finden und mit nachfolgendem Wort kopieren
21.02.2017 14:43:19
littletramp
Hallo Kirk
Sowohl in meinem geposteten Code, als auch im hochgeladenen Projekt, sind die <> Zeichen da.
Da muss bei dir beim Kopieren/Einfügen etwas fehlgelaufen sein.
Gruss Markus
Das könntest du auch mit Fmln realisieren, ...
18.02.2017 01:38:37
Luc:-?
…Kirk,
die sog UDFs (eigenpgmmierte Fktt) enthalten. Da könnte ich dir 2 Varianten vorschlagen:
Var1: plurale MatrixFml → Vorteil: kürzer und ermittelt alle Werte auf 1× → Nachteil: einzelne Werte können erst dann gelöscht wdn, wenn alle Ergebnisse kopiert und als Werte eingefügt, also die Fml entweder vernichtet oder für die Kopie neue Spalten benutzt wurden.
A5:A9: {=MTRANS(VSplit(MaskOn(A1;"num";""))&" "&INDEX(VSplit(A1);VERGLEICH(VSplit(MaskOn(A1;"num";""));VSplit(A1);0)-1))}
Var2: singulare MatrixFml → Vorteil: einzelne Werte können jederzeit gelöscht wdn, ohne dass die Werte woanders hin kopiert oder die Fmln überschrieben wdn müssen → Nachteil: länger und führt dieselbe Berechnung mehrfach durch.
A5[:A9]: {=INDEX(VSplit(MaskOn(A$1;"num";""))&" "&VSplit(PickOn(A$1;VERGLEICH(VSplit(MaskOn(A$1;"num";""));VSplit(A$1);0)-1));ZEILE(A1))}
Beide Varianten haben allerdings den kleinen Nachteil, dass nicht nur Nicht-Benötigtes wie Figur 1 aufgeführt wird, sondern sich Mehrfach­Nennungen einer Zahl immer auf deren 1.Auftreten beziehen. Wollte man das ändern, würde die Fml komplizierter wdn!
Archiv-Links zu den verwendeten UDFs:
MaskOn: https://www.herber.de/cgi-bin/callthread.pl?index=1344962#1345181
PickOn: https://www.herber.de/forum/archiv/1140to1144/1141994_Teilstring_aus_String_entfernen.html#1142025 (Folgebeiträge m.Korrekturen beachten!)
VSplit: https://www.herber.de/bbs/user/99024.xlsm (hochgeladene BspDatei mit UDFs)
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Das könntest du auch mit Fmln realisieren, ...
20.02.2017 15:44:15
Kirk
Hallo, ich finde immer den Knopf zum Antworten nicht. Daher erst so spät. Danke für Deinen Ansatz, aber ich möchte es mit VBA machen, da ich dann mehr Möglichkeiten der Weiterentwicklung habe.
DANKE trotzdem... Kirk
Tja, dann mach mal, ...
20.02.2017 16:20:52
Luc:-?
…Kirk!
Aber du kannst es ja nicht, sonst hättest du nicht fragen müssen! ;->
Meine UDFs sind auch in SubProzeduren einsetzbar; man muss also das Fahrrad nicht neu erfinden!
Oder wie Daniel gern vorschlägt, die Fml per SubProzedur in Zellen eintragen und dann die Fmln mit ihren Ergebnissen überschreiben.
Aber wer weiß, welche und wieviel „Möglichkeiten der Weiterentwicklung“ du wirklich brauchst und ob du das dann selber schaffst oder wieder fragen musst… :-]
Luc :-?

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige