Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

kann das Formular nicht finden

Begonnen von zorlayan, Mai 15, 2019, 15:13:26

⏪ vorheriges - nächstes ⏩

zorlayan

Hallo,

in einem Sub habe ich für 3 verschiedene Formulare an 3 mal verschiedenen Variable zugewiesen

Dim Buch As Form
Set Buch = Forms!K_Buch

bei der vierte  Zuweisung im Sub bekomme ich Fehlermeldung dass das Formular nicht findbar ist.

Warum kann der Access das Formular nicht finden obwohl es da ist?

Danke

MzKlMu

Hallo,
Du hast 3 Formulare und wilst 4 zuweisen ?

Kannst Du das mal genauer erklären ?

Und zeige bitte den vollständigen Code (in Codetags).
Gruß Klaus

Milvus

#2
Ich vermute, weil das Formular nicht offen ist.

Darüber habe ich mich so oft geärgert (irgendwie Käse für mein Hirn), dass ich neue Forms nur noch als Instanzen programmiere. Das ist dann so, wie ich mir das als Entwickler vorstelle, dass es sein muss.

Überhaupt ist das DoCmd zu einem Endgegner für mich geworden. Der Kampf läuft unerbittlich, ich gebe nicht auf.

Eine Instanz kannst Du über das Klassenmodul des Formulars bilden, dafür muss aber mindestens mal ein Ereignis da gewesen sein (sonst ist kein FRM-Klassenmodul da, ebenfalls Schrott in meinen Augen).

Wenn Du das so machen willst (ist definitiv anders), lass mal hören.


