Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
812to816
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
812to816
812to816
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Finde Stelle, lösche und ersetze

Finde Stelle, lösche und ersetze
20.10.2006 13:24:27
abu
Hallo liebes Forum,
seit langem mal wieder im Forum und ich freue mich jetzt schon auf eure Antworten/Hilfe.
Hier ein immer wiederkehrendes Problem und möchte es gerne in VBA lösen:
Habe eine endlich lange Liste wo in Spalte A ein oder mehrere Worte stehen. In Spalte B steht ein ewig langer Text. Jetzt möchte ich gerne das er in Spalte B geht, sich den Wert anschaut und zwar beginnend mit dem Ende also von rechts (nicht meine politische Einstellung)so lange sucht bis er 2 eckige Klammern findet, von da an soll er löschen bis wieder 2 eckige Klammern kommen und dann den Wert aus Spalte A zwischen die 4 eckigen Klammern setzt. Das ganze muss vom Ende passieren da auch am Anfang mehrere eckige Klammern sind die aber keine Regelmäßigkeiten aufweisen.
Das ganze in einer Schleife bis in Zelle A n kein Wert mehr steht.
Also das mit der Schleife und solange bis A n leer ist bekomm ich hin für den ersten Teil bräuchte ich aber eure Unterstützung.
Danke im Voraus für eure Hilfe.
LG Abu

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Finde Stelle, lösche und ersetze
20.10.2006 14:17:40
Andi
Hi,
zwei Rückfragen:
1. Wie sind die Klammern ausgerichtet?
So? abcd[[servus]]xyz
2. Treten die Klammern immer paarweise auf? Kann ich also davon ausgehene, wenn ich von rechts kommend die erste eckige Klammer gefunden habe, dass der zu ersetzende String dann bis zum 2. Zeichen links davon geht?
Schönen Gruß,
Andi
Falls meine Annahmen zutreffen...
20.10.2006 14:29:08
Andi
... dann so:

Sub t()
Dim a As Long
For a = 1 To Range("A65536").End(xlUp).Row
Cells(a, 2) = Left(Cells(a, 2), InStrRev(Cells(a, 2), "[")) & Cells(a, 1) & Right(Cells(a, 2), Len(Cells(a, 2)) - (InStrRev(Cells(a, 2), "]") - 2))
Next a
End Sub

Falls nicht, dann melde Dich nochmal.
Schönen Gruß,
Andi
Anzeige
AW: Falls meine Annahmen zutreffen...
20.10.2006 15:24:20
abu
Hallo Andi,
danke für deine Antwort und Hilfe. Habe leider festgestellt das ich noch einige Info's benötige um deine Frage zu beantworten. Außerdem ist da noch eine Schwirigkeit deren regelmäßigkeit ich nicht erkennen kann und da auf Antworten meiner Kollegen warten muss.
Wäre es möglich das wir uns am Montag hier weiter unterhalten. Bis dahin habe ich die Info's zusammen?
LG
abu
AW: Falls meine Annahmen zutreffen...
20.10.2006 15:36:21
Andi
Hi,
ich kann Di nicht verprechen, dass ich am Montag viel Zeit habe, ich schau aber mal rein...
Schönen Gruß,
Andi
AW: Falls meine Annahmen zutreffen...
20.10.2006 15:38:43
abu
Hallo Andi,
hab glücklicherweise doch noch die Info's vor dem Wochenende bekommen. ich geb dir mal ein Beispiel so kann man glaube ich am besten erkennen was Sache ist:
In Zelle A1 steht:
kuechenrollenhalter online kauf
In Zelle A2 steht:
http://www.xxx.de/xxxTracking?tid=157053C157S157052CL30PPC&url=[[http://www.xxxxx.de/bp/search.htm?qu=939730J&landmark=Entry&wkz=87&iwl=975&typ=SEM&anbieter=xxx&aktion=Keyword&version=ohne&promo=kuechenrollenhalter+online+kauf]]&kw=[[kuechenrollenhalter]]xyz
Mein Code soll das daraus machen:
http://www.xxx.de/xxxTracking?tid=157053C157S157052CL30PPC&url=[[http://www.xxxxx.de/bp/search.htm?qu=939730J&landmark=Entry&wkz=87&iwl=975&typ=SEM&anbieter=xxx&aktion=Keyword&version=ohne&promo=kuechenrollenhalter+online+kauf]]&kw=[[kuechenrollenhalter+online+kauf]]xyz
Also finde die ersten 2 "]]", dann fang an zu löschen bis "[[" kommt, dann schreibe zwischen "[[]]" den Wert aus A1 und ersetze jedes Leerzeichen durch "+".
So ich hoffe ich habe damit klarheit geschaffen, ansonsten stehe ich gerne für Fragen zur Verfügung.
Gruß
Abu
Anzeige
AW: Falls meine Annahmen zutreffen...
20.10.2006 16:20:48
ingUR
Hallo, @abu,
sowohl für die Sub Prozedur von Andi, als auch in meiner Funktion sind mit den neuen Angaben dei Änderung des Ersatztextes zu beachten:
Ich erlaube mir hier Andi's Antwort vorzugreifen, ohne sie entbehrlich werden zu lassen:
Sub t()
Dim a As Long
'For a = 1 To Range("A65536").End(xlUp).Row
a = 1
Cells(a + 1, 2) = Left(Cells(a, 2), InStrRev(Cells(a, 2), "[")) & Replace(Cells(a, 1), " ", "+") & Right(Cells(a, 2), Len(Cells(a, 2)) - (InStrRev(Cells(a, 2), "]") - 2))
'Next a
End Sub

