Problem mit rekursivem Vb(A) Code

Hallo Wissende,

für die Anfrage eins drunter habe ich nachfolgenden Code gebastelt.
Aufgrund der Anfrage wollte ich Code basteln, der eine rtf-Datei ausliest.

Die Datei: http://www.badongo.com/file/10494733

Interessanterweise läuft der Code anfangs korrekt, nur zum Ende geschehen seltsame Dinge. Je nachdem welches on Error ich benutze läuft der Code endlos, aber auch Stapelspeicherüberlauf kommt.

Natürlich wäre am besten den Code abzuändern daß er nicht mehr ins Endlose läuft.

Aber mir würde auch reichen wenn bei einem Speicherüberlauf der Code sich einfach verabschiedet, denn die Daten die ich brauche hat er ja schon korrekt geschrieben, deshalb kam ch auf On Error, aber das greift irgendwie nicht so wie ich möchte.
On Error Beende tt
gibt es leider nicht.

Völlig unerklärlich ist, daß der Code nachdem er da „Satz“ ausgelesen hat sich wiederholt, also er liest „Satz“ teilweise nochmals aus.

Okay, ich habe im Code jetzt Cells genommen, aber das ist egal, eine Ausgabe in List1 durch VB ist auch gut, sowas kriege ich inzwischen hin umzusetzen.

Option Explicit
Public Satz As String, Zei As Long
'
Sub tt2()
Dim S As String
Zei = 0
Close
Open "C:\Download\ursprungsdoc.rtf" For Input As #1
'Open "H:\ursprungsdoc.rtf" For Input As #1
While Not EOF(1)
 Line Input #1, S
 Satz = Satz & S
Wend
Close
Call tt(1)
End Sub
'
Sub tt(Pos As Long)
'On Error GoTo Ende
On Error Resume Next
If Pos = Len(Satz) - 1 Then Exit Sub
If InStr(Pos + 1, Satz, "}") \> InStr(Pos + 1, Satz, "{") Then Call tt(Pos + 1)
Zei = Zei + 1
Cells(Zei, 1) = Mid(Satz, Pos, InStr(Pos + 1, Satz, "}") - Pos + 1)
Pos = InStr(Pos + 1, Satz, "{")
If Pos = Len(Satz) - 1 Then Exit Sub
Call tt(Pos)
Ende:
End Sub

Danke ^ Gruß
Reinhard

Hallo Reinhard,

die Probleme werden wohl durch die verschachtelten procedure calls (anrufen von tt in tt selber) hervorgerufen - da hilft „on error“ auch nicht. Habe hier zu Hause keinen Excel und kann auch Deine Datei nicht auf die von Dir angegebenen Seite betrachten. Ich vermute mal, Du möchtest Cells(Zei,1) mit den jeweils zwischen Akkoladen vorhanden String-Teile füllen.

Habe vergessen, was der erste Wert im InStr ist. Aus deiner Kode liesse sich ableiten, der Startposition im String ?

in dem Fall:

