PDA

Vollständige Version anzeigen : Textersetzung/Stringoperation


vBAS
02.07.2014, 17:27
Hallo,

vorab muss ich betonen, dass ich gerade vbA lerne. Die Suche war leider erfolglos.

Für mein Programm habe ich zwei Textboxen A und B sowie einen Kommandoknopf C.

Ziel: Text konvertieren.

Textbox A = Eingabe von Text
Textbox B = Ausgabe von Text
Kommandoknopf C = Ausführen der Konvertierungsprozedur

Jetzt zu Excel und zur Funktion:

Der Text steht in zwei Spalten, 1 und 2. Die Funktion soll anhand der Texteingabe in Textbox A die Zellen in Spalte 1 durchsuchen (Schleife). Bei einem Treffer soll sie den Text der Zelle der Spalte 2 in der selben Reihe in Textbox B ausgeben.

Die Prozedur dazu (Kommentare sind zu viel :p):

Private Sub Replacement()
Dim StrToSearch As String ' String nachdem gesucht wird
Dim StrToReplace As String ' String der den gesuchten ersetzt
Dim StrTxtBox As String ' String aus TextboxA
Dim i As Integer ' für die Iteration

StrTxtBox = TextBoxA.Text ' Kopiere Text aus TextBoxA in StrTxtBox

With Worksheets("Tabellenblatt1")

For i = 1 To 4

StrToSearch = .Cells(i, 1) ' Kopiere Inhalt von Zelle(i,SpalteA) in StrToSearch
StrToReplace = .Cells(i, 2) ' Kopiere Inhalt von Zelle(i, SpalteB) in StrToReplace

' Ersetze den in StrTxtBox gefundenen String (StrToSearch) mit StrToReplace und konkateniere ihn zum Text in TextboxB
TextBoxB.Text = TextBoxB.Text & Replace(StrTxtBox, StrToSearch, StrToReplace)
Next i

End With
End Sub

Leider kopiert er momentan einfach nur mehrfach den Text ohne die Ersetzung durchzuführen. Ist Replace() überhaupt die richtige Funktion dafür oder hab ich sie nur falsch verwendet?

Könnt ihr mir einen Denkanstoß (keine Lösung bitte) geben?

Danke LG vbas

R J
02.07.2014, 17:52
Hi vbas,

zunächst.... zum finden kann man find verwenden. geht schneller als eine schleife zu bemühen.
hab ich da jetzt was falsch verstanden? wieso replace? oder doch nur den text aus der zelle neben der fundstelle? dann reicht es, einfach nur den wert zuzuweisen...

vBAS
02.07.2014, 18:32
Hallo R J,

vielen Dank für deine Hilfe. Du hast recht, da gab es wohl eher einen logischen Fehler. :p

Nachdem ich es umgebaut habe, funktioniert die Ersetzung einzelner Wörter hervorragend. Leider gibt es immer noch Probleme, wenn der in Textbox A eingegebene String andere Zeichen oder gar Zeilenumbrüche enthält. Es wird sozusagen nur ersetzt, wenn es 100%ig übereinstimmt. Gerne hätte ich jedoch auch Ersetzungen, wenn der in Spalte A in einer Zelle stehende Text nur ein Teilstring des eingegebenen Textes ist.

Hier mein neuer Code:

Private Sub Replacement()

Dim FindString As String
Dim Rng As Range

FindString = TextBoxA.Text

With Sheets("Tabellenblatt1").Range("A:A")
Set Rng = .Find(What:=FindString, _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then
TextBoxB.Text = TextBoxB.Text & Rng.Offset(0, 1).Value & vbLf
Else
MsgBox "Nothing found"
End If
End With

End Sub

Wie könnte man das realisieren?

aloys78
02.07.2014, 18:59
Hallo vBas,
Gerne hätte ich jedoch auch Ersetzungen, wenn der in Spalte A in einer Zelle stehende Text nur ein Teilstring des eingegebenen Textes
ist.
Dann ersetze LookAt:=xlWhole durch LookAt:=xlPart

Gruß
Aloys

vBAS
02.07.2014, 19:16
Hallo vBas,

Dann ersetze LookAt:=xlWhole durch LookAt:=xlPart

Gruß
Aloys

Hallo aloys78,

vielen Dank für deine Antwort. Das habe ich getan. Leider bekomme ich stetig die Messagebox vor den Kopf.

Der Text, den man in eine Textbox eingibt, wird doch als ein ganzer String gesehen oder?

Wenn die Eingabe z. B. lautet:

Die Äpfel bleiben neben
dem Baum liegen

So heißt doch der komplette String in etwa:
String = "Die Äpfel bleiben neben\ndem Baum liegen\0"
Legende: \n = Neue Zeile, \0 = Ende der Zeichenkette

oder irre ich in dieser Annahme?

Ich überlegte mir bereits die Benutzereingabe in TextboxA in Teilstrings mit Leerzeichen und Linefeeds als Delimiter zu zerlegen (Funktion Right() gepaart mit InStr() und StrReverse()), die einzelnen Ergebnisse in ein Array zu speichern und die einzelnen Werte mit den in den Zellen der Spalte A stehenden Werten zu vergleichen und bei einem Treffer den Kopiervorgang in TextboxB durchzuführen. Bis jetzt ist es bei einer Überlegung geblieben, vielleicht gibt es noch eine elegantere Variante.

LG Robert

R J
03.07.2014, 06:54
...smile...
String = "Die Äpfel bleiben neben\ndem Baum liegen\0"

...nee... Du bist hier nicht bei C mit nullterminierten Strings und Esc-Sequencen...:)

