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.
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).
?? 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.
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
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.
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.