waldgnarf
Goto Top

VBScript Error in einer Schleife

Hallo, habe nochmal ein Problem mit meinem OpenOffice Dokument. :/
Ich wollte in die Loop Schleife eine Funktion einbauen die ausgeführt wird falls mein gesuchter String im Dokument in keiner Zelle gefunden wird.

Deshalb hab ich es mit "On Error Resume Next" und nach dem Loop "If Not SUCHSTRING=STRING Then ..." versucht aber dann läuft der Script ewig weiter. Gibt es eine Möglichkeit die Error Meldung und den Abbruch danach durch eine Funktion in einem Loop zu ersetzen?

Grüße waldgnarf

Content-ID: 96567

Url: https://administrator.de/forum/vbscript-error-in-einer-schleife-96567.html

Ausgedruckt am: 23.12.2024 um 13:12 Uhr

bastla
bastla 10.09.2008 um 13:59:17 Uhr
Goto Top
Hallo waldgnarf!

Was Du vorhast, lässt sich am sinnvollsten mit einem Schalter lösen, etwa:
Gefunden = False
For ...
...
If SUCHSTRING = STRING Then
    ...
    Gefunden = True
End If
...
Next
If Not Gefunden Then
   ..
End If

Grüße
bastla

P.S.: Ich nehme an, Du wolltest Dir die Freude, das selbst einzubauen, nicht nehmen lassen, und hast daher den aktuellen Stand des Scripts nicht gepostet ... face-wink
waldgnarf
waldgnarf 10.09.2008 um 16:02:19 Uhr
Goto Top
Ehrlich gesagt ist es mir schon peinlich, das ich an diese Dinge nicht schon beim ersten Threat gedacht habe. Ist ja quasi immernoch fast dasselbe Thenma, sorry. Die Error-Fehlermeldung kommt leider immer noch, auch wenn ich
If Not Gefunden Then
MsgBox "JUHU"  
End If
noch vor Loop Until setze.

Set BLATT=CALC.getSheets().getByIndex(INDEX)
POSY=0
POSX=0
PFLGRU=InputBox("Gruppen Name", "Pflanzen Gruppen Name", "Gruppe")  
If PFLGRU="" Then  
WScript.Quit
End If
EINGRU=UCase(PFLGRU)
     Gefunden=False
Do
Set ZELLE=BLATT.getCellByPosition(POSY, POSX)
INHALT=ZELLE.getFormula()
NOTITZ=ZELLE.getAnnotation().String
INHSPL=Split(INHALT, " ")  
For Each INHSTR In INHSPL
INHTRI=Trim(UCase(INHSTR))
If INHTRI=EINGRU Then
     Gefunden=True
Exit Do
End If
Next
NOTTRI=Trim(UCase(NOTITZ))
If NOTTRI=EINGRU Then
     Gefunden=True
Exit Do
End If
POSX=POSX+1
If INHALT="" Then  
INDEX=INDEX+1
Set BLATT=CALC.getSheets().getByIndex(INDEX)
POSX=0
End If
Loop Until INHTRI=EINGRU
     If Not Gefunden Then
     MsgBox "JUHU"  
     Else
     MsgBox "STANDARD"  
     End If

Gruß waldgnarf
bastla
bastla 10.09.2008 um 16:23:05 Uhr
Goto Top
Hallo waldgnarf!

Du verwendest ja (in Zeile 33) eine Schleifenabbruchsbedingung der Art: "Du machst weiter, bis Du das gesuchte Wort gefunden hast (und wenn es ewig dauert)!" face-wink

Da es aber weniger eine Zeitfrage ist, sondern eher von der Anzahl der Tabellen, die insgesamt durchsucht werden können, abhängt, könntest Du vor Zeile 30 einfügen:
IF INDEX > CALC.Sheets.Count - 1 Then Exit Do
Grüße
bastla
waldgnarf
waldgnarf 10.09.2008 um 16:40:26 Uhr
Goto Top
Vielen Dank für die Hilfe, klappt natürlich super.

Gruß waldgnarf
waldgnarf
waldgnarf 23.09.2008 um 11:56:38 Uhr
Goto Top
Hallo, habe nochmal eine letzte Frage zur Schleife.
Ich möchte den Gesamten Text eines Blattes, also in jeder Zelle in eine Textdatei übertragen.
Dabei soll der Text einer jeden Zelle eine neue Zeile in der Textdatei sein.

Do
Set ZELLE=BLATT.getCellByPosition(POSY, POSX)
INHALT=ZELLE.getFormula()

TEXTDATEI=DATEI.OpenAsTextStream(1).ReadAll&vbCrLF:DATEI.OpenAsTextStream(2).WriteLine INHALT

POSY=POSY+1
Loop Until BLATT.getCellByPosition(20, POSX).getFormula()=""  
CALC.Close (True)

Die Schleife sollte erstmal nur in Zeile 1 bis zur 20sten Zelle laufen, aber in der Textdatei steht nur der Text der ersten Zelle.
Der Loop scheint nicht zu funktionieren, ich habe keine Ahnung warum nicht.

Gruß waldgnarf
bastla
bastla 23.09.2008 um 13:41:20 Uhr
Goto Top
Hallo waldgnarf!

Zur Schleife - wenn diese bis zur ersten leeren Zelle in Zeile POSX, aber maximal bis zur Spalte 20 laufen soll, müsste die Bedingung lauten:
Loop Until BLATT.getCellByPosition(POSY, POSX).getFormula()="" Or POSY>20  
Wozu dient das Einlesen der Textdatei innerhalb der Schleife? Zum Erstellen wäre ja nur der Teil
DATEI.OpenAsTextStream(2).WriteLine INHALT
erforderlich ...

Alternativ zum Schreiben jeder einzelnen Zelle könntest Du alle Zellen/Zeilen vorweg in einer Variablen sammeln und dann "am Stück" schreiben - in der Schleife:
GESAMTTEXT = GESAMTTEXT & vbCrLF & INHALT
Nach der Schleife:
DATEI.OpenAsTextStream(2).Write Mid(GESAMTTEXT, 3)
Durch die Verwendung des Strings GESAMTTEXT erst ab Position 3 wird die überzählige Zeilenschaltung nicht in die Datei geschrieben.

Grüße
bastla
waldgnarf
waldgnarf 23.09.2008 um 15:30:55 Uhr
Goto Top
Danke, funktioniert wie ich wollte.

Grüße waldgnarf