zei=0
ipos=1
do
istart=InStr(ipos,satz,"{")
if len(satz)[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Reinhard,

> Sub tt(Pos As Long)  
> 'On Error GoTo Ende  
> On Error Resume Next  
> If Pos = Len(Satz) - 1 Then Exit Sub  
> If InStr(Pos + 1, Satz, "}") \> InStr(Pos + 1, Satz, "{")  
> Then Call tt(Pos + 1)  
> Zei = Zei + 1  
> Cells(Zei, 1) = Mid(Satz, Pos, InStr(Pos + 1, Satz, "}") - Pos  
> + 1)  
> Pos = InStr(Pos + 1, Satz, "{")  
> If Pos = Len(Satz) - 1 Then Exit Sub  
> Call tt(Pos)  
> Ende:  
> End Sub

Wenn ich das so lese sollen alle { gefunden werden. Dazu werden die pos durchiteriert. Ich sehe die Gefahr an zwei Stellen:
pos = instr(…
Das liefert ja gegen Ende keine „korrekten“ Wert mehr. (-1?) Das sollte man an einen Abbruch binden.
und
Pos = len(Satz) …
Das muss ja auch nicht erreicht werden, oder steht sicher, dass am Ende ein { steht?

Kannst du nicht Split(expression[, delimiter[, limit[, compare]]]) verwenden um die einzelnen Stücke zu erzeugen?

mfg

Dirk.Pegasus

Hallo Reinhard,

ich auch noch. :smile:

Bevor ich zur Frage komme, Stapelüberlauf ist kein auffangbarer Fehler, On Error nützt Dir nichts.

Selbst wenn, dann wäre On Error Resume Next völlig falsch, denn dann würde Dein Programm in den If-Zweig laufen, wenn die Bedingung nicht geprüft werden kann.

Bei On Error Goto hast Du im Fehlerausgang kein Fehlerbehandlung.

Nun zu Deinem Code.

Du willst ineinander verschachtelte Klammern auflösen, richtig?
Kannst Du die Rekursion mal etwas genauer beschreiben?

Sich einen rekursiven Code ausdenken ist schwer genug. Einen fremden verstehen ist schwerer. Einen fremden rekursiven Code lesen, verstehen und herauszufinden, was Du Dir dabei gedacht hast, übersteigt meine persönliche Grenze. :smile:

Gruß Rainer

Hallo,

Die Datei http://www.badongo.com/file/10494733
Völlig unerklärlich ist, daß der Code nachdem er da „Satz“
ausgelesen hat sich wiederholt, also er liest „Satz“ teilweise
nochmals aus.

zumindest das ist weg, ich hatte ja Satz global deklariert und muß ihn also in tt2 auf „“ setzen, sonst verlängert er sich ja bei jedem Testaufruf.

Ja, bei Instr(Pos,Satz,„x“) gibt Pos die Stelle an ab der gesucht werden soll in Satz.

Ja, die Klammern sind verschachtelt.

Das ist die .rtf-Datei sehr kompakt, aber vollständig.

{a{a{aKa}{aKa}{aKa}K}K{aK}K{aK}a{aK}{aK}{aK}{aK}{aK}{aK}{aK}{aK}{aK}aKaKaKaKaK}

a = beliebig langer unterschiedlicher Text ohne Klammern drin

K = nicht verschachtelter Text in Klammern, meist mehrfach nacheinander.

d.h. K könnte sein
{a} oder {a}{a} oder {a}{a}{a} oder {a}{a}{a}{a} usw.

Wegen der Verschachtelungen kam ich auf Rekursion. Würde ich die ja beherrschen könnte ich ja meinen Code verstehen und hätte bessere Chancen den/die Fehler zu finden. :smile:

Ich sehe gerade, die einzige Verschachtelung (mal die äußeren Klammern wegdenkend) steckt hier:

{a { a{aKa}{aKa}{aKa}K }…}

Dies müßte umgesetzt werden zum Nachstehenden. Dummerweise kann ja eine andere rtf-Datei Verschachtelungen an anderer Stelle haben.

Tabellenblatt: [Mappe1]!Tabelle2
 │ A │
──┼─────┤
3 │ a │
──┼─────┤
4 │ a │
──┼─────┤
5 │ aKa │
──┼─────┤
6 │ aKa │
──┼─────┤
7 │ aKa │
──┼─────┤
8 │ K │
──┴─────┘

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Gruß
Reinhard

Hallo Reinhard,

sieht komisch aus, mit zwei mal Replace hin und her isz das bestimmt auch nicht besonders elegant, läuft aber und tut hoffentlich, was Du wolltest. Ohne Rekursion.

Private Sub Command1\_Click()
 Dim Satz As String, Pos1 As Integer, Pos2 As Integer, Txt As String
 Satz = "Test{a{b{c}{d}}e}"
 List1.AddItem Satz
 Satz = Replace(Satz, "{", "(")
 Satz = Replace(Satz, "}", ")")
 For Pos1 = Len(Satz) - 1 To 1 Step -1
 Pos1 = InStrRev(Satz, "(", Pos1)
 If Pos1 = 0 Then Exit For
 Pos2 = InStr(Pos1, Satz, ")")
 If Pos2 = 0 Then Exit For
 Txt = Mid(Satz, Pos1, Pos2 - Pos1 + 1)
 Txt = Replace(Txt, "(", "{")
 Txt = Replace(Txt, ")", "}")
 Mid(Satz, Pos1, 1) = "{"
 Mid(Satz, Pos2, 1) = "}"
 List1.AddItem Txt
 Next
End Sub

So?

Gruß Rainer

Hallo Rainer,

sieht komisch aus, mit zwei mal Replace hin und her isz das
bestimmt auch nicht besonders elegant, läuft aber und tut
hoffentlich, was Du wolltest. Ohne Rekursion.

tja nun, mein VB5 kennt kein Replace, was hast du denn bei VB4 genommen, oder war das noch auf deutsch wie in Excel?

Und, wenn ich jetzt wie kürzlich eine eigene Replace-Routine schreibe, wo packe ich die am einfachsten hin daß die immer vorhanden ist?

Ich habe jetzt, auch ohne Rekursion :smile:, die sind zwar immer schön klein aber erfordern Riesendenke, eine Lösung hingebogen die funktioniert und aus der rtf eine Exceltabelle macht, mit Doppelpunkt usw. wie in der Anfrage gewünscht.
Jetzt nur noch in Word einfügen, die Tabs setzen und feddisch.

Da ja Crossposting in anderen Foren Jessica am schönen Hintern vorbeigeht, haste die schon mal gesehen?, frag ich mal wegen der Rekursion woannerster nach *gg*

Aber eine rekursive Lösung würde mich schon sehr interessieren, kann ja mal sein daß ich eine 7fache Wenn-Verschachtelung in einer Excelformel auslesen muß, ist ja die gleiche Problematik.

Private Sub Command1_Click()

End Sub

So?

K.A., muß ich noch testen usw.
Und Alex hat hier was geschrieben, will ich auch noch testen, irgendwie kommen mir immer so 6aus49 u.ä. Dinge dazwischen wenn ich mal meine „Baustellen“ angehen will… (aber macht Spaß sowas)

Gruß
Reinhard

Hallo Reinhard,

tja nun, mein VB5 kennt kein Replace, was hast du denn bei VB4
genommen, oder war das noch auf deutsch wie in Excel?

Da kann ich mich nicht erinnern. Eine eigene Replace Funktion sicher.

Private Function Ersetzen(ByVal Txt As String, ByVal su As String, ByVal ss As String) As String
 While InStr(Txt, su)
 Mid(Txt, InStr(Txt, su), 1) = ss
 Wend
 Ersetzen = Txt
End Function

Und, wenn ich jetzt wie kürzlich eine eigene Replace-Routine
schreibe, wo packe ich die am einfachsten hin daß die immer
vorhanden ist?

In ein Modul, aber lohnt der Aufwand für die sechs Zeilen?

Ich habe jetzt, auch ohne Rekursion :smile:,

OK, Rekursion war wohl der falsche Ansatz. Mein Code ist zwar auch nicht gut, aber eine rekursive Funktion wird das Problem nach meiner Meinung nicht vereinfachen.

die sind zwar immer
schön klein aber erfordern Riesendenke, eine Lösung hingebogen
die funktioniert und aus der rtf eine Exceltabelle macht, mit
Doppelpunkt usw. wie in der Anfrage gewünscht.
Jetzt nur noch in Word einfügen, die Tabs setzen und feddisch.

Gut! :smile:

Da ja Crossposting in anderen Foren Jessica am schönen Hintern
vorbeigeht, haste die schon mal gesehen?,

Außer Stickyams habe ich von den w-w-w-Usern noch gar keinen gesehen. Sticky war mal hier.

frag ich mal wegen
der Rekursion woannerster nach *gg*

Aber eine rekursive Lösung würde mich schon sehr
interessieren, kann ja mal sein daß ich eine 7fache
Wenn-Verschachtelung in einer Excelformel auslesen muß, ist ja
die gleiche Problematik.

Das geht ja mit diesem code auch. Meinetwagen kannst Du 300-fach verschachteln, das ändert nichts. :smile:

Gruß Rainer

Hallo Rainer,

tja nun, mein VB5 kennt kein Replace, was hast du denn bei VB4
genommen, oder war das noch auf deutsch wie in Excel?

Da kann ich mich nicht erinnern.

Ui, du bist ja noch heftiger als ich. Da gibts doch diese Gingseng-Kapseln, oder such die ein Hobby, Vb-programmieren oder so *wegduck*

In Excel war es wohl so, da gibt es noch alte, sogenannte Excel4-Makros, die auch in neuen Versionen noch laufen, und da hatte MS alle Befehle in Deutsch umschreiben lassen.
Von daher vermute ich stark daß auch VB4 in Deutsch war.
Ab XL97 (beruhend auf VB5) war’s dann wieder Englisch.

Und, wenn ich jetzt wie kürzlich eine eigene Replace-Routine
schreibe, wo packe ich die am einfachsten hin daß die immer
vorhanden ist?

In ein Modul, aber lohnt der Aufwand für die sechs Zeilen?

Danke, daß heißt ich müßte das in eine dll o.ä. packen um sie immer zur Verfügung zu haben.
Ansonsten muß ich sie bei jedem Projekt immer in ein Modul reinschreiben?

Ich habe jetzt, auch ohne Rekursion :smile:,

OK, Rekursion war wohl der falsche Ansatz. Mein Code ist zwar
auch nicht gut, aber eine rekursive Funktion wird das Problem
nach meiner Meinung nicht vereinfachen.

Dazu kann ich Null sagen, mangels Fähigkeit mal so mal eben eine rekursive Prozedur zu basteln die auch funktioniert. Ich bin ja schon sehr stolz darauf daß meine rekursive Prozedur immerhin passende Ergebnisse produziert.
Daß sie ins Nirwana läuft und zu zusätzlich zu den korrekten Ergebnissen noch viel Schrotteinträge produziert ist halt so :smile:

Aber eine rekursive Lösung würde mich schon sehr
interessieren, kann ja mal sein daß ich eine 7fache
Wenn-Verschachtelung in einer Excelformel auslesen muß, ist ja
die gleiche Problematik.

Das geht ja mit diesem code auch. Meinetwagen kannst Du
300-fach verschachteln, das ändert nichts. :smile:

Ich glaube dir, aber ich glaube auch meinem Bauchgefühl daß mir eindeutig sagt, diese mistigen rtf-Dateien können ja schon bei der nächsten rtf-Datei völlig anders verschachtelt sein, von daher sehe ich deinen Code skeptisch, genauso wie meinen, da beide ja nur auf eine gegebene Sachlage reagieren, wenn die mal anders ist…

Ich poste gleich bei der Anfrage von jogibär meine bisherige Lösung, die halt diese spezielle rtf-datei ausliest und in Excel als Tabelle darstellt.
Diese Tabelle in Excel zu formatieren und dann in Word einzufügen müßte gehen, aber manchmal ist Word zickig, speziell für mich weil ich von Word keine Ahnung habe, mal schauen.

Gruß
Reinhard

Hallo Reinhard,

Ui, du bist ja noch heftiger als ich. Da gibts doch diese
Gingseng-Kapseln, oder such die ein Hobby, Vb-programmieren
oder so *wegduck*

In Excel war es wohl so, da gibt es noch alte, sogenannte
Excel4-Makros, die auch in neuen Versionen noch laufen, und da
hatte MS alle Befehle in Deutsch umschreiben lassen.
Von daher vermute ich stark daß auch VB4 in Deutsch war.

*gg* Das bezog sich darauf, was ich statt ‚Replace‘ verwendet habe. :smile:
Nein, VB4 war englisch. Mit ganz wenigen Ausnahmen würde der Code, der hier gepostet wir auch in VB4 laufen. Meine VB4-Codes laufen jedenfalls alle auch unter VB6. Die IDE erkennt die alte Version und konvertiert etwas in der .vbp, der Code bleibt unverändert und läuft.

Ab XL97 (beruhend auf VB5) war’s dann wieder Englisch.

Und, wenn ich jetzt wie kürzlich eine eigene Replace-Routine
schreibe, wo packe ich die am einfachsten hin daß die immer
vorhanden ist?

In ein Modul, aber lohnt der Aufwand für die sechs Zeilen?

Danke, daß heißt ich müßte das in eine dll o.ä. packen um sie
immer zur Verfügung zu haben.
Ansonsten muß ich sie bei jedem Projekt immer in ein Modul
reinschreiben?

??? Reden wir von VBA? Dann weiß ich nicht, wie das geht.
VB5? Dann Projekt, Hinzufügen, vorhandenes Modul, den Namen anklicken, fertig. :smile: Du hast in VB5 noch nicht so viel mit mehreren Formen gemacht merke ich. :smile: In VB6 kannst Du Variablen nur in einem Modul global deklarieren, das wird in VB5 auch so sein.

OK, Rekursion war wohl der falsche Ansatz. Mein Code ist zwar
auch nicht gut, aber eine rekursive Funktion wird das Problem
nach meiner Meinung nicht vereinfachen.

Dazu kann ich Null sagen, mangels Fähigkeit mal so mal eben
eine rekursive Prozedur zu basteln die auch funktioniert. Ich
bin ja schon sehr stolz darauf daß meine rekursive Prozedur
immerhin passende Ergebnisse produziert.
Daß sie ins Nirwana läuft und zu zusätzlich zu den korrekten
Ergebnissen noch viel Schrotteinträge produziert ist halt so

-)

Aber eine rekursive Lösung würde mich schon sehr
interessieren, kann ja mal sein daß ich eine 7fache
Wenn-Verschachtelung in einer Excelformel auslesen muß, ist ja
die gleiche Problematik.

Das geht ja mit diesem code auch. Meinetwagen kannst Du
300-fach verschachteln, das ändert nichts. :smile:

Ich glaube dir, aber ich glaube auch meinem Bauchgefühl daß
mir eindeutig sagt, diese mistigen rtf-Dateien können ja schon
bei der nächsten rtf-Datei völlig anders verschachtelt sein,
von daher sehe ich deinen Code skeptisch, genauso wie meinen,
da beide ja nur auf eine gegebene Sachlage reagieren, wenn die
mal anders ist…

Nein. Der Code hat mit der Sachlage gar nichts zu tun, ich habe noch nicht mal mit Deinem String getestet. Ich habe mir Strings gebastelt, die möglichst unterschiedliche Varianten von ineinander verschachtelten Klammern beinhalten, das geht, geht immer.

Ich poste gleich bei der Anfrage von jogibär meine bisherige
Lösung, die halt diese spezielle rtf-datei ausliest und in
Excel als Tabelle darstellt.
Diese Tabelle in Excel zu formatieren und dann in Word
einzufügen müßte gehen, aber manchmal ist Word zickig,
speziell für mich weil ich von Word keine Ahnung habe, mal
schauen.

Darüber weiß ich gar nichts, in Word habe ich noch kein VBA auf gemacht.

Gruß Rainer

Aber eine rekursive Lösung würde mich schon sehr
interessieren, kann ja mal sein daß ich eine 7fache
Wenn-Verschachtelung in einer Excelformel auslesen muß, ist ja
die gleiche Problematik.

Hallo Reinhard,

mich interessiert die Lösung auch - habe ich so nie bewusst gekannt, aber tatsächlich liegt es auf der Hand, der Code in Analogie mit dem Datenstruktur zu schreiben.

d.h. K könnte sein
{a} oder {a}{a} oder {a}{a}{a} oder {a}{a}{a}{a} usw.

Diese durch Dich genannte Tatsache macht eine Analogie in der Code aber wesentlich schwieriger, weil die Akkoladen von K, wie Du sagst, nicht als Verschachtelung zu betrachten sind, dh der Analogie folgend sollte hier keine (verschachtelte) call erfolgen, sondern muss der zu schreibenden String-Teil verlängert werden. Auch müssen die in K vorhandenen Akkoladen (insoweit ich Dich richtig verstehe) mit in Cells geschrieben werden, die anderen Akkoladen aber nicht.

Damit denke ich, dass im diesem Fall die rekursive Lösung deutlich aufwendiger als eine „normale“ Lösung ist.

Vielleicht täusche ich mich ?

Grüsse,

Salsero

Ei Guude Rainer,

Nein, VB4 war englisch. Mit ganz wenigen Ausnahmen würde der
Code, der hier gepostet wir auch in VB4 laufen. Meine
VB4-Codes laufen jedenfalls alle auch unter VB6. Die IDE
erkennt die alte Version und konvertiert etwas in der .vbp,
der Code bleibt unverändert und läuft.

aha, dann hat MS halt nur bei seinen VBAs mal früher auf deutsche Befehle umgestellt und dann wieder auf Englisch.

Und, wenn ich jetzt wie kürzlich eine eigene Replace-Routine
schreibe, wo packe ich die am einfachsten hin daß die immer
vorhanden ist?

In ein Modul, aber lohnt der Aufwand für die sechs Zeilen?

*hmmh* ich vermiss da echt da echt die personl.xls in Excel oder die Normal.dot in Word, die werden jeweils beim Start des Programms geladen und Code, also Funktionen die da drin stehen sind in allen Dateien/Dokumenten verfügbar.

VB5? Dann Projekt, Hinzufügen, vorhandenes Modul, den Namen
anklicken, fertig. :smile:

ist dann das Modul, der Code darin, auch vorhanden wenn ich ein neues Projekt starte? Wär schön.

Du hast in VB5 noch nicht so viel mit
mehreren Formen gemacht merke ich. :smile: In VB6 kannst Du
Variablen nur in einem Modul global deklarieren, das wird in
VB5 auch so sein.

Ich hab von VB5 soviel Ahnung wie Boris Becker als Internetzugangsermöglicher :smile:

Das geht ja mit diesem code auch. Meinetwagen kannst Du
300-fach verschachteln, das ändert nichts. :smile:

Ich schaue mir den Code morgen an.

Nein. Der Code hat mit der Sachlage gar nichts zu tun, ich
habe noch nicht mal mit Deinem String getestet. Ich habe mir
Strings gebastelt, die möglichst unterschiedliche Varianten
von ineinander verschachtelten Klammern beinhalten, das geht,
geht immer.

Das ist ja grad das was ich nicht weiß. Ich glaube dir gerne, aber verzeih, ich würd das gerne austesten an einigen rtf-Dateien.

Darüber weiß ich gar nichts, in Word habe ich noch kein VBA
auf gemacht.

Es gibt so ca. 30 Programme die VBa kennen, und bei allen gilt, daß das was ich von Excel-Vba her kenne kann ich da nahezu komplett vergessen.
Klar sind For-next und IF-Then identisch, aber der große Rest, weia.

Und bei Jogibär, ich warte mal ab ob er sich auf meine Nachfrage meldet.

Nachfolgend mein Code zur einstweiligen Lösung diese eine rtf-datei auszulesen, tt2 starten.

Guts Nächtle wünsch
Gruß Reinhard

Option Explicit
Public Satz As String, Zei As Long
Sub tt()
Dim L As Long, S() As String, Spa As Long, off As Integer
ReDim S(Zei)
For L = 1 To Len(Satz)
 Select Case Mid(Satz, L, 1)
 Case "{"
 If InStr(S(Zei), "\tab") Or InStr(S(Zei), "\par") Then
 'If InStr(Cells(Zei, 1), "\tab") Or InStr(Cells(Zei, 1), "\par") Then
 S(Zei) = ""
 'Cells(Zei, 1) = ""
 Else
 Zei = Zei + 1
 ReDim Preserve S(Zei)
 End If
 Case "}"
 'nix
 Case Else
 S(Zei) = S(Zei) & Mid(Satz, L, 1)
 'Cells(Zei, 1) = Cells(Zei, 1) & Mid(Satz, L, 1)
 End Select
Next L
If InStr(S(Zei), "\tab") Or InStr(S(Zei), "\par") Then ReDim Preserve S(Zei - 1)
If InStr(Cells(Zei, 1), "\par") Then Cells(Zei, 1) = ""
'For L = 4 To 21
' Cells(2, L + 1) = Replace(Mid(S(L), InStr(S(L), " ") + 1), ":", "")
'Next L
Zei = 1
For L = 22 To UBound(S) - 1 Step 24
 Zei = Zei + 1
 off = 0
 For Spa = 0 To 23
 If Spa = 7 Or Spa = 15 Or Spa = 22 Then
 Cells(Zei, Spa + off + 1) = ":"
 off = off + 1
 End If
 If Spa = 17 Then
 Cells(Zei, Spa + off + 1) = " "
 off = off + 1
 End If

 Cells(Zei, Spa + off + 1) = Replace(Mid(S(L + Spa), InStr(S(L + Spa), " ") + 1), ":", "")
 Next Spa
Next L
ActiveSheet.Columns.AutoFit
Ende:
End Sub
'
Sub tt2()
Dim S As String
ActiveSheet.UsedRange.ClearContents
Application.ScreenUpdating = False
Satz = ""
Zei = 1
Close
Open "C:\Download\ursprungsdoc.rtf" For Input As #1
'Open "H:\ursprungsdoc.rtf" For Input As #1
While InStr(S, "nowidctlpar") = 0
 Line Input #1, S
Wend
While Not EOF(1)
 Line Input #1, S
 Satz = Satz & S
Wend
Close
Satz = "{" & Satz
'MsgBox Len(Satz)
'Satz = Mid(Satz, 2, Len(Satz) - 2)
'MsgBox Left(Satz, 1)
'MsgBox Right(Satz, 1)
Call tt
Application.ScreenUpdating = True
End Sub

Hallo Reinhard,

VB5? Dann Projekt, Hinzufügen, vorhandenes Modul, den Namen
anklicken, fertig. :smile:

ist dann das Modul, der Code darin, auch vorhanden wenn ich
ein neues Projekt starte? Wär schön.

Nein. VB weiß doch nicht, was Du vor hast.

Ich habe eigene Module zum drucken von skalierbarem Barcode, zum FTP-Zugriff auf meine Server, zu bedienen von Programmen auf meinem Unix-Server in einer Telnet-Session … Was sollen die alle in einer einfachen Datenbankanwendung? Das sind hunderte Zeilen Code, viel zu viel, um sie in jedes belibige Projekt einfach mal so einzubinden.

Deinen Code sehe ich mir erst morgen an, heute bin ich erst mal zu müde dafür.

Gruß Rainer

Hallo Reinhard,

ich haeng mich hier auch mal mit dazwischen :wink:

Also wenn du irgend etwas rekursives tippseln willst, so musst du höllisch aufpassen. Sonst passiert dir genau das was du derzeit erlebst. Auch darfst du nicht gleich wild drauf los tippseln, sondern vorher ruhig einmal 5 Minuten überlegen wie man das am duemmsten lösen kann.

Zum Bsp. Eine Anwendung für eine Sub die sich selbst aufrufst ( Rekursion) bietet sich an wenn du alle Dateien aufgelistet haben willst, incl. der Unterordner :smile:

So wie ich das verstanden habe, willst du aus einer Zeichenkette die aus dem RTF File stammt immer alle { und dann das Gegenstueck dazu haben.

Warum willst du das so lösen und verwendest nicht einfach Split? Damit trennst du die Zeichenkette erstmal in alle Stuecke auf die mit einem { beginnen. Danach musst du nur das Array durchlaufen und schauen ob sich da auch das } Einmal befindet! Wenn nicht ist was faul .
Anhand des Array hast du dann ergo auch gleich den Inhalt was zwischen den geschweiften Klammern steht.

Also warum so kompliziert machen?
Oder habe ich die Thematik falsch verstanden?

By the Way. Auf Deine Frage hin, wie denn die Replace Funktion aussehen muss, habe ich oben ma ein neues Thema aufgemacht, mit den Funktionen die unter VB5 fehlen :smile:
Schreibe die einfach in ein Modul und speichere das. Wenn du nun ein Project erstellst, so gibst du dann nur das Modul an. (Neu -> Modul -> Vorhanden) an und schon hast du die gewuenschten Funktionen zur Verfügung :smile: Sicherlich koennte man diese auch fein in eine DLL verpacken aber dann musst du jedesmal die DLL mit ausliefern, was ja nicht sein muss :wink:

MfG Alex

Hi Alex,

Also warum so kompliziert machen?

wenn alle Inhalte von Klammerpaaren angezeigt werden sollen wird aus:

Test{a{b{c}{d}}e}

{a{b{c}{d}}e}
{b{c}{d}}
{c}
{d}

Das schafft Split nicht.

Gruß Rainer

Hallo Rainer,

wenn alle Inhalte von Klammerpaaren angezeigt werden sollen
wird aus:

Test{a{b{c}{d}}e}

{a{b{c}{d}}e}
{b{c}{d}}
{c}
{d}

Das schafft Split nicht.

Ok, da hast du Recht. Da hatte ich die Problematik falsch verstanden.
Habt ihr nun schon ne Lösung gefunden?

Gruß Rainer

MfG Alex

Hi Alex,

Habt ihr nun schon ne Lösung gefunden?

ja, mehrere. :smile:

Aber noch keine mit rekursivem Code, darum ging es Reinhard ja ursprünglich. Ich glaube inzwischen, daß eine Rekursion hier nicht weiter hilft.

Gruß Rainer

Hallo Rainer,

ja, mehrere. :smile:

Na fein :smile:

Aber noch keine mit rekursivem Code, darum ging es Reinhard ja
ursprünglich. Ich glaube inzwischen, daß eine Rekursion hier
nicht weiter hilft.

Man koennte es sicher mit einer Rekursion lösen *glaub*. Nur faehrt man da mit der Kirche ums Dorf. Eine Rekursion bietet sich an, wenn immer der selbe Source wieder ausgeführt werden soll, wie eben zum Bsp. eine File Suche.

Am besten den ganzen String in eine Schleife durchlaufen lassen und zeichen für zeichen prüfen. Ist einfacher und bringt das Köpfchen net zum rauchen *grins*

Gruß Rainer

MfG Alex

Hi Alex,

Am besten den ganzen String in eine Schleife durchlaufen
lassen und zeichen für zeichen prüfen. Ist einfacher und
bringt das Köpfchen net zum rauchen *grins*

na ja, Zeichen für Zeichen nicht gerade. Instr() mit passenden Startwerten ist schneller, das ist der Istzustand. :smile:

Gruß Rainer

Hallo Rainer,

na ja, Zeichen für Zeichen nicht gerade. Instr() mit passenden
Startwerten ist schneller, das ist der Istzustand. :smile:

Ich hab mir ehrlich gesagt darueber noch keinen Kopf gemacht.
Aber erstmal würde ich ueberprüfen ob die Anzahl der { gleich der } sind.

Mit Instr würde gehen. Aber dazu muesste man erst die ganzen { suchen und dann die entsprechenden }. Meinst du nicht das sich das mit dem durchsuchen der einzelenen zeichen besser machen würde, als immer instr zu verwenden und dann den Startwert erhöhen und das in einer schleife solange bis der richtige gefunden wurde? Ist ein ziemliches Chaos wo sich schnell ein Fehler einschleichen kann :frowning:

Habt ihr mal ein Testfile wo jeder mal testen kann, incl. Zeitmessung. So koennten wir die schnellste Variante finden :wink:

MfG Alex

Gruß Rainer