2016-04-11 4 views
2

Ist es möglich, ein öffentliches Sub zu erstellen, das einen bestimmten Fehlercode verarbeitet? Ich habe mehrere Textfelder und Aktualisierungsschaltflächen in meinem Formular, mit denen Text in bestimmten Tabellen durch die Zeichenfolgen aus den Textfeldern ersetzt wird.Microsoft Access VBA - Gibt es eine Möglichkeit, ein öffentliches Sub zu erstellen, das einen bestimmten Fehlercode verarbeitet?

Wenn die Zeichenfolge im Textfeld jedoch einen Apostroph enthält, wird der Fehlercode "3075" ausgegeben. Ich möchte keinen Fehlerhandler für jede Sub schreiben; Ist es möglich, ein öffentliches Sub zu erstellen und es aufzurufen, wenn der Fehler 3075 auftritt?

EG - das ist, was die Öffentlichkeit sub aussehen könnte:

Public Sub ErrHandler() 
If Err.Number = 3075 Then 
MsgBox("You can't use apostrophes in the text box") 
End If 
End Sub 

Dann so etwas wie dies in jedem Unter gehen, die ein Textfeld hat:

On Error Call ErrHandler 

ich den obigen Code versucht haben, Es funktioniert nicht. Fragte sich nur, ob jemand andere Ideen oder Workarounds dafür hat?

EDIT:

Hier ist der Code für die Update-Button. Er ersetzt das ausgewählte Element in der Listbox (TelephoneList) durch die Zeichenfolgen aus den Textfeldern ('txtTele' und 'txtDescription;)

Die Listbox zeigt Einträge aus der Tabelle' LPA-Telefon 'an.

Private Sub UpdateTelephoneButton_Click() 
If Not IsNull(txtTele) And Not IsNull(TelephoneList.Column(0)) Then 
    CurrentDb.Execute "UPDATE [LPA Telephone] " & _ 
    "SET [Telephone] = '" & Me.txtTele & "'" & _ 
    ", [Description] = '" & Me.txtDescription & "'" & _ 
    "WHERE [ID] = " & Int(TelephoneList.Column(0)) & "" 

    TelephoneList.Requery 
End If 
End Sub 
+0

Sie sollten keine Probleme haben, Apostrophe in Textfelder setzen. Sie sollten auch Ihren Update-Code veröffentlichen. – Zaider

+0

@Zaider Ich habe den Code für die Update-Taste hinzugefügt. Es könnte die Art sein, dass ich den Code geschrieben habe, der mich nicht in die Lage versetzt, Apostrophe zu verwenden - sie scheinen diese Abschnitte zu stören: = '"& Me.txtTele &"' " = '" & Me .txtDescription & "'" – Alex

+0

Das Problem mit Ihren SQL-Anweisungen ist, sobald Sie einen Apostroph getroffen haben, ändert sich der SQL-Code. Sie könnten in parazentrale Abfragen suchen, die am besten wären oder eine Funktion wie 'Public Function RQuote (s As Variant) als Variante verwenden RQuote = Ersetzen (s," "", "" "" "") End Function " Das würde sie ersetzen und Benutzern ermöglichen, Apostrophe zu verwenden. – Zaider

Antwort

4

Warum nicht passieren Sie Err.Number als Parameter an die Sub? Dann sollte es gut funktionieren.

On Error Goto ErrorHandler 
...yourCode 
...yourCode 


Exit Sub 

ErrorHandler: 
Call ErrHandler(Err.Number) 
Resume Next 

und dann

Public Sub ErrHandler(ErrorNumber as Long) 

If ErrorNumber = 3075 Then 
    MsgBox("You can't use apostrophes in the text box") 
End If 

End Sub 

Hinweis: der obige Code nicht getestet. Ich habe es einfach von meinem Kopf geschrieben und könnte etwas Feinabstimmung brauchen. Dennoch hoffe ich, dass die Grundidee klar ist.

+0

Nun, ich kann anscheinend nicht in der Lage sein, die 'Call'-Funktion zu verwenden, während' On Error 'verwendet wird; das scheint ein Teil des Problems zu sein. Ich werde benachrichtigt, entweder 'GoTo' oder 'Resume' zu verwenden. – Alex

+0

@Alex: Ja, natürlich. Wenn ich es beim Schreiben vergessen habe, ohne es zu testen (wie gesagt). Natürlich müssen Sie eine Fehlerbehandlungsroutine in Ihrer Subroutine haben. Wie in [MSDN] (https://msdn.microsoft.com/en-us/library/5hsw66as.aspx) beschrieben, können Sie nur eine bestimmte Zeile mit 'GoTo' bearbeiten, um Fehler zu behandeln. Ich habe die Lösung entsprechend aktualisiert. – Ralph

1

Als Hilfe gibt es eindeutig: Sie

können
On Error GoTo line 
On Error Resume Next 
On Error GoTo 0 

So könnte man so etwas wie dies versuchen:

Sub someSubOrFunction() 

on error goto hell 

doSomeStuff 

adios: 
exit sub 

hell: 
Call ErrHandler(Err.Number, "someSubOrFunction") 
resume adios 'label or Next or nothing 
end sub 

Persönlich kann ich diesen Ansatz nicht mögen, weil die Vorteile minimal sind und Sie verlieren viel an Flexibilität. Ich schreibe meine Fallbehandlung lieber von Fall zu Fall und verwende schließlich eine generische Funktion (oder eine Klasse) nur für die Fehlerprotokollierung.

0

Eine weitere Standardmethode ist zu Unterklasse die err Objekt, wie folgt aus:

(in globales Modul)

Public Err As ErrObject 

(beim Start)

Set Err = New ErrObject 

Ein Beispiel Ich finde im Internet ist das in dem Buch Advanced Microsoft Visual Basic gegeben.Ich werde den vollständigen Text nicht wiederholen: Klasse ErrObject startet wie folgt:

Private e() As ErrObjectState 

Private Type ErrObjectState 
Description As String 
HelpContext As Long 
HelpFile As String 
Number As Long 
End Type 

Public Property Get Description() As String 
Description = VBA.Err.Description 
End Property 
Verwandte Themen