Neuigkeiten:

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

Mobiles Hauptmenü

Formularfeld dynamisch über String ansprechen

Begonnen von cyberchris, Februar 16, 2017, 12:03:10

⏪ vorheriges - nächstes ⏩

cyberchris

Hallo,

ich glaube, dass ich nur ein Formatfehler habe, komme aber trotz Suchen nicht weiter...

Wie kann ich ein Formularfeld dynamisch ansprechen? Mit Screen.PreviousControl.Name bekomme ich den Namen. Jetzt möchte ich prüfen ob das Feld Leer ist.
Bekomme aber eine Syntax-Fehlermeldung:

Dim InField As String
InField = Screen.PreviousControl.Name
If Not IstLeer((InField).Value) Then MsgBox "füllen"

Besten Dank!
Christoph

PhilS

Zitat von: cyberchris am Februar 16, 2017, 12:03:10Dim InField As String
InField = Screen.PreviousControl.Name
If Not IstLeer((InField).Value) Then MsgBox "füllen"
Der Name ist reiner Text (String) und hat keine Eigenschaften. Du kannst direkt das Steuerelement selbst als Objektvariable referenzieren.
Dim InField As Control
Set InField = Screen.PreviousControl
If Not IstLeer(InField.Value) Then MsgBox "füllen"

Achtung: PreviousControl könnte evtl. in manchen Fällen Nothing sein.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DF6GL

Hallo,


--  IstLeer()  gibt es in VBA nicht, dort lautet die Funktion IsNull() (außer die Funktion ist als benutzerdefiniert erstellt worden).


--
ZitatWie kann ich ein Formularfeld dynamisch ansprechen?

Was meinst Du mit "dynamisch" ?  Ein Formularfeld (Steuerelemenet) wird einfach durch/mit seinem Namen "angesprochen":   Msgbox Me!MeinTextfeld

--
ZitatJetzt möchte ich prüfen ob das Feld Leer ist.

Ein Feld prüft man auf Plausibilität,

-- bevor der Fokus das Steuerelement verläßt:  MeinTextfeld_Exít(...), bzw. MeinTextfeld_Lostfocus()), ( als einzige Maßnahme nicht empfohlen)
-- bevor der Datensatz in die Tabelle abgelegt (gespeichert) wird:   Form_BeforeUpdate(...)



Screen.PreviousControl.Name  bringt lediglich den Namen des Controls, das vorher den Fokus hatte und ist damit nicht klar bestimmt zum aktuellen Zeitpunkt.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Joss

@Franz,

Zitat(außer die Funktion ist als benutzerdefiniert erstellt worden).

die Funktion stammt vermutlich aus dem DBWiki:
http://dbwiki.net/wiki/VBA_Tipp:_Funktion_zum_Pr%C3%BCfen,_ob_ein_Textfeld_leer_ist

Gruß
Josef

cyberchris

Guten Morgen,

ja, ISTLEER ist eine benutzerdefinierte Funktion.

Ziel ist es, wenn ich auf ein Button drücke, soll das letzte aktive Feld ermittelt werden, in das ich dann per VBA was reinschreiben lassen möchte.

Daher Screen.PreviousControl.Name, damit ich den Namen bekomme.
Nur bekomme ich es eben nicht hin das letzte aktive Feld anzusprechen.

Gruß Christoph

DF6GL

Hallo,

ich kann immer noch nicht verstehen, wozu da PreviousControl verwendet werden soll.. Das ist doch fehlerträchtig bis völlig in die Luft geschossen.

Hast Du meine Hinweise nicht gelesen?


Erklär mal den kompletten Zusammenhang..
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ebs17

ZitatZiel ist es, wenn ich auf ein Button drücke, soll das letzte aktive Feld ermittelt werden, in das ich dann per VBA was reinschreiben lassen möchte.
Du solltest auch in Betracht ziehen, dass der Buttonklick als erste Maßnahme im Formular erfolgt, es also im Formular gar kein vorheriges aktives Steuerelement geben könnte.
Was User irgendwie tun können, das tun sie auch.
Mit freundlichem Glück Auf!

Eberhard

Lachtaube

Der Name wäre doch nur von Interesse, wenn Du auf ein ganz bestimmtes Steuerelement aus bist. Das Reinschreiben (ohne den tieferen Sinn zu hinterfragen) könnte im Prinzip so erfolgen.
Private Sub DeinKnopf_Click()
   On Error Resume Next
   
   With Screen.PreviousControl
      If IsNull(.Value) Then .Value = "Foo Bar"
   End With
   If Err Then MsgBox "Bitte vor Knopfdruck ein unausgefülltes Textfeldsteuerelement auswählen."
End Sub
Grüße von der (⌒▽⌒)

cyberchris

Hallo,

Beim formular öffnen wird der Focus auf ein feld gesetzt. Daher geht da nix schief.

Zum anderen möchte ich damit ein sonderzeichen in das Feld hineinbekommen.

Hat für mich also alles einen Sinn.

Vielen Dank für eure Hilfen, aber wenn ihr die Hintergründe nicht kennt, könnt ihr auch nicht bewerten ob das Sinn macht oder nicht.

Gruß Christoph

Lachtaube

Statt den Fokus zu setzen, geht doch auch die direkte Zuweisung - oder verstehe ich den Zusammenhang nicht?Private Sub DeinKnopf_Click()
   If IsNull(Me.Textfeldname) Then Me.Textfeldname = "Foo Bar"
End Sub
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo Christoph,
Zitataber wenn ihr die Hintergründe nicht kennt
Und du sie konsequent nicht offen legst  :(
Trotzdem hast du doch zwei Lösungen erhalten, wobei die letzte von Lachtaube
wohl, so oder so, die sicherste sein wird.
Dein eigener, ursprünglich geposteter, Code würde mit folgender Korrektur
allerdings auch funzen.
Dim InField As String
InField = Screen.PreviousControl.Name
If Not IstLeer(Me.Controls(InField).Value) Then MsgBox "füllen"


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)

cyberchris

Vielen Dank ekkehard!
So funzt es.

Es ist nicht immer so einfach den kompletten Zusammenhang kurz und knapp zu erklären.

Schönen Abend
Christoph