MS Access: Wie umgehen/unterdrücken ein Fehler?
Bin ich der Ausführung einer Abfrage wie dieser
select field from table;
In dieser Abfrage, dort ist eine Schleife laufen auf vielen Tischen. So, wenn das Feld nicht vorhanden ist, in eine Tabelle bekomme ich einen
Laufzeitfehler 3061
Wie kann ich durch diesen Fehler übergeben, wie Sie auf diese Fehler fließen sollten, gehen Sie zu einem anderen Punkt?
Dies ist der code, ich habe vor kurzem, nachdem Sie durch dieses forum.
Option Explicit
Private Sub UpdateNulls()
Dim rs2 As DAO.Recordset
Dim tdf As DAO.TableDef
Dim db As Database
Dim varii As Variant, strField As String
Dim strsql As String, strsql2 As String, strsql3 As String
Dim astrFields As Variant
Dim intIx As Integer
Dim field As Variant
Dim astrvalidcodes As Variant
Dim found As Boolean
Dim v As Variant
Open "C:\Documents and Settings\Desktop\testfile.txt" For Input As #1
varii = ""
Do While Not EOF(1)
Line Input #1, strField
varii = varii & "," & strField
Loop
Close #1
astrFields = Split(varii, ",") 'Element 0 empty
For intIx = 1 To UBound(astrFields)
'Function ListFieldDescriptions()
Dim cn As New ADODB.Connection, cn2 As New ADODB.Connection
Dim rs As ADODB.Recordset, rs3 As ADODB.Recordset
Dim connString As String
Dim SelectFieldName
Set cn = CurrentProject.Connection
SelectFieldName = astrFields(intIx)
Set rs = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, Empty, SelectFieldName))
'Show the tables that have been selected '
While Not rs.EOF
'Exclude MS system tables '
If Left(rs!Table_Name, 4) <> "MSys" Then
strsql = "Select t.* From [" & rs!Table_Name & "] t Inner Join 01UMWELT On t.fall = [01UMWELT].fall Where [01UMWELT].Status = 4"
End If
Set rs3 = CurrentDb.OpenRecordset(strsql)
'End Function
strsql2 = "SELECT label.validcode FROM variablen s INNER JOIN label ON s.id=label.variablenid WHERE varname='" & astrFields(intIx) & "'"
Set db = OpenDatabase("C:\Documents and Settings\Desktop\Codebook.mdb")
Set rs2 = db.OpenRecordset(strsql2)
With rs2
.MoveLast
.MoveFirst
astrvalidcodes = rs2.GetRows(.RecordCount)
.Close '
End With
With rs3
.MoveFirst
While Not rs3.EOF
found = False
For Each v In astrvalidcodes
If v = .Fields(0) Then
found = True
Debug.Print .Fields(0)
Debug.Print .Fields(1)
Exit For
End If
Next
If Not found Then
msgbox "xxxxxxxxxxxxxxxx"
End If
End If
.MoveNext
Wend
End With
On Error GoTo 0 'End of special handling
Wend
Next intIx
End Sub
Ich bin immer ein
Typen Unverträglich Laufzeitfehler
in Set rs3 = CurrentDb.OpenRecordset(strsql)
Ich denke, ich bin die Vermischung ado
und dao
aber ich bin mir nicht sicher, wo es ist.
- First off: Beenden Sie die Verwendung von GoTo. Sofort. Ist es schlecht. Ich meine wirklich böse, wie in "Pandora' s Box". Der einzige Ort, an Springen ist gültig in VB-code ist in "On Error Goto" - Anweisungen.
- Zweitens: Ändern Sie die "On Error Resume Next" - Stil, es ist viel eher angebracht hier. Haben Sie überprüft, dass 3061 ist die tatsächliche Anzahl der Fehler? Mit dem debugger Schritt für Schritt durch den code.
- ich widerwillig codiert springen, aber ich habe entfernt ich habe versucht zu Debuggen, aber immer noch gleiche Fehler 3061
- Ich werde meine Antwort ändern etwas, das sollte funktionieren.
- Ich kann nicht sehen, eine single "On Error Resume Next" in Ihrem code. Das ist, warum es nicht funktioniert. Andere, die - nichts für ungut, aber Ihr code ist ein Chaos. Möchten Sie vielleicht, um es zu säubern ersten. Ich denke, Sie fehlt auch ein bisschen das Lesen in Bezug auf VB im Allgemeinen und Access VBA-spezifisch.
- Von clean-bis ich meine fix den Einzug, entfernen Sie code, der nicht ausgeführt wird, brechen code in kleineren Einheiten und nicht alles in eine große Funktion, entfernen Sie überschüssige Leerzeilen... Dinge wie, dass.
- rs3 braucht ein DAO-recordset, Sie haben Dim rs3 As ADODB.Recordset
- Dank viel Remou und Tomalak ich glaube, ich hab es geschafft, dass etwas funktioniert.
- error-trapping-Anweisungen: ein code von mir, in dem ich ein paar Fehler trapping-Anweisungen ausgeführt wurde fein vor ein paar Tagen, aber jetzt plötzlich ist es nicht abfangen, den Fehler und die Fehlermeldung herausspringen. Ich hatte keine änderungen an den code. Vermutungen wat falsch sein könnte
- On Error Resume Next ist gefährlich, weil es nicht immer "go out of scope", wenn Sie denken, es sollte. Wenn Sie einen bestimmten Fehler, die Sie erwarten zu geschehen, und Sie möchten, es zu ignorieren, dann schreiben Sie einen error-handler, der ignoriert es. Nicht nur ignorieren Sie alle Fehler auszumerzen, die Sie erwarten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt abfangen der Fehler, warum man nicht die TableDefs-überprüfen Sie das Feld oder die Verwendung einer Mischung von ADO und DAO? ADO-Schemas kann eine Liste von Tabellen das gewünschte Feld:
Verwenden Sie die
On Error
- Anweisung, die VBA versorgt:Alternativ können Sie schalten Sie die automatische Fehlerbehandlung (z.B. brechen die Ausführung und zeigt eine Fehlermeldung) auf einer line-by-line-basis:
Gibt es diese Aussagen zur Verfügung:
On Error Resume Next
schaltet VBA-integrierte Fehlerbehandlung (Nachricht, box etc.) komplett, Ausführung einfach Lebensläufe in der nächsten Zeile. Sicher sein, zu prüfen, ob ein Fehler sehr früh, nachdem Sie verwendet haben, die, wie ein baumelnden Fehler kann stören die normale Ausführung fließen. Den Fehler löschen, sobald Sie gefangen, um das zu verhindern.On Error Goto <Jump Label>
die Ausführung zu einem bestimmten label, in Erster Linie für den pro-Funktion, Fehler-Handler, die fangen alle möglichen Fehler.On Error Goto <Line Number>
Lebensläufe in einer bestimmten Zeilennummer. Bleiben Sie Weg von, dass, es ist nicht sinnvoll, sogar gefährlich.On Error Goto 0
es enger verwandter. Bricht die Selbstverständlichkeit VBA integrierte Fehler-management (message-box etc.)BEARBEITEN
Aus der bearbeiteten Frage, dies ist mein Vorschlag um das problem zu lösen.
Sicher sein, um den Fehler zu löschen in jedem Fall, bevor Sie sich mit einer Schleife in der gleichen Sub oder Funktion. Wie ich schon sagte, ein herabhängendes Fehler verursacht, dass die code flow zu unerwarteten!
Versuchen Sie dies:
On Error Resume Next ' Wenn ein Fehler Auftritt, fahren Sie zur nächsten Anweisung.
...- Anweisung, die versucht, die select...
If (Err <> 0) Dann
Ende, Wenn
On Error Goto 0 ' Reset Fehlerbehandlung zum vorherigen Zustand.