Ansonsten versuch das Teil vorher mit DoCmd  >:( >:( >:( zu öffnen ;)



zorlayan

Es ist bischen kompliziert sorry.

Private Sub Btn_Verkauf_Click()
Dim KunNr As Integer
KunNr = Me.KundenNr
Forms.Autos!Verkauft_An = KunNr
'Rechnungsdaten
'Rechnungs Variablen
Dim frmAuto As Form
Set frmAuto = Forms!Autos
Dim AutoID As Integer
Dim VPreis As Currency
Dim KDate As Date
AutoID = frmAuto.Autos_ID
VPreis = frmAuto.VK_Preis_Real
KDate = frmAuto.Verkaufsdatum
'Variablen Ende

DoCmd.OpenForm ("Rechnung")
Dim frmZiel As Form
Set frmZiel = Forms!Rechnung
Dim RNr As Integer

frmZiel.Recordset.AddNew 'Neuer Datensatz hinzufügen
frmZiel.RechnungNr = DMax("RechnungNr", "Rechnung") + 1
RNr = frmZiel.RechnungNr 'Rechnungsnummer zuweisung an Variable RechNr
frmZiel.KundenNr = KunNr
frmZiel.Autos_ID = AutoID
frmZiel.Betrag = VPreis
frmZiel.Datum = KDate
frmZiel.Dirty = False 'Speichern
DoCmd.Close acForm, "Rechnung"
'Rechnungsdaten Ende

'Datentransfer an ZwiForm
'Wert zuweisung an Variablen
Dim KTitel, KName, KNach, KAdr1, KAdr2, KPLZ, KOrt, KLand, KMobil, KSt_Id, KMail, KMemo As String
Dim Zahler As String
Zahler = Me.KName & " " & Me.KNach

Dim frmZwi As Form
Set frmZwi = Forms!ZwiForm


KTitel = Me.KTitel
KName = Me.KName
KNach = Me.KNach
KAdr1 = Me.KAdrr1
KAdr2 = Me.KAdrr2
KPLZ = Me.KPLZ
KOrt = Me.KOrt
KLand = Me.KLand
KMobil = Me.KMobil
KSt_Id = Me.KSt_Id
KMail = Me.KMail
KMemo = Me.KMemo
'Datentransfer
'DoCmd.OpenForm "ZwiForm", , , , , acHidden
DoCmd.OpenForm ("ZwiForm")
frmZwi!KTitel = KTitel
frmZwi!KName = KName
frmZwi!KNach = KNach
frmZwi!KAdrr1 = KAdr1
If IsNull(KAdr2) Then
frmZwi!KAdrr2 = "."
Else
frmZwi!KAdrr2 = KAdr2
End If
frmZwi!KPLZ = KPLZ
frmZwi!KOrt = KOrt
frmZwi!KLand = KLand
frmZwi!KMobil = KMobil
frmZwi!KStId = KSt_Id
frmZwi!RechNr = RNr ' Rechnungsnummer
frmZwi!KMail = KMail
frmZwi!Einzahler = Zahler
If IsNull(KMemo) Then
frmZwi!KMemo = "."
Else
frmZwi!KMemo = KMemo
End If


'Word Datei wird geöffnet und ausgefüllt

Dim objWord As Word.Application

Set objWord = CreateObject("Word.Application")


With objWord
.Visible = True

.Documents.Open ("C:\Autos DB\Inland_Verkauf.dotm")


.ActiveDocument.Bookmarks("KTitel").Select
.Selection.Text = frmZwi.KTitel
.ActiveDocument.Bookmarks("KName").Select
.Selection.Text = frmZwi.KName
.ActiveDocument.Bookmarks("KNach").Select
.Selection.Text = frmZwi.KNach
.ActiveDocument.Bookmarks("KAdrr1").Select
.Selection.Text = frmZwi.KAdrr1
.ActiveDocument.Bookmarks("KAdrr2").Select
.Selection.Text = frmZwi.KAdrr2
.ActiveDocument.Bookmarks("KPLZ").Select
.Selection.Text = frmZwi.KPLZ
   .ActiveDocument.Bookmarks("KOrt").Select
.Selection.Text = frmZwi.KOrt
   .ActiveDocument.Bookmarks("KLand").Select
.Selection.Text = frmZwi.KLand
   .ActiveDocument.Bookmarks("KSt_Id").Select
.Selection.Text = frmZwi.KStId
   .ActiveDocument.Bookmarks("KMobil").Select
.Selection.Text = frmZwi.KMobil
   .ActiveDocument.Bookmarks("KMarke").Select
.Selection.Text = frmZwi.Marke
   .ActiveDocument.Bookmarks("KModell").Select
.Selection.Text = frmZwi.Modell
   .ActiveDocument.Bookmarks("KVIN").Select
.Selection.Text = frmZwi.VIN_Nr
   .ActiveDocument.Bookmarks("KEZ").Select
.Selection.Text = frmZwi.EZ
   .ActiveDocument.Bookmarks("KKW").Select
.Selection.Text = frmZwi.Leistung
   .ActiveDocument.Bookmarks("KKM").Select
.Selection.Text = frmZwi.KM
   .ActiveDocument.Bookmarks("KPreis").Select
.Selection.Text = VPreis
   .ActiveDocument.Bookmarks("RechNr").Select
.Selection.Text = RNr
    .ActiveDocument.Bookmarks("VerDtm").Select
.Selection.Text = KDate
    .ActiveDocument.Bookmarks("EMail").Select
.Selection.Text = KMail
    .ActiveDocument.Bookmarks("Memo").Select
.Selection.Text = KMemo

'Berechnung
    Dim MwSt  As Double
    Dim Ges As Double
   
   If Forms.Autos!MwSt = True Then
   MwSt = ((VPreis / 100) * 19)
   'MwSt = Round(Summe, [2])
   .ActiveDocument.Bookmarks("MwSt").Select
   .Selection.Text = MwSt
    Ges = (VPreis + MwSt)
            .ActiveDocument.Bookmarks("Gesamt").Select
            .Selection.Text = Ges
   
    Else
    MwSt = 0
   .ActiveDocument.Bookmarks("MwSt").Select
   .Selection.Text = MwSt
   
    Ges = (VPreis)
            .ActiveDocument.Bookmarks("Gesamt").Select
            .Selection.Text = Ges
   
    End If
    'Berechnung Ende
            .ActiveDocument.Bookmarks("Wort").Select
            .Selection.Text = FctZahl_In_Worten(Ges)


End With
Set objWord = Nothing

'Ende der Ausfüllung der Word-Datei
DoCmd.Save
Dim Buch As Form
Set Buch = Forms!K_Buch 'an dieser Stelle kommt die Fehlermeldung "das Formular nicht gefunden usw."

'Buchungen hinzufügen
'DoCmd.OpenForm "K_Buch", , , , , acHidden

Buch.Recordset.AddNew 'Neuer Datensatz hinzufügen
Buch!Konto_ID = frmZwi!Konto_ID
If frmZwi!Anzahlung > 0 Then
Buch!Kategorie_ID = 7
Buch!Einnahme = frmZwi!Anzahlung
Else
Buch!Kategorie_ID = 2
End If
Buch!Datum = KDate
Buch!Verwendungszweck = frmZwi!Verwendungszweck
Buch!Einnahme = frmZwi!Einnahme





'DoCmd.Close acForm, "Kunden"
'DoCmd.Close acForm, "Autos"
'DoCmd.Close acForm, "Suche"

End Sub


zorlayan

ich habe das alte Method verwendet  :-\
Es geht wenigstens ohne probleme :)

'Dim Buch As Form
'Set Buch = Forms!K_Buch

'Buchungen hinzufügen
DoCmd.OpenForm "K_Buch"

DoCmd.RunCommand acCmdRecordsGoToNew
Forms.K_Buch!Konto_ID = frmZwi!Konto_ID
If frmZwi!Anzahlung > 0 Then
Forms.K_Buch!Kategorie_ID = 7
Forms.K_Buch!Einnahme = frmZwi!Anzahlung
Else
Forms.K_Buch!Kategorie_ID = 2
End If
Forms.K_Buch!Datum = KDate
Forms.K_Buch!Verwendungszweck = frmZwi!Verwendungszweck
Forms.K_Buch!Einnahme = frmZwi!Einnahme


vielen Dank an allen beteiligten

PhilS

Zitat von: Milvus am Mai 15, 2019, 15:35:43
Eine Instanz kannst Du über das Klassenmodul des Formulars bilden, dafür muss aber mindestens mal ein Ereignis da gewesen sein (sonst ist kein FRM-Klassenmodul da, ebenfalls Schrott in meinen Augen).
Oder man stellt einfach die HasModule-Property des Forms auf Yes.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

Nebenbei finde ich die oben gezeigten Formularspielereien höchst überflüssig, wenn es um die Sache geht.

Ein neu geöffnetes Formular hat nur einen Datensatz oder verweist auf den ersten Datensatz seiner Datenherkunft (wenn es welche gibt). Genauer: Das Formular zeigt nur Datensätze an. Spannende Überlegung: Wo sind denn die Datensätze wirklich?

Solche Datensatzoperationen wie oben (Werte abgreifen, Werte zuweisen, Datensatz anlegen) kann man direkt an der Tabelle/Abfrage vornehmen. Das geht einfacher und schneller (wenn der DB-Entwickler sein grundlegendes Handwerk beherrscht).

Für die VBA-Entwickler: DoCmd-Operationen bilden einfache Makromaßnahmen ab, wie man sie auch per Ribbons aufrufen kann. Sie haben damit auch keine wirklich praktikablen Möglichkeiten, mit Klassen und Instanzen zusammenzuarbeiten.
Mit freundlichem Glück Auf!

Eberhard

Milvus

Zitat von: PhilS am Mai 15, 2019, 15:58:38
Oder man stellt einfach die HasModule-Property des Forms auf Yes.

Es gibt tatsächlich Hoffnung!!! Diese wesentlichen Basics würde ich irgendwo zwischen Kapiteln 3-5 erwarten, auch wie man solche Objekte (VB ist eine objektorientierte Programmiersprache) aus den Klassenmodulen bildet. Doch zu spät, das DoCmd hat bis dahin schon sein Gift verbreitet.

Ich hab das jetzt schon so oft gehabt. Erst ein einfaches Form, neue Anforderungen, dann OpenArgs, dann Split in Openargs, weil einer reicht ja nicht... >:(, gleich richtig, Probperties und Members von Anfang an, so wie VB auch konzipiert ist!


@PhilS: Schreib doch mal ein Buch, das den Name Entwicklung auch verdient!


Beaker s.a.

Hallo Zorlayan,
Ist zwar etwas OT, gehört aber zu den Basics, und könnte auch mal
wichtig sein.
Deine Variablen-Deklaration:
Dim KTitel, KName, KNach, KAdr1, KAdr2, KPLZ, KOrt, KLand, KMobil, KSt_Id, KMail, KMemo As String
Hiermit wird nur die letzte Variable "KMemo" als String deklariert,
alle anderen sind Variant. Ist blöd, ist aber so.
Man deklariert deshalb alle Variablen einzeln mit dem entsprechenden
Datentyp; - in jeweils einer einzelnen Zeile, oder durch ":" getrennt.
Dim KTitel As String
Dim KName As String
'u.s.w.
'oder
Dim KNach As String: Dim KAdr1 As String: 'u.s.w.


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)

MzKlMu

oder so:  ;D
Dim KNach As String, KAdr1 As String, KAdr2 As String  'u.s.w.
oder noch kürzer:
Dim KNach$, KAdr1$, KAdr2$  'u.s.w.

Weitere Kürzel:
% Integer Dim L%
& Long Dim M&
@ Decimal Dim W@
! Single Dim Q!
# Double Dim X#

Gruß Klaus

Beaker s.a.

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)

