Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Pergus am März 30, 2011, 07:29:39

Titel: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Pergus am März 30, 2011, 07:29:39
Hallo Accessler!

Was mache ich falsch?

In Form!sfrmMitgliederStempelungen steht folgende Code:

Private Sub Mitglied_Click()

If errorhandling Then On Error GoTo fehlerbehandlung

Forms!frmStempelungen.button_zurueck_Click.Click

Forms![frmStempelungen].Controls![button_rueber].Enabled = False
Forms![frmStempelungen].Controls![button_zurueck].Enabled = True

Exit Sub
fehlerbehandlung:
   MsgBox "Fehler " & Err.Number & ": " & Err.Description, vbCritical

End Sub


Diese ruft im Form!frmStempelungen folgende Code auf:

Public Sub button_zurueck_Click()
Dim rs As DAO.Recordset

If errorhandling Then On Error GoTo fehlerbehandlung

If IsNull(Me![Stempelungsmitgliederliste]![tblMitgliederStempelungen.MitgliedsID]) Then Exit Sub

Set rs = CurrentDb.OpenRecordset("tblMitgliederStempelungen", dbOpenDynaset)

rs.FindFirst "MitgliedsID=" + Str(Me![Stempelungsmitgliederliste]![tblMitgliederStempelungen.MitgliedsID]) + " and StempelungsID=" + Str(Me![StempelungsID])
If rs.NoMatch Then Exit Sub
rs.Edit
rs.Delete
rs.Close

Mitgliederliste.Requery
Me![Stempelungsmitgliederliste].Requery

Set rs = Nothing

Exit Sub
fehlerbehandlung:
   MsgBox "Fehler " & Err.Number & ": " & Err.Description, vbCritical

End Sub


Das interessante dabei: Alles funktioniert einwandfrei nur,
sobald die letztere Code das End Sub erreicht kommt die Meldung

Laufzeitfehler '424' Objekt erforderlich

Weiß jemand Rat?

Gruß

Pergus
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Hondo am März 30, 2011, 08:17:07
Hallo,
was soll denn tblMitgliederStempelung sein? Eine Tabelle oder was?
Wenn das Feld MitgliedsID heißt dann schreib doch einfach so:
Me!MitgliedsID

Was du machst ist Spaghetti-Code und führt zwangsweise zu Fehlern und Unleserlichkeit.
Lagere Prozeduren die mehrfach verwendet werden in Module aus und ruf nicht fremde Formular-Prozeduren auf, das ist ganz schlechter Stil.
Und warum ein Click-Ereignis im fremden Form per Code auslösen?

Ich denke dass du da einiges falsch machst.

Andreas
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: database am März 30, 2011, 09:12:21
Hallo,

Bitte die Hinweise von Andi beachten!


versuch mal so ...

If IsNull(Me![Stempelungsmitgliederliste]![MitgliedsID]) Then Exit Sub

tblMitgliederStempelungen.MitgliedsID --- kann hier nicht gehen tblMitgliederStempelungen existiert zu dem Zeitpunkt noch nicht - und würde auch in dem Zusammenhang nicht benötigt werden.

... und ....

rs.FindFirst "MitgliedsID=" & Str(Me![Stempelungsmitgliederliste]![MitgliedsID]) & " and StempelungsID=" & Str(Me![StempelungsID])

Strings mit  &  verbinden,
Me![Stempelungsmitgliederliste]![tblMitgliederStempelungen.MitgliedsID] ---  wenn Stempelungsmitgliederliste ein UFo ist, wird MitgliedsID ein Steuerelemnt desselben sein.
Daher muss auch die Datenherkunft (das Recordset - tblMitgleiderStempelungen) nicht angegeben werden.
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Pergus am März 30, 2011, 22:19:29
Hallo Andreas (Hondo), hallo Peter (database)!

Eure Meinung ist mir ziemlich wichtig und ich bemühe mich so gut es geht diese zu verstehen und umzusetzen.
Meine Kenntnisse in VBA basieren rein auf Selbsterlerung, zwei Access-Büchern (allerdings beide 2003) und "Internethilfe",
ein weiteres Manko ist, dass ich auch kein Englisch spreche oder verstehe (ist in Italien leider erst seit kurzen im schulischen Unterricht,
soweit man keine Hochschule besucht hat!)!

Hatte gestern meine erste Access-Schulung, die mit Dienstag, den 05. April den zweiten und letzten Tag beinhaltet, die ich privat besuche!

Aber nun zu Euren Antworten, zuerst mal danke dafür!

Also zu Andreas Antwort:

ZitatHallo,
was soll denn tblMitgliederStempelung sein? Eine Tabelle oder was?
Wenn das Feld MitgliedsID heißt dann schreib doch einfach so:
Me!MitgliedsID

Was du machst ist Spaghetti-Code und führt zwangsweise zu Fehlern und Unleserlichkeit.
Lagere Prozeduren die mehrfach verwendet werden in Module aus und ruf nicht fremde Formular-Prozeduren auf, das ist ganz schlechter Stil.
Und warum ein Click-Ereignis im fremden Form per Code auslösen?

Ich denke dass du da einiges falsch machst.

Andreas

Habe aus einem Access-Buch (Das Access 2003 Entwicklerbuch von Andrè Minhorst)
folgende Präfixe (laut 'ungarischer Notation', verwende allerdings derzeit nur diese,
da ich mich doch ziemlich schwer tue, alle, und zwar richtig, zu verwenden  :-[ )
übernommen:


Somit zur ersten Frage
Zitatwas soll denn tblMitgliederStempelung sein? Eine Tabelle oder was?
Ja, und zwar in einer n:m-Beziehung zwischen tblMitglieder und tblStempelungen. Darin werden die anwesenden Mitglieder zur jeweiligen Übung oder zum jeweiligen Einsatz gespeichert!
Zur Info: Das soll eine Vereinsdatenbank für eine Zivilschutzstelle werden, die ich auch mit Eurer großartigen Hilfe versuche zu bewerkstelligen.

Zu Deinem Tip
ZitatLagere Prozeduren die mehrfach verwendet werden in Module aus und ruf nicht fremde Formular-Prozeduren auf, das ist ganz schlechter Stil.
werde mich weitgehend informieren wie man sowas macht, weil das für mich derzeit soviel wie Bahnhof heißt!

Zur nächsten Frage:
ZitatUnd warum ein Click-Ereignis im fremden Form per Code auslösen?
Um das zu Erkären würde ich gerne meine bisherige Datenbank posten, da die max. Größe aber 200kB nicht überschreiten soll, habe ich ein Problem, meine Datenbank ist derzeit ca. 1.800kB. Mit Deiner persönlichen Erlaubnis, würde ich sie Dir (evtl. auch Dir Peter) gerne zukommen lassen, allerdings mit geänderten Daten (Ihr versteht...)
Hatte aber, um diese Frage zu beantworten, ein Thema eröffnet (siehe dazu http://www.access-o-mania.de/forum/index.php?topic=14061.0 (http://www.access-o-mania.de/forum/index.php?topic=14061.0)). Im vorletzten Beitrag findest Du eine Skizze, das ich zur Erläuterung gepostet habe.

Zu Deiner letzten Frage
ZitatIch denke dass du da einiges falsch machst.
Das glaube ich Dir auf´s Wort, bin aber, was das Erlernen angeht, bestrebt es so gut wie nur möglich hinzubekommen (wohl hauptsächlich durch Eure Hilfe, da ich ein Buch schwer befragen kann!)  ;)

Nun zu Franz Antwort:

Ich bewundere Dein Wissen und freue mich auf jede Deiner Antworten, weil diese, wie Du bereits weißt,
mich bisher immer zu einem erfolgreichen Ergebnis geführt haben!

Ich werde auch diese Tipps sobald als möglich versuchen anzuwenden!  ;)

