Vorgegebenen Text aus Variable löschen

Hallo

sicher eine einfache Sache für euch. Das was ich bis jetzt zu diesem Thema gefunden habe hilft mir noch nicht so ganz. Die arbeiten alle mit Left and Right. Da sehe ich keine Lösung zu meinem Problem

Bsp1:
Ich habe zwei Variable:
A = (Hallo1)(Hallo2)(Hallo3)(Hallo4)
B = (Hallo2)
Ich weiß das B in A steht. Ich möchte das die Variable A danach so aussieht
A = (Hallo1)(Hallo3)(Hallo4)  

Bsp2:
Ich habe zwei Variable:
A = (Hallo1)(Hallo2)(Hallo3)(Hallo4)
B = (Hallo3)
Ich weiß das B in A steht. Ich möchte das die Variable A danach so aussieht
A = (Hallo1)(Hallo2)(Hallo4)  

Anmerkung: Variable A ist eigentlich keine Variable sondern ein „Zelle“ aus einer Listbox aber das sollte ja kein Problem geben, ob ich nun eine Variable oder eine „Zelle“ von einer Listbox durchsuche.

Hi Le2064,

A = "(Hallo1)(Hallo2)(Hallo3)(Hallo4)"
B = "(Hallo3)"

A = Left(A, InStr(A, B) - 1) & Mid(A, InStr(A, B) + Len(B))

Gruß, Andreas

Danke Andreas

Top es klappt, jetzt muss ich nur noch verstehen was wer wie wo macht :smiley:
Ich werde mit der Zeile mal die Tage rumspielen, dann werde ich ja sehen was das alles ist.

Erstmal vielen dank!

Hi …

je nachdem wie Du die Rahmenbedingungen definierst. Konstruktionen mit instr, Left und Right gehen (ohne Schleife außen rum) davon aus, dass der Text nur genau ein Mal vorkommen kann.

Die einfachste Möglichkeit, die immer klappt, wäre, die Replace Funktion zu bemühen:

http://msdn.microsoft.com/de-de/library/bt3szac5%28v

je nachdem wie Du sie parametrisiertst, ersetzt sie den Text ein mal, x Mal oder so oft er vorkommt (count auf -1, siehe Beschreibung). Ist der Text gar nicht enthalten, tut die Funktion einfach nichts, es wird also kein Fehler ausgeworfen.

Um einen Text verschwinden zu lassen, würdest Du den 3. Parameter (Replacement-String) auf Leer ("") setzen, dann wird der Teiltext durch Leertext ersetzt, mithin entfernt.

Beispiele:

Replace („1 2 3 4 5 6 7 8 9 10 11“,„11“,"",-1) ergibt „1 2 3 4 5 6 7 8 9 10 "
Replace („1 2 3 4 5 6 7 8 9 10 11“,„1“,“",-1) ergibt " 2 3 4 5 6 7 8 9 0 "
Replace („1 2 3 4 5 6 7 8 9 10 11“," „,“",-1) ergibt „1234567891011“
Replace („1 2 3 4 5 6 7 8 9 10 11“,„1“,"",1) ergibt " 2 3 4 5 6 7 8 9 10 11"

Das war der prozedurale Ansatz. Du kannst natürlich auch dem Zeitgeist folgen und den String als Objekt betrachten, dann findest Du hier:

http://msdn.microsoft.com/de-de/library/fk49wtc1%28v

die Beschreibung der Methode „String.Replace“. Die ersten Parameter sind gleich, aber dann bemerkst Du, dass die Methode weit weniger flexibel ist als die Prozedur, da sie nur eins kann: immer alle Vorkommnisse ersetzen.

Da Du bei Visual Basic aber immer die Wahl hast, ob Du prozedural oder objektorientiert oder gemischt arbeiten möchtest, ist das von Deinem persönlichen Geschmack und den konkreten Anforderungen anhängig.

Gruss Armin

Hallo ich hab dann mal noch eine Frage, besser gesagt etwas zu erweitern.

Bsp1:
Ich habe zwei Variable:
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)
B = (Hallo2xxx,xx)
Ich weiß das B in A steht. Ich möchte das die Variable A danach so aussieht
A = (Hallo1xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)