zorlayan

Mit wechen code rundet man eine Bruchzahl ab/auf?
z.B. nach einer Berechnung von MwSt kommt der Zahl als 125,887464€ will auf 126€ ab/aufrunden.

    Dim MwSt# '# = Double
   
   MwSt = ((VPreis / 119) * 19)
   MwSt = Round(Summe, [2]) ' Hier funktioniert das Ab/Aufrunden nicht richtig, weil ich die verwendung nicht weiss.

Vielen Dank.

DF6GL

Hallo,


--  die Deklaration von Variablen mit Hilfe von Suffixen ist eigentlich veraltet und fördert nicht unbedingt die Transparenz. Eine besser Benamsung von Variablen wäre das Voranhängen eines kennzeichnenden Kürzels, z. B. Dim dblMwst As Double, curVpreis As Currency). Dies trägt auch zur Vermeidung von reservierten Wörtern bei.  ("Summe",  ist hier zwar nicht ganz zutreffend, aber "am Rande der Legalität"   ;) )

--  Kennst Du die Bedeutung der Eckklammern?  Vermutlich willst Du mit   MwSt = Round(Summe, 2)  den Wert der Variablen "Summe" auf zwei Nachkommastellen  runden...   Siehe aber auch hier:  http://www.donkarl.com/?FAQ2.1  Eckklammern sind zu Verwenden bei eigenerstellten (Objekt-)Namen,  die entweder aus einem reservierten Wort bestehen oder Leer-, bzw. Sonderzeichen enthalten, was insgesamt grundsätzlich vermieden werden soll  (z. B.  [Date], [Name], [Verwendung/Zweck]).

-- Wo und wie sind die anderen Variablen deklariert?  Sind das überhaupt Variablen oder sind es Referenzen auf Steuerelemente (z. B.  "[2]") ?  Falls so, dann sollte mit "Me" auf das aktuelle Form, bzw. den aktuellen Bericht verwiesen werden.

Zitatweil ich die verwendung nicht weiss

Drücken der F1-Taste (im VBA-Editor) hilft zuweilen.

zorlayan

Hi,

mit dem Befehl

MwSt = Fix (MwSt)

klappt es auch.

Vielen Dank an allen teilnehmenden.

PhilS

Zitat von: zorlayan am Mai 19, 2019, 20:20:52
mit dem Befehl

MwSt = Fix (MwSt)

klappt es auch.
Leider nein.
Dass Fix nur den Ganzzahlteil ohne Nachkommastellen liefert, ist dir sicher aufgefallen. Das ließe sich ja mit *100 /100 recht einfach behandeln.
Aber, auch Fix rundet nicht nach der hier üblichen Kaufmännischen Rundung, die du für die MwSt sicherlich verwenden willst. Lies den oben bereits angeführten Text zu Runden in der Access FAQ.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor