Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Formularname übergeben mit Openargs

Begonnen von MaxP, September 24, 2019, 18:54:40

⏪ vorheriges - nächstes ⏩

MaxP

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
Win 10 pro 64 bit, Access 2003

DF6GL

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



MaxP

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


Win 10 pro 64 bit, Access 2003

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DF6GL

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


MaxP

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
Win 10 pro 64 bit, Access 2003

PhilS

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 Function

An beliebiger Stelle:Forms!Forms1!Ufo!Menge = Berechnung()
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MaxP

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


Win 10 pro 64 bit, Access 2003

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MaxP

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
Win 10 pro 64 bit, Access 2003

MzKlMu

Hallo,
Zitat= Berechnung()
Das ist der Aufruf der Funktion.
Gruß Klaus

MaxP

Okay, habe ich verstanden.

Danke an Euch!

Gruß
Max
Win 10 pro 64 bit, Access 2003

Beaker s.a.

Hallo Max,
ZitatOkay, habe ich verstanden.
Vielleicht noch ein paar Anmerkungen zur Vertiefung.
Public Function Berechnung() As Double
Zwischen 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 Berechnung
ruft 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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MaxP

Hallo,

vielen dank für den Background.
War mir alles neu.

Gruß
Max
Win 10 pro 64 bit, Access 2003