Keine Ausgabe nach On Error

Hallo,

folgendes Makro liest Daten aus Dateien im Internet.
Der Link wird aus einem Eintrag in Zeile 4-6/Spalte 2 erzeugt.

Sub WerteAktualisieren()
 
Range(Cells(4, 3), Cells(20, 10)).Select
Selection.ClearContents
Range("A1").Select
 
Dim z As Double
Dim e As Double
e = 6 'Bereichsende
 
For z = 4 To 6
 
On Error GoTo Fehler
 
 With ActiveSheet.QueryTables.Add(Connection:= \_
 "TEXT;http://de.old.finance.yahoo.com/d/quotes.csv?s=" & Cells(z, 2) & "&f=abl1c1&e=.csv" \_
 , Destination:=Cells(z, 3))
 .Name = "quotes.csv?s=ADS.DE&f=sl1c1&e=\_1"
 .AdjustColumnWidth = False
 .TextFileSemicolonDelimiter = True
 .Refresh BackgroundQuery:=False
 End With
 
Weiter:
 
Next z
 
Fehler:
 
 If z \>= e Then 'Bereich abgearbeitet?
 Resume Ende
 Else
 Resume Weiter
 End If

Ende:
 
End Sub

Ist der Eintrag zur Erzeugung des Links fehlerhaft wird mit einem Laufzeitfehler abgebrochen.
Um die Schleife denoch abzuarbeiten wollte ich „On Error“ verwenden.
Zum Testen steht in Zeile 5 ein fehlerhafter Eintrag.
Jedoch werden nun auch für den nachfolgenden Eintrag keine Werte mehr ausgegeben.
Wird das Makro erneut gestartet wird nun auch für die 1.Zeile nichts mehr ausgegeben.
Erst ein Neustart von Excel bringt wieder Werte für die erste korrekte Zeile.

cu

Hallo ghostkeeper.

Wenn ich mir den Durchlauf der Schleife bei einem Fehler vorstelle, dann könnte ich mir denken, daß der Wert von z nach einem Fehler nicht mehr erhöht wird und die Schleife bei einem Wert von bspw. 5 „hängenbleibt“ . Das sollte zwar eigentlich nicht so sein, allein aufgrund der Zeilenmarke „Weiter:“, ich bin mir da jetzt aber wirklich nicht sicher. Vielleicht ist es mal einen Versuch wert, „z“ nicht einfach mit „Dim“ zu deklarieren, sondern 'mal mit „Static“ (‚Double‘ ist als Datentyp eigentlich etwas übertrieben, ‚Long‘ sollte hier ausreichen).
Die Anweisung „On Error GoTo Fehler“ solltest Du auf jeden Fall vor die ForNext-Schleife schreiben.
Die Abfrage „If z>=e then…“ brauchst Du eigentlich überhaupt nicht, denn Du hast ja die Schleife ohnehin begrenzt auf 4 bis 6 (was dann auch die Deklaration von „e“ überflüssig machen würde).

Sub WerteAktualisieren()

Range(Cells(4, 3), Cells(20, 10)).Select
Selection.ClearContents
Range(„A1“).Select

Dim z As Double
Dim e As Double
e = 6 'Bereichsende

For z = 4 To 6

On Error GoTo Fehler

With ActiveSheet.QueryTables.Add(Connection:= _
„TEXT;http://de.old.finance.yahoo.com/d/quotes.csv?s=
& Cells(z, 2) & „&f=abl1c1&e=.csv“ _
, Destination:=Cells(z, 3))
.Name = „quotes.csv?s=ADS.DE&f=sl1c1&e=_1“
.AdjustColumnWidth = False
.TextFileSemicolonDelimiter = True
.Refresh BackgroundQuery:=False
End With

Weiter:

Next z

Fehler:

If z >= e Then 'Bereich abgearbeitet?
Resume Ende
Else
Resume Weiter
End If

Ende:

End Sub

Vielleicht hilft „Static“ ja weiter.
Viele Grüße
Carsten

hallo

warum machst du nicht gleich ein

on error resume next

?? hat den selben effekt (fehler werden einfach ignoriert), nur läuft das makro dann so wie erwartet. und zwar ohne den ganzen goto und resume-klimmbimm.

lg
erwin

Zum Testen steht in Zeile 5 ein fehlerhafter Eintrag.
Jedoch werden nun auch für den nachfolgenden Eintrag keine
Werte mehr ausgegeben.
Wird das Makro erneut gestartet wird nun auch für die 1.Zeile
nichts mehr ausgegeben.
Erst ein Neustart von Excel bringt wieder Werte für die erste
korrekte Zeile.

Hi Ghost,

mir war da auch zuviel Gehüpfe und das e hat irritiert.
Geht es überhaupt um Excel, da du hier an anderer Stelle nach OO-Calc fragst?
Jedenfalls konnte ich in XL97 nicht das nachstellen was du beschreibst.
Nachfolgend dein Code modifiziert.
Gruß
Reinhard

Option Explicit
'
Sub WerteAktualisieren()
Dim z As Double, e As Double
Range(Cells(4, 3), Cells(20, 10)).ClearContents
Range("A1").Select
On Error Resume Next
For z = 4 To 6
 With ActiveSheet.QueryTables.Add(Connection:="TEXT;http://de.old.finance.yahoo.com/d/quotes.csv?s=" & Cells(z, 2) & "&f=abl1c1&e=.csv", Destination:=Cells(z, 3))
 If Err.Number = 0 Then
 .Name = "quotes.csv?s=ADS.DE&f=sl1c1&e=\_1"
 .AdjustColumnWidth = False
 .TextFileSemicolonDelimiter = True
 .Refresh BackgroundQuery:=False
 Else
 Err.Clear
 End If
 End With
Next z
End Sub

Hallo Reinhard,

Geht es überhaupt um Excel, da du hier an anderer Stelle nach
OO-Calc fragst?

Ja, da die Funktion in OO mit csv leider nicht funktioniert.

Nachfolgend dein Code modifiziert.

Aber der Effekt ist der Gleiche, ab dem falschen Eintrag wird nichts mehr ausgegeben :frowning:

cu

Hallo,

weil damit der gleiche Effekt auftrat und ich weiter gegrübelt habe.
So waren die Abläufe besser zu verfolgen.

cu

Hallo,

daran liegt es auf keinen Fall, die Werte für z und der Name der Verknüpfung stimmen.

cu

hallo nochmal

schön langsam check ich’s

du erzeugst pro zelle, die du kopieren möchtest ein eigenes querytable-objekt. und sobald das erste query fehlschlägt, schlagen auch alle weiteren fehl - selbst wenn du das makro neu startest.

naja, kein wunder…

du müllst die querytables-auflistung mit queries voll und wunderst dich dann, wenn der excel-interne http-agent den geist aufgibt und erst durch einen excel-restart wieder reanimiert wird.

normalerweise erzeugt man ein einziges query-objekt, das man dann zur excel-datei speichert und nur mehr hin und wieder refreshed. probiers mal aus. ich kann es so nicht testen, da der von dir angegebene url nicht wirlich funktioniert - zumindest bei mir nicht - und ich auch sonst keine passenden testdaten habe.

lg
erwin

Hallo,

als Erstes, ich habe von VBA null Ahnung.
Die sind erste Versuche aus der Notwendigkeit heraus.

du müllst die querytables-auflistung mit queries voll und
wunderst dich dann, wenn der excel-interne http-agent den
geist aufgibt und erst durch einen excel-restart wieder

Warum passiert das nur bei einem falschen Link, sonst läuft das Makro (mind. 30 Durchläufe).

normalerweise erzeugt man ein einziges query-objekt, das man

Und wie kriegt man da die unterschiedlichen Links rein ?

der von dir angegebene url nicht wirlich funktioniert

Also anstelle von " & Cells(z, 2) & " Wertpapier.Handelsplatz (SIE.DE, SCL5NY.SG) einsetzen und der Link funktioniert.

cu