und die Ändrung in der Function (der Test für die Forderung "TAGs erhalt", führte zur weiteren Korrekturen:
Function ReplaceTextBereich(strOrigi As String, strNew As String, _
Optional strTag0 As String = "[[", _
Optional strTag1 As String = "]]", _
Optional direction As Integer = -1) As String
Dim pos0 As Integer, pos1 As Integer, tpos As Integer, strTxtChg As String
pos0 = InStr(strOrigi, strTag0)
pos1 = InStr(strOrigi, strTag1)
If direction < 0 Then
Do
tpos = InStr(pos0 + Len(strTag0), strOrigi, strTag0)
If tpos > 0 Then pos0 = tpos
Loop Until tpos = 0
Do
tpos = InStr(pos1 + Len(strTag1), strOrigi, strTag1)
If tpos > 0 Then pos1 = tpos
Loop Until tpos = 0
End If
If pos0 > 0 And _
pos1 > 0 And _
pos0 < pos1 Then
strTxtChg = Mid(strOrigi, _
pos0, _
(pos1 - pos0) + Len(strTag1)) 'Tags bleiben erhalten
ReplaceTextBereich = Replace(strOrigi, _
strTxtChg, _
strTag0 & Replace(strNew, " ", "+") & strTag1)
Else
ReplaceTextBereich = strOrigi
End If
End Function

Gruß,
Uwe
Anzeige
AW: Falls meine Annahmen zutreffen...
20.10.2006 16:31:22
Andi
Hi,
da samma uns ja fast einig... ;-)
Ich nehme an, der Grund für
Cells(a + 1, 2) =
statt
Cells(a, 2) =
geht aus den beiden links hervor, die bei mir nicht funtioniert haben, oder?
Schönes Wochenende wünscht
Andi
AW: Falls meine Annahmen zutreffen...
20.10.2006 17:13:05
ingUR
Hallo, Andi,
das muß wohl @abu sowieso nach seinem Tabellenaufbau gestalten. Ich hatte für mich da nur zum Testen die Freizelle unter dem Teilstring als Zielzelle gewählt, was allerdings nicht in Deine FOR-Schleife paßte, daher habe ich sie auskommentiert.
Gruß,
Uwe
AW: Falls meine Annahmen zutreffen...
20.10.2006 16:23:56
Andi
Hi,
Deine links funktionieren leider nicht, aber dies:
Also finde die ersten 2 "]]", dann fang an zu löschen bis "[[" kommt, dann schreibe zwischen "[[]]" den Wert aus A1 und ersetze jedes Leerzeichen durch "+".
geht so, wenn die +-Zeichen nur in Spalte B, nicht aber in Spalte A eingefügt werden sollen:

Sub t()
Dim a As Long
For a = 1 To Range("A65536").End(xlUp).Row
Cells(a, 2) = Left(Cells(a, 2), InStrRev(Cells(a, 2), "[")) & Replace(Cells(a, 1), " ", "+") & Right(Cells(a, 2), Len(Cells(a, 2)) - (InStrRev(Cells(a, 2), "]") - 2))
Next a
End Sub

Schönen Gruß,
Andi
Anzeige
AW: Finde Stelle, lösche und ersetze
20.10.2006 14:40:52
ingUR
Hallo, Abu,
als Grundgerüst kann ich Dir folgende Funktion anbieten:
Option Explicit
Function ReplaceTextBereich(strOrigi As String, strNew As String, _
Optional strTag0 As String = "[[", _
Optional strTag1 As String = "]]", _
Optional direction As Integer = -1) As String
Dim pos0 As Integer, pos1 As Integer, tpos As Integer, strTxtChg As String
pos0 = InStr(strOrigi, strTag0)
pos1 = InStr(strOrigi, strTag1)
If direction < 0 Then
Do
tpos = InStr(pos0 + Len(strTag0), strOrigi, strTag0)
If tpos > 0 Then pos0 = tpos
Loop Until tpos = 0
Do
tpos = InStr(pos1 + Len(strTag1), strOrigi, strTag1)
If tpos > 0 Then pos1 = tpos
Loop Until tpos = 0
End If
If pos0 > 0 And _
pos1 > 0 And _
pos0 < pos1 Then
'            strTxtChg = Mid(strOrigi, _
'                       pos0 + Len(pos0), _
'                       (pos1 - pos0) - Len(strTag1)) 'Tags bleiben erhalten
strTxtChg = Mid(strOrigi, _
pos0, _
(pos1 - pos0) + Len(strTag0)) 'Tags werden mit ersetzt erhalten
ReplaceTextBereich = Replace(strOrigi, strTxtChg, strNew)
Else
ReplaceTextBereich = strOrigi
End If
End Function
Sie Ersetzt wahlweise den Text zwischen zwei unterschiedlichen Tag (z.B. [TAG1] .... [TAG2], oder eben [[ ... ]]. die Fragen von @Andi sind je nach Antwort erfordern ggf. eine zusätzliche besondere Abfragelogik.
Aufrufen kannst Du die Funktion in einer Zellenfunktion
(für das Suchen vom Textende): =ReplaceTextBereich(B1;A1;"[[";"]]";-1)
oder =ReplaceTextBereich(B1;A1;"[[";"]]")
oder =ReplaceTextBereich(B1;A1)
(für das Suchen vom Textanfang): =ReplaceTextBereich(B1;A1;"[[";"]]";1)
Der Ersetzungsvorgang wird nur ausgelöst, wenn die Position TAG0 vor der Position von TAG1 liegt.
Mit Direcktion wird der Suchbegin im Text definiert:
Größer Null oder ohne Angabe: vom Textanfang
Kleiner Nul: vom Textende
Ist die Position Position von TAG0 größer als die von TAG1, wird keine Textersetung vorgenommen.
Zu klären bleibt, ob die TAGs erhalten bleiben sollen oder nicht. Ich habe die eine Möglichkeit von beiden auskommentiert.
Wenn Dein e Aufgabe nur für die festen Begrenzer [[ und ]] gilt und die Suchrichtung immer vom Textende her erfolgen soll, dann können natürlich die entsprechenden Aufrufparameter durch feste Werte in der Funktion ersetz werden.
Gruß,
Uwe
Anzeige
AW: Finde Stelle, lösche und ersetze
20.10.2006 15:26:50
abu
HAllo Uwe,
auch danek für deine Teilnahme in dieser Runde. Ich würde auch dich gerne auf Montag vertrösten bis ich alle Info's zusammen habe.
LG
abu

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige