Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1676to1680
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

Texte mit Variablen

Texte mit Variablen
20.02.2019 10:04:08
Torsten

Hallo,
ich möchte jetzt VBA lernen und habe für folgendes Problem keinen Ansatz.
Es wäre toll wenn mir bei meinem Problem jemand mit seiner Erfahrung helfen könnte.
Ich möchte aus einer Text.csv Datei einen kompletten Absatz in meine Excel-Arbeitsmappe einlesen, nach Tabellenblatt1, Zelle A1.
z.B. Peter startet dieses Jahr für das Basketballteam seiner Schule. Er hat sich auf die kommenden Wettkämpfe sehr gut vorbereitet und seine Sprungkraft verbessert.
Der eingelesene Absatz enthält demnach nun eine Namensvariable (Peter), und eine Fähigkeitsvariable (Sprungkraft).
(Var.Name) startet dieses Jahr für das Basketballteam seiner Schule. Er hat sich auf die kommenden Wettkämpfe sehr gut vorbereitet und seine (Var.Fähigkeit) verbessert.
Im Tabellenblatt2 der gleichen Mappe habe ich in Spalte A bereits mehrere vorgegebene Texte eingetragen, so auch:
„startet dieses Jahr für das Basketballteam seiner Schule. (Tabellenblatt2, Zelle A1)
„Er hat sich auf die kommenden Wettkämpfe sehr gut vorbereitet und seine“ & „verbessert.“ (Tabellenblatt2, Zelle A2)
Im Tabellenblatt2 der gleichen Mappe habe ich in Spalte B bereits mehrere Namen eingetragen, welche dann der Namensvariablen zugeordnet werden sollen.
Peter (Tabellenblatt2, Zelle B1)
Otto (Tabellenblatt2, Zelle B2)
Anton (Tabellenblatt2, Zelle B3)
Im Tabellenblatt2 der gleichen Mappe habe ich in Spalte C bereits mehrere Fähigkeiten eingetragen, welche dann der Fähigkeitsvariablen zugeordnet werden sollen.
Sprungkraft (Tabellenblatt2, Zelle C1)
Schnelligkeit (Tabellenblatt2, Zelle C2)
Antritt (Tabellenblatt2, Zelle C3)
Jetzt soll mittels Makro verglichen werden, ob
1. Die Texte (Var.Name) startet dieses Jahr für das Basketballteam seiner Schule & Er hat sich auf die kommenden Wettkämpfe sehr gut vorbereitet und seine (Var.Fähigkeit) verbessert. ohne Variablen identisch sind, sonst weiter in nächster Zeile und wieder prüfen, etc.
2. Wenn ja, die Variablen zuordnen und eine MsgBox ausgeben „Peter steigert Sprungkraft“
3. Wenn nein, MsgBox ausgeben „Keine Übereinstimmung“
Danach soll die Prozedur wiederholt werden falls in der csv. Datei ein weiterer Text vorhanden ist.
Ist das so verständlich?
Mir fehlt da leider ein passender Lösungsansatz.
Ich habe bereits etwas herumprobiert und kann zwei Strings vergleichen, aber die Variablen im Text machen mir zu schaffen.
Sub Vergleich()
Dim Ausgangstext As String
Dim Vergleichstext As String
Ausgangstext = UCase(Range("A1").Value)
Vergleichstext = UCase(Range("B1").Value)
If InStr(1, Ausgangstext, Vergleichstext) Then
MsgBox "ok"
Else
MsgBox "nicht ok"
End If
End Sub
Hat da jemand einen verständlichen Lösungsansatz oder hat schol ein ähnliches Problem behandelt?

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Texte mit Variablen
20.02.2019 10:35:21
Zwenn
Hallo Torsten,
ich machs mal knapp:
  • Du hast keine CSV-Datei vorliegen, sondern eine unstrukturierte Textdatei

  • Wenn Du in Tabelle 2 schon den Text einträgst, der in dieser Datei steht, was willst Du dann mit der Datei?

  • Peter und Sprungkraft sind keine Variablen, sondern Bestandteile des Textes. Das was Du mit dem Makro zusammensetzen willst, ist also schon in der Textdatei vorhanden

  • Wenn es Dir darum geht die genannten Schlüsselworte im Text zu erkennen und darauf zu reagieren, nennt sich das Parsen. Du willst also einen Text-Parser bauen

  • Eine Entscheidungsstruktur (If ... Then ... Else ... End If) wertet den Ausdruck nach If zu einem Wahrheitswert vom Typ Boolean aus. Dabei werden Zahlenwerte wie folgt interpretiert: 0 = True, alles andere = false. Wenn die Funktion InStr() in Deiner Zeile If InStr(1, Ausgangstext, Vergleichstext) Then also nichts findet, liefert sie True, was aber genau das Gegenteil von dem ist, was Du willst. Du könntest also Not davor schreiben, um eine negative Logik daraus zu machen. Aber um es leserlicher zu machen, mach einen Vergleich daraus. Die Funktion InStr() liefert die Position des ersten Zeichens des Vergleichstextes im zu durchsuchenden String. Ist diese größer 0, wurde der Suchstring gefunden: If InStr(1, Ausgangstext, Vergleichstext) > 0 Then

  • Ansonsten weiß ich ehrlich gesagt nicht, was Du mit diesem Kostrukt vor hast. Wenn Du Programmieren lernen willst, dann rate ich Dir mit den Grundlagen anzufangen. Lerne erstmal den Umgang mit Datentypen, Kontrollstrukturen (Sequenz, Entscheidung, Schleife), usw. Das kannst Du mit VBA genauso gut machen, wie mit jeder anderen Sprache. Mit Dateioperationen und anderem weiterführendem Zeugs anzufangen, finde ich nicht sehr zielführend.
    Viele Grüße,
    Zwenn
    Anzeige
    AW: Texte mit Variablen
    20.02.2019 11:37:20
    Zwenn
    Hallo nochmal,
    vergiss, was ich zu 0 = True und alles andere = False ausgeführt habe. Es ist genau andersrum. 0 = False, alles andere = True.
    Gruß,
    Zwenn
    AW: Texte mit Variablen
    20.02.2019 11:50:03
    Torsten
    Hallo Zwenn,
    Ich habe schon befürchtet, dass es kompliziert ist mein Vorhaben zu verstehen, ich kann es nur leider nicht besser erklären.
    Ich möchte im Endeffekt nur eine Tabelle erzeugen, wo in Spalte A mehre Namen untereinander stehen. In der obersten Zeile neben den Namen sollen die Fähigkeiten Aufgelistet sein.
    Namen Sprungkraft Schnelligkeit Antritt
    Peter
    Otto
    Anton
    Jetzt ist die Ausgangsbasis ein veränderbarer Text den ich später aus einer CSV bekomme.
    Wie das Einlesen funktioniert weiß ich.
    In dem Text steht jetzt z.B.
    Peter startet dieses Jahr für das Basketballteam seiner Schule. Er hat sich auf die kommenden Wettkämpfe sehr gut vorbereitet und seine Sprungkraft verbessert.
    Ich weiß also, das Peter seine Sprungkraft verbessert hat, die Matrix meiner Tabelle soll dann in der entsprechenden Zelle eine 1 schreiben, in allen anderen Zellen soll nichts eingetragen werden.
    Ich habe mir daher überlegt, dass ich den Ausgangstext mit einem von mir vorgegeben Text vergleichen muss um zu gucken ob etwas passieren soll oder nicht. Jetzt einfach zu gucken ob der Text "Peter" und "Sprungkraft" enthält ist aber für mich nicht Zielführend, es kann später auch einen Text geben ala Peter hat alle seine Fähigkeiten verbessert.
    Ich wollte nun vordefinierte Texte erstellen, die sich dann auf die Matrix auswirken.
    z.B.
    Wenn vordefinierter Text hat alle seine Fähigkeiten verbessert = eingelesenem Text, dann schreibe in jede Zeller der Matrix eine 1. Wie das vergleichen von Texten funktioniert weiß ich und ich kann auch die Zelle ansprechen und den Wert eintragen.
    Aber, wie Du schon richtig geschrieben hast, muss ich vorher die Parsen finden, rauslöschen, später wieder zuordnen, etc. damit die zu vergleichenen Texte auch 100%&ig gleich sind und klein Fehler auftritt.
    Ich weiß nur leider nicht wie man das macht und habe bei meiner Recherche nichts passendes gefunden. Oder ich habs gefunden, verstehe es aber nicht und sehe daher den Lösungsweg nicht.
    Ich müßte wohl gucken ob ein Name aus meiner Liste im Text vorhanden ist, wenn ja den Namen löschen und dann den Text vergleichen. Aber wie soll sowas mit den Fähigkeiten gehen wenn keine Fähigkeit namentlich erwähnt oder beschrieben wurde?
    z.B. bei dem Satz Peter kann schneller laufen als Otto.
    Da hätte ich schon 2 Prasen (Peter und Otto) und keine Prase bzgl. der Fähigkeit die ich finden kann.
    Danke nochmal für Deinen Tip mit leichteren Sachen anzufangen. Ich habe mir auch schon etwas Lektüre zugelegt und arbeite daran das zu verstehen. Allerdings brauch ich müf mein aktuellen Projekt nun so einen Texterkennungs- und Zuordnungscode. Darauf bauen dann weitere Sachen auf für die ich wieder mein Buch nehmen kann. Ich brauch also erstmal die Daten damit ich lernen kann damit zu zaubern :)
    Anzeige
    AW: Texte mit Variablen
    20.02.2019 12:24:04
    Zwenn
    Hallo Torsten,
    Du hast das Kernproblem Deines Vorhabens bereits erkannt und beschrieben. Die zu analysierenden Texte sind Freitexte und können deshalb informationen Enthalten, die Du nie im Leben alle "fest verdrahten" kannst, weil es unendlich viele Möglichkeiten gibt.
    Das was Du willst nennt sich Natural Language Processing (NLP). Einfach mal googeln. Da geht es in den Bereich Mashine Learning. Dafür ist VBA absolut ungeeignet. Wenn Du darauf hinaus willst, dann wäre Python für Dich wahrscheinlich wesentlich besser geeignet. Für Python gibt es mächtige Bibliotheken für Mashine Learning und Datenanalysen.
    Insgesamt kommst Du aber trotzdem nicht umhin, Dich erstmal mit den Grundlagen der Programmierung zu beschäftigen. Diese sind sprachunabhängig.
    Du kannst jetzt natürlich trotzdem erstmal mit Deinem "kleinen" Projekt anfangen. Aber dann geht das nur mit einer Art Look-Up-Table. Alle Ergebnisse müssen mehr oder weniger schon vorliegen. Bei Paarungen kann man sicher auch etwas Dynamik einbauen, wenn man z.B. Gruppen bildet, wie Du sie mit Namen und Fähigkeiten schon definiert hast. Das sind aber alles keine Grundlagen mehr, sondern das sind Datenstrukturen für Fortgeschrittene. Hat dieses Projekt denn eine wichtige praktische Anwendung oder hast Du die Problemstellung ausgewählt, um "einfach mal mit etwas anzufangen"?
    Gruß,
    Zwenn
    Anzeige
    AW: Texte mit Variablen
    20.02.2019 12:52:16
    Torsten
    Hallo Zwenn,
    ein kleines Projekt was ich rein für mich mache, das wird die Welt nicht verändern.
    Ich bin kein Programmierer sondern habe einfach nur Interesse einige Sachen zu Automatisieren.
    Ich habe jetzt nicht geplant, dass das so aufwendig ist. Es ist eher dem Zufall entsprungen.
    Ich werde mir jetzt erstmal so helfen
    Sub Vergleich()
    ThisWorkbook.Worksheets("Tabelle1").Activate
    Dim Ausgangstext As String
    Dim Vergleichstext As String
    Ausgangstext = UCase(Range("A1").Value) 'Hier steht der Text welcher aus der CSV importiert  _
    wird
    Vergleichstext = UCase(Range("B1").Value) & UCase(Range("B2").Value) 'Hier stehen 2  _
    Textbausteine
    If InStr(1, Ausgangstext, Vergleichstext) Then
    MsgBox "gleich"
    Else
    MsgBox "nicht gleich"
    End If
    End Sub
    
    Ich werde also erstmal von Hand die Ausgangstexte analysieren und als Vergleichstexte splitten müssen.
    Den gesplitteten Vergleichstexten werde ich dann die Fähigkeiten konstant zuordnen.
    Dann lass ich eine Schleife laufen um die richtige Zuordnung zu finden.
    Danach werde ich gucken welcher Name aus einer Liste in dem Ausgangstext vorhanden ist.
    Wenn ich den richtigen Namen und den richtigen Vergleichstext habe, kann ich den Wert in die Matrix eintragen.
    Dann kommt der nächste Text.
    Danke Zwenn
    Anzeige
    AW: Texte mit Variablen
    20.02.2019 13:31:21
    Zwenn
    Ok,
    Du solltest Dir direkt angewöhnen mit Einrückungen zu arbeiten. Mit denen wird das Auge geführt, indem immer die Blöcke eingerückt werden, die von der steuernden Struktur umgeben werden. Bei längerem Quelltext findest Du bald sonst nur noch schwer etwas wieder.
    Variablen immer ganz am Anfang deklarieren, erst danach kommt ausführender Code. Wobei Du Dir das aktivieren der Tabelle sparen kannst, wenn Du sie in den Zeilen, in denen sie gebraucht wird direkt ansprichst. Dazu habe ich die Variable tabName eingeführt. Sollte sich der Wert einer solchen Angabe mal ändern, brauchst Du ihn nur an einer einzigen Stelle im Quellcode zu ändern, statt alles durchzugehen.
    Du solltest Dich auch direkt an Konventionen zur Namensgebung eigener Bezeichner halten. Ich habe Dir einfach meine Vorgehensweise übergestülpt ;-) Ich mache den ersten Buchstaben einer Variablen immer klein und jedes zusammengesetzte Hauptwort am Anfang groß. Deshalb nicht Tabname, sondern tabName. Ich habe deine beiden Variablen entsprechend angepasst.
    Meine Konvention ist willkürlich und absolut nicht bindend. Ich wollte damit nur zeigen, dass es sinnvoll ist ein Schreibschema zu verwenden. So schreibe ich den ersten Buchstaben für Prozeduren (Sub() und Function()) immer große. Konstanten könnte man nur mit Großbuchstaben schreiben. Das dient alles der Lesbarkeit des Quellcodes.
    Auch wenn mir nicht klar ist, wozu Du zwei Zeichenketten miteinander verbindest, schließe ich aus der Anordnung der Quellen B2 und B3, dass sie untereinander stehen. Ist das wirklich sinnvoll? Im Moment sind die Werte noch fest an diese beiden Zellen gebunden. Aber Du wirst ja später eine Schleife drumlegen wollen. Dann musst Du statt mit B2 und B3 mit Variablen arbeiten. Dafür muss die Struktur der Tabelle so aufgebaut sein, dass die Variablen möglichst einfach durch die Werte gehen können.
    Hier ist Dein Quelcode, wie ich ihn an dieser Stelle schreiben würde:
    
    Sub Vergleich()
    Dim tabName As String
    Dim ausgangsText As String
    Dim vergleichsText As String
    'Tabelle, in der gearbeitet wird
    '(die muss nicht im Vordergrund sein)
    tabName = "Tabelle1"
    'In dieser Tabelle
    '(Im With-Block wird der Teil hinter With
    'immer vor dem ersten Punkt einer Objekt-Kette
    'eingesetzt. Also z.B: .Range("A1").Value
    'statt: Sheets(tabName).Range("A1").Value
    'So kann man Zeilen verkürzen und weniger
    'schreiben, wenn man will)
    With Sheets(tabName)
    'Text der aus der CSV importiert wird
    ausgangsText = UCase(.Range("A1").Value)
    '2 Textbausteine
    vergleichsText = UCase(.Range("B1").Value) & UCase(.Range("B2").Value)
    End With
    If InStr(1, ausgangsText, vergleichsText) > 0 Then
    MsgBox "gleich"
    Else
    MsgBox "nicht gleich"
    End If
    End Sub
    

    Viele Grüße,
    Zwenn
    Anzeige
    AW: Texte mit Variablen
    20.02.2019 14:08:03
    Torsten
    Hallo Zwenn,
    Danke für die Hinweise.
    Das mit den verbundenen Zeichenketten in B2 und B3 war nur ein Test um zu gucken ob das so funktioniert. Ich werde alle Vergleichstexte in eine Spalte und fortlaufende Zeilen untereinander schreiben, jeweils als kompletten Absatz - es wird also kein & mehr geben.
    Ich wollte meine Vergleichstexte eigentlich in ein Array packen, ich habe dafür bereits ein Beispiel für ein dynamisches Array gefunden.
    Sub Zuweisen()
    Dim vergleichsTexte()
    Dim size As Integer 'Größe des Arrays
    Dim i As Integer 'Laufvariable
    size = WorksheetFunction.CountA(Worksheets(1).Columns(1)) 'Größe zuweisen
    ReDim vergleichsTexte(size) 'Die Größe des Arrays anpassen
    For i = 1 To size
    vergleichsTexte(i) = Cells(i,1).Value
    Next i
    End Sub
    
    Wenn ich gelernt hab wie ich das dynamische Array im eine Dimension erweitern kann, werde ich so auch gleich die Fähigkeit zuweisen.
    Anzeige
    AW: Texte mit Variablen
    21.02.2019 13:48:50
    Torsten
    Hallo nochmal,
    ich habe jetzt ein Makro gebastelt mit dem ich zumindest schonmal einen beliebigen Texte, welche in Spalte A in mehreren Zeilen untereinander stehen, mit meinen diversen Vorgabetexten in Spalte B, ebenfalls in diversen Zeilen untereinander stehen, vergleichen kann. In Spalte C wird dann passend kurz angegeben ob ein Text gefunden wurde oder nicht. Ist jetzt sicherlich noch nicht ganz elegant gelöst, aber für den Anfang bin ich ganz stolz auf mich.
    Sub Vergleich()
    ThisWorkbook.Activate
    Dim anzahlZeilenImportText As Integer 'Variable zum Zählen wieveile Zeilen mit importierem Text  _
    gefüllt wurden
    Dim anzahlZeilenVergleichsText As Integer 'Variable zum Zählen wieveile Zeilen mit hinterlegtem  _
    Text bestehen
    Dim tabName As String 'Variable für Tabellenblattname
    Dim importText As String 'Variable für importieren Text
    Dim vergleichsText As String 'Variable für hinterlegten Vergleichstext
    Dim i As Integer ' Laufvariable für Schleife druchlaufen von importiertem Text
    Dim k As Integer ' Laufvariable für Schleife druchlaufen von hinterlegtem Text
    Dim bol As Integer ' Testvariable zum gucken was im Lokalfesnster passiert
    tabName = "Tabelle1"
    anzahlZeilenImportText = WorksheetFunction.CountA(Range("A:A"))
    anzahlZeilenVergleichsText = WorksheetFunction.CountA(Range("B:B"))
    MsgBox anzahlZeilenImportText & " gefüllte Zeilen von importierten Text gefunden"
    MsgBox anzahlZeilenVergleichsText & " gefüllte Zeilen von hinterlegtem Text gefunden"
    k = 1
    For i = 1 To anzahlZeilenImportText
    With Sheets(tabName)
    importText = UCase(.Cells(i, 1).Value)
    vergleichsText = UCase(.Cells(k, 2).Value)
    End With
    If InStr(1, importText, vergleichsText) = 1 Then
    Cells(i, 3).Value = "Gefunden"
    bol = 1 'trifft zu
    Else
    bol = 2 'trifft nicht zu
    For k = 2 To anzahlZeilenVergleichsText
    With Sheets(tabName)
    importText = UCase(.Cells(i, 1).Value)
    vergleichsText = UCase(.Cells(k, 2).Value)
    End With
    If InStr(1, importText, vergleichsText) = 1 Then
    Cells(i, 3).Value = "Gefunden"
    bol = 3 'trifft zu
    Else
    bol = 4 ' trifft nicht zu
    End If
    Next
    End If
    k = 1
    Next
    End Sub
    
    Ich habe da noch eine Frage, kann man die With Anweisung auch so anordnen, dass sie dann nur einmal im Code auftaucht?
    With Sheets(tabName)
    importText = UCase(.Cells(i, 1).Value)
    vergleichsText = UCase(.Cells(k, 2).Value)
    End With
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige