Es gibt eine Website, die Tausende von .csv-Dateien erstellen kann, die Tabellen enthalten. Die CSV-Dateien basieren auf den Informationen, die der Benutzer anfordert.Excel VBA: Meldungsfeldfehler in Verbindung
Ich erstellte eine Excel-Datei mit VBA-Skript. Der Benutzer gibt die Daten in die Excel-Datei ein, dann generiert das VBA-Skript die korrekte URL und versucht, die erforderlichen Daten von der .csv in dieser URL abzurufen.
In meiner Excel-Datei kann der Benutzer nach Hunderten von .csv-Tabellen fragen, und ich möchte, dass der Benutzer die Hunderte von Informationsarten eingeben kann, die er will, dann das VBA-Skript ausführen und den Computer arbeiten lassen es.
Ich zuerst URL-Prüfung, und wenn es in Ordnung ist, versuche ich, die Daten in der CSV-Datei in dieser URL zu erhalten.
die meiste Zeit, es funktioniert völlig in Ordnung. Funktioniert gut für einen Fall, wenn HttpExists TRUE zurückgibt, und funktioniert auch für einen Fall, dass HttpExists FALSE zurückgibt (es überspringt nur die aktuelle aktive Zelle und geht zu dem nächsten).
Aber es gibt ein paar Mal, dass die URL-Prüfung antwortet, dass die URL in Ordnung ist (HttpExists gibt TRUE zurück), aber als es versuchte, die Daten zu erhalten, öffnet es ein Meldungsfeld mit der Aufschrift "Entschuldigung, wir konnten nicht öffne 'URL-Adresse' ". (Meldungsfeld für Laufzeitfehler 1004) und dann werden die VBA-Skripte beendet.
Ich würde gerne wissen, wie ich es beheben kann. Wie kann ich die aktuelle URL im Fehlerfall überspringen, anstatt ein Meldungsfeld anzuzeigen, das den Skriptlauf beendet?
Sub my_method()
On Error GoTo handleCancel
Dim errorFlag As Boolean
.......
Do Until ActiveCell.Value = ""
errorFlag = True
URLstring= ....
........
If Not HttpExists(URLstring) Then
symbolStatus = "Data unavailable"
logAddress = updateLog("invalid URL " & ActiveCell.Value, logAddress, debugString)
Application.DisplayAlerts = False
Sheets(currentSymbol).Delete
Application.DisplayAlerts = True
Else
With Sheets(currentSymbol).QueryTables.Add(Connection:= _
"TEXT;" & URLstring _
, Destination:=Sheets(currentSymbol).Range(dataAddress))
.Name = ""
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 2
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 9)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
.......
errorFlag = False
handleCancel:
ActiveCell.Offset(1, 0).Select
If errorFlag = True Then
symbolStatus = "Data unavailable"
logAddress = updateLog("invalid URL " & ActiveCell.Value,
logAddress, debugString)
Application.DisplayAlerts = False
Sheets(currentSymbol).Delete
Application.DisplayAlerts = True
End If
Loop
End Sub
Function HttpExists(sURL As String) As Boolean
Dim oXHTTP As Object
Set oXHTTP = CreateObject("MSXML2.ServerXMLHTTP")
If Not UCase(sURL) Like "HTTP:*" Then
sURL = "http://" & sURL
End If
On Error GoTo haveError
oXHTTP.Open "HEAD", sURL, False
oXHTTP.send
HttpExists = IIf(oXHTTP.status = 200, True, False)
Exit Function
haveError:
HttpExists = False
End Function
Es geht manchmal mit einem messagebox von Laufzeitfehler aus 1004, und es geschieht in der Leitung von:
With Sheets(currentSymbol).QueryTables.Add(Connection:= _
"TEXT;" & URL _
Ich möchte es nur die aktuelle Zelle in einem Fehlerfall überspringen und mit der nächsten Zelle fortfahren, ohne eine Nachrichtenbox und ohne Absturz.
Wie kann ich es beheben?
Danke
Klingt wie gute alte Mode Fehlerbehandlung ist in Ordnung. Timeout-Benachrichtigungen haben nichts mit Ihrem Code zu tun, sondern mit dem Webserver. –
Danke. Wie kann ich es in meinem Code vermeiden? Falls es einen Fehler vom Server gibt, möchte ich keine Nachricht in meinem Code. Ich möchte nur, dass es zur nächsten Iteration der Schleife springt und weiterarbeitet. – alon