Euch beiden ein aufrichtiges

Vergelt´s Gott

Pergus (Gustav)
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Hondo am März 31, 2011, 08:29:09
Franz?
In dem Thread gibts bislang kein Franz. Du meinst wohl Peter.
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Pergus am März 31, 2011, 18:53:52
Hallo Hondo!

Danke daß Du mich auf den Fehler aufmerksam gemacht hast!

Ich entschuldige mich förmlich bei PETER, den ich zu meiner Schande Franz genannt habe!!! War kurz mit einem Kollegen namens Franz am Telefon und schon ist das Missgeschick passiert!

Grüße aus Südtirol

Pergus
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: database am April 01, 2011, 07:36:04
Hallo und guten Morgen nach ST

Ich denke, dass das kein so großes Vergehen war, das eine Entschuldugung in aller Förmlichkeit bedürfte!  ;) :D :D :D
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Pergus am April 01, 2011, 17:15:39
Hallo Peter,

Dein Tipp war wieder richtig! Alles funktioniert super!

Übrigens, darf ich Dich fragen wie man das, was der Andreas gemeint hat (zwecks Prozedur auslagern, usw.), macht!
Würdest Du mir freundlicherweise ein kleines Beispiel (für mich als Anfänger) posten!

Danke vielmals

Gustav
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: database am April 02, 2011, 11:45:09
Hallo Gustav,

freut mich, dass es passt  ;) ;D

Das mit dem Auslagern ist recht einfach!
Das Zauberwort, welches hierbei zum Einsatz kommt ist: Wiedeverwendbarkeit - also Code, der nicht nur in einem Formularmodul eingesetzt werden soll sondern von mehreren Stallen aus zugänglich sein soll.
Freilich lässt sich das auch so bewerkstelligen wie du das gemacht hast, aber wie Andi bereits richtig angemerkt hat, ist das ein recht schlechter Programmierstil.
Ausserdem muss dazu noch die Prozedur in einem Formular 'Public' deklariert werden und, und, und ....

Es geht dabei um Code, der mehrfach eingesetz werden soll oder kann.
So zum Beispiel eine bestimmte Berechnung, die du in verschiedenen Formularen benötigst, also die gleiche Formel aber eventuell mit unterschiedlichen Parameterwerten.
Wenn man so etwas braucht packt man die Berechnung in eine PUBLIC Function und verfrachtet diese in ein Standardmodul - also beispielsweise so:



Public Function BerechneWas(ByVal Hilfswert1 as Long, byVal Hilfswert2 as Double) As Double

    Dim Ergebnis as Double
    'Berechnung durchführen
    Ergebnis = Hilfswert2 * Hilfswert1
    'Berechnungsergebnis zurückliefern
    BerechneWas = Ergebnis

End Function


In einem Formular hast du einen Button und wenn der Benutzer auf diesen klickt, soll aus 2 Formularfeldern
ein Wert genommen werden, diese sollen multipliziert werden und das Ergebnis in ein drittes Feld eingetragen werden.
Dann würdest du in diesem Formular ins Klick-Ereignis des Buttons folgendes schreiben:

Private Sub Button1_Click()

     Me!Formularfeld3 = BerechneWas(Me!Formularfeld1, Me!Formularfeld2)

End Sub

Ich habe dir ein Beispiel angehängt, in dem es um die Erzeugung einer Angebotsnummer geht.
Hier spielt dann auch der Zugriff auf eine Tabelle mit und eben das Zurückliefern eins Wertes aus einer 'ausgelagerten' Function.

Bitte die hier geposteten Codezeilen ausschließlich als Demo zu sehen.
Ebenso erhebt der Code im Beispiel keinesfalls den Anspruch auf Vollständigkeit etc.  ;)
Ist halt alles SEHR einfach gehalten und soll dir nur zeigen wie's technisch gelöst wird.

Hoffe das bringt dich wieder ein wenig weiter!


[Anhang gelöscht durch Administrator]
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Pergus am April 02, 2011, 15:10:31
Hallo Peter,

jetzt verstehe ich den Sinn des auslagerns.
Auf Anhieb erkenne ich, dass die Code recht kompakt gehalten wurde, somit die Lesbarkeit bei weitem vereinfacht ist.
Zudem kann die ausgelagerte Code des Öfteren verwendet werden,
auch für Aufrufe aus verschiedenen Formularmodulen,
vorausgesetzt die "Berechnungsart" ist die Gleiche.

Der ausgelagerten Prozedur werden Werte übergeben,
diese führt den gewünschten Zweck aus und leert die Werte, sobald die Prozedur beendet ist.
Habe ich das so korrekt verstanden?

Das ist ja großartig, man spart sich damit ganz schön viel Programmierarbeit!

Habe inzwischen darüber was im "Das Access 2003 Entwicklerbuch" von Andrè Minhorst gefunden,
da geht es z.B. um die Codeauslagerung der OK-Schaltfläche.
Z.B. ist da die Rede von "Instanzieren des Codeklasse-Objekts", "Formular-Klassenmodul", usw.
Ganz ehrlich gesagt, blicke ich da nicht wirklich durch,
darum bin ich heilfroh, dass Du mir ein "einfaches" Beispiel gebracht hast,
mit dem ich was anfangen kann!

Ich danke Dir nochmals

Schöne sonnige Grüße aus Bozen

Gustav
Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: database am April 02, 2011, 19:25:35
Hallo Gustav,

ZitatHabe ich das so korrekt verstanden?
Jou, hast du!

Wichtig ist, dass du das Prinzip verstanden hast und ich denke, dass du mit ein paar Versuchen das relativ rasch 'intus' haben wirst.
Meine Beispiele sind halt recht einfach gehalten und in der kleinen Datei im Anhang OHNE Wertübergabe.
Aber ich glaube du hast auch so wirklich verstanden, worum es dabei geht.

ZitatHabe inzwischen darüber was im "Das Access 2003 Entwicklerbuch" von Andrè Minhorst gefunden

VBA ist mit VB recht eng verwandt (VB6.0) und enthält natürlich auch sehr viele oder die meisten Funktionalitäten dieser Programmiersprache.
VB6.0 gilt als s.g. 'objektnahe Programmiersprache' - den Sprung zur Objektorientiertheit hat sie nicht ganz geschaft - leider. (wobei die Meinungen über VB6.0 recht weit
gestreut sind und ich keine Grundsatzdiskussion diesbezüglich anfachen oder gar führen will)
Allerdings kann ähnlich wie in VB6.0 auch mit VBA objektnah Programmiert werden und genau diese Technik ist im Entwicklerbuch von Andrè Minhorst unter Anderem beschreiben.
In meiner Signatur findest du übrigens einen Link auf das Access 2007 Entwicklerbuch, ebenfalls vom gleichen Autor (Nr. 2).

Schau dich überhaupt mal in meiner Linksammlung der Signatur um ... da gibt's sicher auch was Interessantes für dich!  ;)

ZitatSchöne sonnige Grüße aus Bozen
Die darf ich gerne erwidern - auch in Niederösterreich lachte heute den ganzen Tag die Sonne!

Titel: Re: Laufzeitfehler '424' Objekt erforderlich
Beitrag von: Pergus am April 03, 2011, 20:07:41
Hallo Peter,

hast Du selbst mal darüber nachgedacht, ein Access-Buch zu schreiben?  ;)
Ich, und sicher viele Andere dankbare Access-O-Maniacs, würden es sofort kaufen!  ;)

Gruß, und danke

Gustav