Hallo zusammen,
ich versuche seit Stunden bei dem Formular Form1!Ufo über ein Button folgenden Code auszuführen und Formular Form2 mit dem Openargs zu öffnen:
Dim stDocName As String
stDocName = "Form2"
DoCmd.OpenForm stDocName, , , , , , "Forms!Form1!Ufo"
Das Form2 ist ein kleiner Rechner, der aus mehreren Forms geöffnet werden soll. Der Wert soll dann an das Feld Menge des Form1 übertragen werden.
Dim var As Variant
var = Me.openargs
var.Form!Menge = Me!Ergebnis
DoCmd.Close
Es erscheint die Fehlermeldung "Objekt erforderlich"
Bei debug.print var wird mir der richtige Formularname angezeigt. Gebe ich diesen statt var ein, funktioniert es, wie es soll.
Was mache ich falsch??
Gruß
Max
Hallo,
mit "Openargs" kann nur ein Ausdruck, der hier ein Literal-String ist, übergeben werden...
Die Zuweisung diese Strings an eine Variant-Variable öffnet ja nun kein Formular und "var.Form!Menge" ist eine sinnlose Angabe.
Du solltest den Wert mittels Openargs übergeben und zuweisen. Wozu das "Docmd.Close" gut sein soll, sehe ich nicht.
Im Form1!Ufo:
Sub btnButton_Click()
Docmd.Openform "Form2", , , , , , Me!Ergebnis
End Sub
Im Form "Form2":
Sub Form_Load ()
If not Isnull (Me.Openargs) Then
Me!Menge = Me.Openargs
End If
End Sub
Da habe ich mich vielleicht nicht ganz verständlich ausgedrückt.
Das Feld Ergebnis gehört zu Form2 und nicht zu Form1!Ufo. Das Feld Menge gehört zu Form1!Ufo.
Form1!Ufo ist das Unterformular, in das der berechnete, arithmetische Wert aus Form2 in das Feld Menge eingefügt werden soll. Form2 ist ein Popup-Formular, dass ein ungebundenes Feld zur Eingabe der zu berechnenden Werte und das Ergebnisfeld Ergebnis (eval()) besitzt.
Form 2 ist in mehreren Formularen eingebunden.
Die Übergabe des Formularnamens Form1!Ufo als Openarg funktioniert in soweit, zumindest wenn ich in Form2 mir diesen Wert über debug.print anzeigen lasse.
Nach Ermittlung und Übergabe des Ergebnisses an Form1!Ufo wird gleichzeitig das Form2 gschlossen.
Vielleicht geht es auch ganz anders einfacher?
Gruß
Max
Zitat von: MaxP am September 25, 2019, 10:15:12
Nach Ermittlung und Übergabe des Ergebnisses an Form1!Ufo wird gleichzeitig das Form2 gschlossen.
Vielleicht geht es auch ganz anders einfacher?
Nicht unbedingt einfacher, aber besser:
Schreib eine Funktion, die ...
- Form2 als Dialog öffnet,
- Bei "OK" wird das Form2 unsichtbar,
- aus der Funktion das Berechnungsergebnis aus Form2 auslesen,
- Form2 schließen,
- Berechnungsergebnis als Rückgabewert der Funktion
Diese Funktion rufst du überall auf, wo du die Berechnung über das Form brauchst.
Besser weil: Keine Abhängigkeiten zwischen den verschiedenen Formularen.
Als Sahnehäubchen könntest du das Berechnungsergebnis in Form2 von einer Property oder Function zurückliefern lassen, dann sind alle Abhängigkeiten von Formularinterna (Steuerelemente)außerhalb ihrer jeweiligen Formulare eliminiert.
Hallo,
Alternativ zur Funktion mit ähnlicher Logik:
Im Form1!Ufo:
Sub btnButton_Click()
Docmd.Openform "Form2",,,,,acDialog
End Sub
Im Form "Form2":
Sub Form_Unload()
Forms!Forms1!Ufo!Menge = Me!Ergebnis
End Sub
Hallo zusammen,
@Franz
so hatte ich es anfänglich auch gemacht. Nur dann bin ich ausschließlich an Form1 gebunden, oder? Ich bräuchte für 3 Ausgangsformulare auch 3 Rechnerformulare mit eigenem Code entsprechend Form1.
@ Phil
Wozu ist der 2. Pkt "unsichtbar..." erforderlich?
Wie funktioniert der Pkt "Berechnungsergebnis als Rückgabewert der Funktion"? Schaffe ich es denn ohne Dein Sahnehäubchen, den Formularnamen Form1!Ufo im Code außen vor zu lassen?
Mit der Übergabe von Variablen zw. Funktion u. Sub habe ich so meine Probleme. Vielleicht hast Du ein kleines Beispiel parat?
Gruß
Max
Zitat von: MaxP am September 25, 2019, 15:14:15
@ Phil
Wozu ist der 2. Pkt "unsichtbar..." erforderlich?
Wenn du ein Formular als Dialog öffnest (
WindowMode=acDialog), hält der aufrufende Code an dieser Stelle an und nur Code innerhalb des Formulars läuft. Sobald du das Form unsichtbar machst, läuft der Code weiter.
Zitat von: MaxP am September 25, 2019, 15:14:15
Wie funktioniert der Pkt "Berechnungsergebnis als Rückgabewert der Funktion"? Schaffe ich es denn ohne Dein Sahnehäubchen, den Formularnamen Form1!Ufo im Code außen vor zu lassen?
Luftcode, ohne Gewähr:
Public Function Berechnung() As Double
Const DIALOGFORM_NAME As String = "Form2"
Dim Berechnungsergebnis As Double
DoCmd.OpenForm DIALOGFORM_NAME, WindowMode = acDialog
' Der code hält hier an bis Form2 geschlossen oder unsichtbar
' Für diese Funktion ist unsichtbar erforderlich!
Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("SteuerelementMitBerechnungsergebnis").Value
DoCmd.Close acForm, DIALOGFORM_NAME, acSaveNo
Berechnung = Berechnungsergebnis
End FunctionAn beliebiger Stelle:
Forms!Forms1!Ufo!Menge = Berechnung()
es funzt nicht, sch...
Code im Ausgangsform:
Private Sub Befehl148_Click()
Call Berechnung
Forms!Forms1!Ufo!Menge = Berechnung()
End Sub
Code der Funktion:
Public Function Berechnung() As Double
Const DIALOGFORM_NAME As String = "Form2"
Dim Berechnungsergebnis As Double
DoCmd.OpenForm DIALOGFORM_NAME, , , , , acDialog
' Der code hält hier an bis Form2 geschlossen oder unsichtbar
' Für diese Funktion ist unsichtbar erforderlich!
Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("Ergebnis").Value
DoCmd.Close acForm, DIALOGFORM_NAME, acSaveNo
Berechnung = Berechnungsergebnis
Debug.Print Berechnung 'okay
End Function
Code von form2 Ok-Button:
Private Sub Befehl13_Click()
Me.Visible = False
' bzw. Forms!Form2.Visible = False
End Sub
Gebe ich im letzten Code Forms!Form2.Visible = False ein,
gibt es zwqar keine Fehlermeldung, aber die Rechenwerte muss ich zweimal eingeben, bevor das Form ausgeblendet wird.
Gebe ich im letzten Code Forms!Form2.Visible = False öffnet sich Form2, es erscheint die Fehlermeldung: "Unzulässige Verwendung von Null". Es wird die Zeile
"Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("Ergebnis").Value"
gelb markiert.
Gruß
Max
Zitat von: MaxP am September 25, 2019, 16:21:34
es funzt nicht, sch...
Code im Ausgangsform:
Private Sub Befehl148_Click()
Call Berechnung
Forms!Forms1!Ufo!Menge = Berechnung()
End Sub
[...]
Gebe ich im letzten Code Forms!Form2.Visible = False ein,
gibt es zwqar keine Fehlermeldung, aber die Rechenwerte muss ich zweimal eingeben, bevor das Form ausgeblendet wird.
Gebe ich im letzten Code Forms!Form2.Visible = False öffnet sich Form2, es erscheint die Fehlermeldung: "Unzulässige Verwendung von Null". Es wird die Zeile
"Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("Ergebnis").Value"
gelb markiert.
Du rufst im Ausgangsform die Berechnungsfunktion zweimal auf. - Die erste der beiden Zeilen bitte löschen.
Nachdem du die Berechnung zweimal gestartet hast, ist es klar dass du sie dann auch zweimal durchführen musst.
Die Fehlermeldung "Unzulässige Verwendung von Null" entsteht,. wenn das Steuerelement "Ergebnis" leer ist.
In dieser Hinsicht sollte der Code erweitert werden, um den Fall zu behandeln, dass der Benutzer entweder aus versehen die Berechnung nicht vollständig durchgeführt hat, oder sie bewusst abbrechen möchte. - Das erfordert aber Hintergrundwissen über den Prozess und liegt somit bei dir.
Ja super, so funktioniert es, wie es soll.
Aber warum? Wie wird ohne CALL nun die Funktion aufgerufen?
Meine Denke: Durch die erste Codezeile soll die Funktion aufgerufen werden. Nach dem Durchlauf der kompletten Funktion soll mit Hilfe der 2. Codezeile das Ergebnis ins Ausgangsformular übertragen werden.
Gruß
Max
Hallo,
Zitat= Berechnung()
Das ist der Aufruf der Funktion.
Okay, habe ich verstanden.
Danke an Euch!
Gruß
Max
Hallo Max,
ZitatOkay, habe ich verstanden.
Vielleicht noch ein paar Anmerkungen zur Vertiefung.
Public Function Berechnung() As DoubleZwischen die Klammern kämen die Parameter, mit der die Function etwas
anstellt. Gibt es hier zwar nicht, ist ein aber wichtiger Punkt zum Verständnis
wie Prozeduren funktionieren.
Die Deklaration eines Rückgabewertes (As Double) gibt es i.Ü. nur bei
Functions. Subs können zwar Parameter entgegennehmen/verarbeiten,
aber keinen Wert zurückgeben.
Call Berechnungruft eine Sub oder eine Function
ohne Parameter auf.
Forms!Forms1!Ufo!Menge = Berechnung()bewirkt, dass der Rückgabewert, daher "= FunctionName", in das ange-
gebene Textfeld (oder eine Variable) übertragen wird. Hier kämen dann
zwischen die Klammern die Werte, die die Function erwartet (s.o.).
gruss ekkehard
Hallo,
vielen dank für den Background.
War mir alles neu.
Gruß
Max