...Lass Dir mal den String ausgeben (den mit den Äpfeln, da bleibt die Box noch überschaubar)
Sub str()
Dim strg$
Dim x As Byte
For x = 1 To Len(Range("A1"))
strg = strg & "'" & Mid(Range("A1"), x, 1) & "' --> Asc: " & Asc(Mid(Range("A1"), x, 1)) & vbCrLf
Next
MsgBox strg
End Sub

Da Kannst Du sehen, Dein Zeilenbruch ist ASC 10...

Aber... wenn Du xlPart verwendest, dann vermute ich, in Deiner TextBox steht der Text OHNE Zeilenumbruch. Dann sind das in der Tat unterschiedliche Texte. Dann solltest Du nur den Text bis zum Zeilenumbruch eingeben....

vBAS
03.07.2014, 08:28
Aber... wenn Du xlPart verwendest, dann vermute ich, in Deiner TextBox steht der Text OHNE Zeilenumbruch. Dann sind das in der Tat unterschiedliche Texte. Dann solltest Du nur den Text bis zum Zeilenumbruch eingeben....

Hallo R J,

vielen Dank für deine Hilfe. Der Text in der Eingabetextbox A besitzt durchaus Zeilenumbrüche, das ist so gewollt.

Am Ende löste ich es wie folgt:

Private Sub Replacement()

Dim FindString As String
Dim Output As String
Dim Rng As Range
Dim strResults() As String
Dim i As Integer

FindString = TextBoxA.Text ' Text aus Eingabebox A in Variable speichern

FindString = Replace(FindString, vbNewLine, "_") ' Ersetze Zeilenumbrüche mit Unterstrichen

strResults = Split(FindString, "_") ' Befülle das Array/Trenne den Megastring mit Unterstrichen als Trenner

For i = LBound(strResults) To UBound(strResults) ' Durchlaufe das Array
With Sheets("Skills").Range("A:A")
Set Rng = .Find(What:=strResults(i), _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)

If Not Rng Is Nothing Then
Output = Output & Rng.Offset(0, 1).Value & vbLf ' Verschmelze bei einem Treffer alle Wörter in der Zelle rechts daneben getrennt mit einem Line Feed/Break zu einem String
Else
MsgBox strResults(i)
End If
End With
Next i

TextBoxB.Text = Output ' Wenn alles erledigt, schreibe Text in Ausgabebox B
End Sub


Herzlichen Dank an alle. :)

LG Robert

R J
03.07.2014, 09:33
FindString = TextBoxA.Text ' Text aus Eingabebox A in Variable speichern

FindString = Replace(FindString, vbNewLine, "_")

...das lässt sich auch in einer Anweisung realisieren:

FindString = Replace(TextBoxA.Text , vbNewLine, "_")

vBAS
03.07.2014, 18:45
...das lässt sich auch in einer Anweisung realisieren:

FindString = Replace(TextBoxA.Text , vbNewLine, "_")

Hi R J,

wieder etwas gelernt, herzlichen Dank für deine Hilfe. Du hast recht. Mir ging es zunächst primär um die ordentliche Funktionsweise. Die Optimierungen gestaltungstechnischer Natur kommen jetzt.

Wenn die Leute einem im Forum immer so kompetent weiterhelfen, komme ich gerne wieder wenn ich mehr Wissen "besitze" (um z. B. auch anderen zu helfen) ;)

LG Robert

R J
03.07.2014, 19:24
Hi Robert,

und es geht noch besser :) :

strResults = Split(Replace(TextBoxA.Text , vbNewLine, "_"), "_")

vBAS
03.07.2014, 20:47
Hi Robert,

und es geht noch besser :) :

strResults = Split(Replace(TextBoxA.Text , vbNewLine, "_"), "_")

Hallo R J,

vollkommen richtig. Die "FindString"-Variable ist somit fast überflüssig. Ein großes Lob an dich. :top:

LG Robert

Sylvia1368
19.12.2018, 23:32
Es gibt SIE, die Lösung!! Ganz einfach geht es, wenn du im Startmenü, also bevor du eine Arbeitsmappe öffnest, auf Optionen gehst. Hier klickst du Dokumentprüfung, Autokorrektur-Optionen. Alles Weitere denke ich, wird jetzt jeder kennen. Ich habe Tage damit zugebracht hierfür eine vernünftige Lösung zu finden. Elendig lange Formeln formuliert etc. Dabei gibt es eine so einfache Lösung. Texterkennung Autokorrektur