Wie müsste ich folgendes Makro in VBA schreiben, kann mir hier jemand weiterhelfen:
SUCHEN NACH DATENSATZ:
Objekttyp:
Objektname:
Aufnahme: Erster
Bedingung: ="[ID] = " & Str(Nz(Screen.ActiveControl;0))
Das Makro steht in einem Dropdownfeld, und wurde von Access selbst generiert. Deshalb ist die Funktion Makro in VBA konvertieren auch gesperrt.
Danke
Hallo,
vermutlich:
Me.Recordset.Findfirst "[ID] = " & Nz(Screen.ActiveControl;0)
Hallo, Nein das führt zu einem Debug Fehler wenn ich diese Zeile so eingebe
Hallo,
das man selbst nicht merkt, dass Helfer mit einer solchen Antwort nichts anfangen können werde ich nie begreifen.
- Beschreibe genau was Du wo und wie gemacht hast
- Zeige den verwendeten vollständigen Code
- Wie lautet die Fehlermeldung des Debuggers
Ich bräuchte nur das oben geschriebene Makro in einer VBA Form mehr nicht. Ich habe das Makro nun gelöscht und die vorgeschlagene Zeile ein das VBA gesetzt, aber dann kommt es zu einem Laufzeitfehler in genau dieser einen Zeile und der Debugger startet.
Hi
Zitat von: wuffwuff2003 am Juni 27, 2013, 19:30:05
dann kommt es zu einem Laufzeitfehler in genau dieser einen Zeile und der Debugger startet.
Leider gibt es mehr als einen Laufzeitfehler. >:(
Welche dürfen wir uns denn aussuchen? ???
Hilfreich wäre die Fehlernummer UND die FEHLERBESCHREIBUNG.
Harald
Ich habe es nochmal nachgebildet dieses VBA
Private Sub Kombinationsfeld39_AfterUpdate()
Me.Recordset.Findfirst "[ID] = " & Nz(Screen.ActiveControl;0)
End Sub
Er meldet dann einen Syntaxfehler beim aussuchen einen neuen Kunden, der Cursor springt sofort auf das ; vor der Null zum Schluß des Befehls, der Befehl selbst bleibt während der Programmierung rot.
Hallo,
ZitatEr meldet dann einen Syntaxfehler
und der lautet?
Lass Dir doch nicht alles aus der Nase ziehen. Wir sitzen doch nicht vor Deinem PC. Du willst doch Hilfe. Da muss man doch auch mitarbeiten.
Zitat von: wuffwuff2003 am Juni 27, 2013, 19:44:11
Er meldet dann einen Syntaxfehler beim aussuchen einen neuen Kunden, der Cursor springt sofort auf das ; vor der Null zum Schluß des Befehls, der Befehl selbst bleibt während der Programmierung rot.
und was passiert, wenn Du das ; gegen ein , tauschst?
Harald
Ok vielen Dank dann scheint es zu klappen, jetzt kommt diese Zeile dann hinzu die ist auch falsch, das heißt die macht es genau falsch herum dieses NOT müsste ein YES oder TRUE sein, das passt aber nicht in diese Zeile:
Private Sub Kombinationsfeld39_AfterUpdate()
Me.Recordset.Findfirst "[ID] = " & Nz(Screen.ActiveControl, 0)
Me.ServiceManoeuvre.Visible = Not Me.ServiceAttache = 18
End Sub
Hallo,
ich hatte bewusst nach der Meldung gefragt, weil die Meldung auf das falsche Semikolon hinweist.
Wenn Du die Meldung wie mehrfach gewünscht gleich zitiert hättest, wäre das schon längst gelöst.
Ansonsten, lösche das Not ersatzlos.
Zitat von: wuffwuff2003 am Juni 27, 2013, 20:06:14
Me.ServiceManoeuvre.Visible = Not Me.ServiceAttache = 18
wieso 18?
Im anderen Beitrag stand dort 8.
Harald
Hi,
denkbar wäre auch, wenn bei 8 weiterhin ausgeblendet werden soll:
Me.ServiceManoeuvre.Visible = Me.ServiceAttache <> 8
Harald
Ok das klappt jetzt, ich bin euch unendlich dankbar :) (Es sollte auch 18 sein hatte mich ganz zu Anfang geirrt hier im Forum, aber nicht im VBA sorry) Jetzt bleibt nur noch ein Haken, der mich auch zum verzweifeln bringt. VBA ist echt schwierig, und das noch nach 3 gelesenen Büchern :) Hier ist mal der ganze VBA Code nun.
Private Sub Kombinationsfeld39_AfterUpdate()
Me.Recordset.Findfirst "[ID] = " & Nz(Screen.ActiveControl, 0)
Me.ServiceManoeuvre.Visible = Me.ServiceAttache = 18
End Sub
Private Sub Kombinationsfeld39_BeforeUpdate(Cancel As Integer)
Cancel = MsgBox("Datensatz speichern", vbYesNo) = vbYes
If Cancel Then
DoCmd.Save
End If
End Sub
Das Problem nun ist, wenn ich die Message Box mit YES beantworte, speichert er den Datensatz ab, und wechselt zum neu eingestellten Namen, und gleicht die nachfolgenden Textelemente dem Namen entsprechend an, Also YES funktioniert. Drücke ich aber NO wechselt er zwar zum angewählten Namen, und speichert auch nicht ABER die nachfolgenden Textelemente schalten nicht mit dem gewechselten Namen um, ich muss dann separat oben auf den Aktualisierungsbutton drücken. Wenn ich im VBA aber vor das End If folgendes hinzufüge:
Else
DoCmd.RefreshRecord
bekomme ich wieder eine Fehlermeldung
Hi,
was soll mit
DoCmd.Save
gespeichert werden?
Einen Datensatz würde ich mit
DoCmd.RunCommand acCmdSaveRecord
speichern.
Welcher Code ist bei den Aktualisierungsbutton hinterlegt? Der könnte doch in einen else-Zweig rein.
Harald
PS: Der eigentliche Ablauf hat sich mir nicht vollständig erschlossen.
Diese Befehlszeile hatte ich auch probiert, mit der Folge eines Laufzeitenfehlers 2115. Es sollen die Änderungen gespeichert werden die ich in den unterschiedlichen Dropdownboxen gemacht habe.
Mit dem Aktualisierungsbutton meinte ich den von Access selbst der oben in der Werkleiste steht mit der Bezeichnung "Alles Aktualisieren"
Hi
Zitat von: wuffwuff2003 am Juni 27, 2013, 21:28:53
mit der Folge eines Laufzeitenfehlers 2115.
Ist damit gemeint:
Das Makro oder die Funktion, das bzw. die für dieses Feld einer der Eigenschaften VorAktualisierung oder Gültigkeitsregel zugeordnet ist, hindert Microsoft Access daran, die Daten in em Feld zu speichern.
Zitat von: wuffwuff2003 am Juni 27, 2013, 21:28:53
Es sollen die Änderungen gespeichert werden die ich in den unterschiedlichen Dropdownboxen gemacht habe.
Bist Du Dir sicher, dass mit Deinem save-Befehl wirklich Daten in der Tabelle gespeichert werden?
Aktualisieren ist auch möglich mit:
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
(das hat der access-Assi angeboten)
oder vielleicht hilft auch schon ein:
Me.Refresh
Harald
Hallo , erstere Zeile DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70 funktioniert in Access 2010 nicht mehr, und M.Refresch ruft auch den Laufzeitfehler 2115 auf.
Zitat von: wuffwuff2003 am Juni 28, 2013, 11:50:34
und M.Refresch ruft auch den Laufzeitfehler 2115 auf.
was auch nicht verwunderlich, da es heißt:
Me.Refresh
Wie lautet denn die Beschreibung zum Fehlercode?
Harald
Hi, sorry Tippfehler im VBA stehts richtig :) Hier die Beschreibung:
Laufzeitfehler 2115: Das Makro oder die Funktion, das bzw. die für dieses Feld auf die Eigenschaft 'Vor Aktualisierung' oder 'Gültigkeitsregel' festgelegt ist, hindert Microsoft Access daran, die Daten im Feld zu speichern
Kompletter VBA Code:
Private Sub Kombinationsfeld39_BeforeUpdate(Cancel As Integer)
Cancel = MsgBox("Datensatz speichern", vbYesNo) = vbYes
If Cancel Then
DoCmd.RunCommand acCmdSaveRecord
Else
Me.Refresh
End If
End Sub
Hallo,
die Fehlermeldung sagt es bereits:
Before_Update ist das FALSCHE (ungeeignete) Ereignis, um währenddessen Daten zu speichern....
PS:
Du tippst den Code ab??
nutze besser Copy&Paste, das gehst schneller und ohne Tippfehler, die einen in die Irre leiten (können).
Und nenne bei Fehlermeldungen IMMER den Fehlermeldung-TEXT und nicht nur die Nummer oder sogar gar nichts..
Ich bin hier am verzweifeln, wenn ich jetzt die Refresh unter das AfterUpdate setze funktioniert der Refresh wie er soll, und schon macht das BeforeUpdate wieder Problem, hier der VBA. Er unterbricht mit 2115 Laufzeitfehler, bei der Zeile : DoCmd.Run.......
Private Sub Kombinationsfeld39_BeforeUpdate(Cancel As Integer)
Cancel = MsgBox("Datensatz speichern", vbYesNo) = vbYes
If Cancel Then
DoCmd.RunCommand acCmdSaveRecord
Else
Undo
End If
End Sub
Hallo,
ja doch, ....
wenn das Ereignis abgebrochen wird (Cancel ist True) , dann soll gespeichert werden, was nunmal nicht geht.....
Sagte vorhin schon, dass Before_Update nicht geeignet ist, währenddessen Daten separat zu speichern.
Du mußt die Ablauflogik ändern....
Ok das klingt einleuchtend, wie müsste der Befehl dann sein?
Dies wurde mir so empfohlen. Die problematik ist: Ich wähle im oberen Drop-Down meinen Namen, andere Dropdownfelder, bekommen dann die Daten passend zu dem 1. Dropdown, dem Kundennamen. Nun ändere ich bei Kunde A etwas in den übrigen Dropdownfelder, dann möchte ich zu Kunde B wechseln und schalte um, dann verhält Access nicht was ich bei Kunde A geändert habe, ausser ich gebe einen Speichernbefehl ab? Was ich schon komisch finde wieso er dies nicht verhällt ich dachte alle änderungen würden sofort in der Tabelle geändert werden und das dauerhaft.
Hallo,
Das weiß ICH nicht, welche Ablaufsteuerung Du verfolgst....
Warum setzt Du Cancel auf True , wenn die Frage nach "Speichern" mit Ja beantwortet wird??
Wenn Cancel = True ist, wird eben NIX gespeichert. Die Variable "Cancel" ist ein Argument der Before_Update-Prozedur.
PS:
ZitatDies wurde mir so empfohlen.
Da hat man Dir Quatsch empfohlen, oder Du hast es missverstanden...
ZitatDie problematik ist: Ich wähle im oberen Drop-Down meinen Namen,
Was ist das "obere Dropdown"? und was hat das mit Deinem Namen zu tun?
Zitatandere Dropdownfelder, bekommen dann die Daten passend zu dem 1. Dropdown, dem Kundennamen.
Ja, gut.... nennt sich "abhängige Kombifelder" und dienen meist zur Vorselektion für die Anzeige von Datensätzen.
ZitatNun ändere ich bei Kunde A etwas in den übrigen Dropdownfelder,
Kunde A wurde vermutlich auf Grund der o. g. Kombis gefiltert. Was sind jetzt die "übrigen Dropdownfelder" ? Sind das gebundene Kombis, die irgendwelche Kunden-Daten anzeigen?
Zitatdann möchte ich zu Kunde B wechseln und schalte um,
WIE schaltest Du um? Durch andere Auswahl in den "oberen" Kombis?
Zitatdann verhält Access nicht was ich bei Kunde A geändert habe, ausser ich gebe einen Speichernbefehl ab?
Damit die vorangegangenen Änderungen gespeichert werden, braucht hier gasr nichts gemacht werden. Access speichert IMMER bei Datensatzwechsel (Schliessen des Forms ist i. Ü. auch ein "Datensatzwechsel") die DAten in die entspr. Tabelle, wenn keine Gegenmaßnahmen explizit getroffen wurden und das Form und die Steuerelemente "gebunden" sind (Datenherkunft und Steuerelementinhalte enthalten Tabellenname, bzw. Tabellenfeldname)
ZitatWas ich schon komisch finde wieso er dies nicht verhällt ich dachte alle änderungen würden sofort in der Tabelle geändert werden und das dauerhaft.
Du denkst ja schon richtig, vermutlich sind aber die Kombis nicht richtig eingestellt oder aber das Speichern wird durch irgendeine anderweitige Maßnahme (s. o.) unterbunden.
Wenn ich den Spiess umdrehe und cancel mit vbNo setze und dann unter If UNDO setzen, und den Speicherbefehl bei ELSE geht es auch nicht, dann bleibt er trotzdem bei der Speicherzeile hängen:
Private Sub Kombinationsfeld39_BeforeUpdate(Cancel As Integer)
Cancel = MsgBox("Datensatz speichern", vbYesNo) = vbNo
If Cancel Then
Undo
Else
DoCmd.RunCommand acCmdSaveRecord
End If
End Sub
Also das obere Dropdown, ist das erste , es enthält den Namen des Kunden. Je nachdem welchen Kunde ich wähle ändern andere Dropdownfelder, und Textfelder ihren Inhalt, das sind dann die abhängigen Kombifelder. Kunde A hat bspw Schuhgrösse X(abhängiges Kombifeld) Kunde B hat Schuhgrösse Y. Umschalten erfolgt durch Umschalten des HAUPT-DROPDOWNS also die Spitze der Pyramide sozusagen, was die Kundennamenauswahl ist.
Hallo,
versteh trotzdem nicht...
Ist das "obere Dropdown" nun gebunden oder nicht? Für eine VORAUSWAHL für weitere Kombis MÜSSEN alle diese Kombis UNGEBUNDEN sein. Sonst werden ja die Kundendaten verändert. Ich vermute, hier liegt das ganze Schlammassel im Pfeffer.. (?? ;-) )
Um die Kundendaten mit evtl. Kombifelder zu pflegen (Eingabe/Auswahl, Ändern) MÜSSSEN diese Kombis GEBUNDEN sein.