Bsp2:
Ich habe zwei Variable:
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)
B = (Hallo3xxx,xx)
Ich weiß das B in A steht. Ich möchte das die Variable A danach so aussieht
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo4xxx,xx)

Zur Erklärung ich trage hinter dem hallo1 einen variablen Preis ein. In dem Format xxx,xx
Also steht dort Z.b. (hallo1254,02) oder (hallo123,30)
Ich brauche also eine Möglichkeit das er nach dem hallo1 sucht und dann alles löscht bis er das 1. mal auf ) trifft (Siehe oben)

An einer anderen Stelle suche ich dann wieder nach dem hallo1 und möchte in einer variable dann den preis dahinter haben (254,02) oder (23,30)

Hi …

Hallo ich hab dann mal noch eine Frage, besser gesagt etwas zu
erweitern.

Bsp1:
Ich habe zwei Variable:
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)
B = (Hallo2xxx,xx)
Ich weiß das B in A steht. Ich möchte das die Variable A
danach so aussieht
A = (Hallo1xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)

Bsp2:
Ich habe zwei Variable:
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)
B = (Hallo3xxx,xx)
Ich weiß das B in A steht. Ich möchte das die Variable A
danach so aussieht
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo4xxx,xx)

Hm. Blöde Frage … was hindert Dich daran, meinen Vorschlag mit Replace anzuwenden??

Gruss Armin.

Nachfrage

Hallo ich hab dann mal noch eine Frage, besser gesagt etwas zu
erweitern.

Hi,

Bsp1:
Ich habe zwei Variable:
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)
B = (Hallo2xxx,xx)
Ich weiß das B in A steht. Ich möchte das die Variable A
danach so aussieht
A = (Hallo1xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)

Bsp2:
Ich habe zwei Variable:
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo3xxx,xx)(Hallo4xxx,xx)
B = (Hallo3xxx,xx)
Ich weiß das B in A steht. Ich möchte das die Variable A
danach so aussieht
A = (Hallo1xxx,xx)(Hallo2xxx,xx)(Hallo4xxx,xx)

Zur Erklärung ich trage hinter dem hallo1 einen variablen
Preis ein. In dem Format xxx,xx
Also steht dort Z.b. (hallo1254,02) oder (hallo123,30)

Hier stimmt was nicht: Du hast gesagt, dein Format für den Preis sei xxx,xx, hinter hallo1.
Hier steht aber nur xx ,xx.

Ich brauche also eine Möglichkeit das er nach dem hallo1 sucht
und dann alles löscht bis er das 1. mal auf ) trifft (Siehe
oben)

Klar, das geht.

An einer anderen Stelle suche ich dann wieder nach dem hallo1
und möchte in einer variable dann den preis dahinter haben
(254,02) oder (23,30)

Das verstehe ich nicht. Nach hallo1 suchen ist kein Problem. Aber was heißt „den preis dahinter haben“? Soll da dann irgendwas eingefügt werden?

Gruß, Andreas

Sorry habe mich etwas blöd ausgedrückt.

Ich habe folgendes vor.
In meiner Anwendung ist es mögliche mehrere Artikel in einem Set zusammen zu fassen. Dabei läuft es so, das ich die Artikel in einer Listbox markiere gegebenenfalls ein Preis eines Artikels änder und abspeicher. Dabei wird hinter den Artikel in einer freien Zelle der Setname und der geänderte Preis geschrieben halt im Format (Setnamexxx,xx) Da es aber ja auch ein zweistelliger Preis sein kann kann es auch (Setnamexx,xx) Sein. Dieser Artikel kann aber dann auch noch in einem zweiten Set auftauchen, dann trage ich hinter dem ersten Setnamen und Preis in klammern das zweite Set ein (Setname1xxx,xx)(Setname2xx,xx). Soweit so gut das klappt ohne Probleme.

  1. Problem: Es gibt die Möglichkeit dieses Set wieder zu löschen, wenn man ein Fehler gemacht hat oder so. Dann habe ich das zu Anfang gemacht wie oben beschrieben. Doch nun kenne ich ja von dem Klammer wert nur den Setnamen nicht den Preis der dahinter steht. Also ich kann aus (Setnamexxx,xx) (xxx,xx) machen. Eigentlich bräuchte ich hier nur eine Funktion, die schaut in welcher () steht der Setname ,den ich ja kenne, und dann alles von der anfangs ( über den Setnamen und Preis bis zur nächsten ) löscht
    Also so in der art. Suche in der Zeile xy den Wert Setname - wenn gefunden dann löschen ab „(“ (Direkt vor dem Setname) bis zur nächsten „)“

  2. Problem: An einer anderen Stelle werte ich dann den ganzen kram wieder aus. Dort suche ich dann wieder nach dem Setnamen und brauche dann den Preis der direkt dahinter stehen.
    Also in der Art. Suche in der Zeile xy den Wer Setname - wenn gefunden schreibe in Variable zz alles direkt hinter Setname bis zum nächsten )

Ich kann mir vorstellen, das ich mal wieder viel zu kompliziert an die sache ran gehe, jeder 2. hier hätte sicher eine andere einfachere Art gefunden dieses Problem zu löschen. Aber ich will ja auch lernen und viele Wege führen nach Rom xD

Bis dahin erstmal besten dank

Meinst du so?
Hi Le,

versuchs mal hiermit:

Function loeschen(komplettText As String, setname As String) As String
 Dim p1 As Long, p2 As Long

 p1 = InStr(komplettText, "(" & setname)
 If p1 = 0 Then
 loeschen = komplettText
 Exit Function
 End If
 p2 = InStr(p1 + 1, komplettText, ")")
 loeschen = Left(komplettText, p1 - 1) & Mid(komplettText, p2 + 1)
End Function

Function preis(komplettText As String, setname As String) As Single
 Dim p1 As Long, p2 As Long

 p1 = InStr(komplettText, setname)
 If p1 = 0 Then
 preis = 0
 Exit Function
 End If
 p1 = p1 + Len(setname)
 p2 = InStr(p1 + 1, komplettText, ")") - 1
 preis = Val(Mid(komplettText, p1, p2 - p1 + 1))
End Function

Sub tt()
 Dim kText As String
 Dim prs As Single
 Dim satz As String
 Dim geloescht As String

 kText = "(Set1123.45)(Set267.89)(Set3987.65)"
 satz = "Set2"
 geloescht = loeschen(kText, satz)
 MsgBox geloescht
 prs = preis(kText, satz)
 MsgBox prs
End Sub

Gruß, Andreas

Ich habs versucht
und es hat geklappt :smiley:
Nachdem ich MEIN Skript noch etwas angepasst hatte läuft es jetzt super mit deinen Funktionen.

Wo wir gerade bei dem Thema sind, bevor ich jetzt großartig google
Wo ist der unterschied zwischen einer
Funktion und einem Sub

Ich schreibe meine eigenen „Unterprogramme“ immer in einem Sub

Vielen vielen dank für deine Hilfe bin mal wieder ein riesen Schritt weiter gekommen DANKE

Hi,

schön, dass es passt.

Sub und Function ist gemeinsam, dass du ihnen Parameter übergeben kannst (aber nicht musst).
Eine Sub „tut“ einfach irgend etwas und ist dann fertig.
Eine Function tut auch irgend etwas. Das wichtige ist aber, dass sie einen „Rückgabe-Wert“ liefert, den du z.B. einer Variablen zuordnen kannst.
Prominente Beispiele für Funktionen in Excel sind z.B. mathematische Winkelfunktionen:
SIN(x). Man steckt einen Winkel x rein, und bekommt den Sinus des Winkels als Rückgabe-Wert.
Eine Funktion, wo man nix reinsteckt und trotzdem einen Wert erhält ist z.B. PI().

In deinem Fall habe sich Funktionen angeboten: Du steckst z.B. den Gesamttext und den Text rein, den du löschen willst und bekommst den Resttext als Funktionswert zurück.
Oder du steckst den Gesamtext und einen Setnamen rein und bekommst dessen Preis zurück.

Es gibt auch Programmiersprachen wie z.B. C. Da ist alles eins: Es gibt nur Funktionen.

Gruß, Andreas

super erklärt, das verstehe ich. wenn ich also „nur“ etwas machen will kann ich ein sub nehmen, will ich ein rückgabewert nehme ich eine funktion :smile: na das ist doch top