Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: PeterW am August 04, 2020, 11:09:50

Titel: Function VAL()
Beitrag von: PeterW am August 04, 2020, 11:09:50
ich möchte aus einem mit me!Activecontrol.name ermittelten Feldnamen die darin enthalten Zahl auslesen.
Feldname: z.B. Testfeld3
Code: x = val(Testfeld3)
Ergebnis bei mir: 0 erwartet: 3
was mache ich falsch?
Titel: Re: Function VAL()
Beitrag von: MzKlMu am August 04, 2020, 11:22:14
Hallo,
das wichtigste zeigst Du nicht, nämlich den Inhalt von Testfeld3
Titel: Re: Function VAL()
Beitrag von: PeterW am August 04, 2020, 11:25:06
Der Inhalt ist doch egal. ich möchte mit der ermittelten Zahl aus dem Feldnamen weiterarbeiten.
es gibt bei mehrere Felder gleiche Namens, die sich durch die Ziffer unterscheiden
Titel: Re: Function VAL()
Beitrag von: MzKlMu am August 04, 2020, 11:33:58
Hallo,
mit Val kannst Du nicht die Zahl eines Feldnamens ermitteln, das geht nur mit Feldinhalten.
Oder so wie von Franz nachfolgend vorgeschlagen.  ;D

PS:
Zitat von: undefinedes gibt bei mehrere Felder gleiche Namens, die sich durch die Ziffer unterscheiden

Dann hast Du Aufzählungsfelder und das ist ein Strukturfehler in der DB. Hier fehlt noch eine Tabelle.
Titel: Re: Function VAL()
Beitrag von: DF6GL am August 04, 2020, 11:35:04
Hallo,

Zitatich möchte mit der ermittelten Zahl aus dem Feldnamen weiterarbeiten.
es gibt bei mehrere Felder gleiche Namens, die sich durch die Ziffer unterscheiden

das ist aber etwas anderes als du vorher beschreibst.

Dim x as long

x= val(Replace ( Me.Activecontrol.Name, "txtFeld", ""))


wobei "txtFeld" der gleichlautende Namensteil der Felder ist.

Titel: Re: Function VAL()
Beitrag von: PhilS am August 04, 2020, 11:48:08
Zitat von: PeterW am August 04, 2020, 11:09:50ich möchte aus einem mit me!Activecontrol.name ermittelten Feldnamen die darin enthalten Zahl auslesen.
Feldname: z.B. Testfeld3
Code: x = val(Testfeld3)
Control.Name ist ein String. In deinem oben gezeigten Code verwendest du aber nicht einen String als Argument für die Val-Funktion, sondern eine Referenz auf ein Steuerelement. Dann wird die Default-Eigenschaft Value des Steuerelements ausgewertet.

Wenn du wirklich tust, was du eigentlich möchtest, sollte es auch funktionieren:
x = val(me.Activecontrol.name)
Titel: Re: Function VAL()
Beitrag von: MzKlMu am August 04, 2020, 12:11:49
@Philip
Dein verkürzter Vorschlag funktioniert nicht. Val ermittelt nur die Zahl, wenn der Feldname mit der Zahl beginnt, hier steht aber die Zahl hinten.
Der Vorschlag von Franz funktioniert, weil der feste Text mit Replace durch "" ersetzt wird und die Zahl übrig bleibt. Hier kann auch auf Val verzichtet werden, wenn nach der Zahl keine Zeichen mehr kommen. X ist ja als Zahl deklariert.
Dim x as Long
x= Replace(Me.Activecontrol.Name,"txtFeld", "")
Titel: Re: Function VAL()
Beitrag von: crystal am August 04, 2020, 12:50:33
Hallo,
wozu eigentlich val?
Geht's nicht einfach auch so:
dim i as integer
dim v as long

for i = 1 to 3
  v= me.controls("txtFeld" & i)
  debug.print i, v
next


Habe damit mal 256 Felder bearbeitet (experimenteller Colorpicker), z. B. mit
...
for i = 1 to 256
  me.controls("farbFeld" & format(i, "000")).backcolor = lngColor(i)
next
Titel: Re: Function VAL()
Beitrag von: DF6GL am August 04, 2020, 14:28:00
Hallo,

natürlich geht es so (besser), es war nur nicht die Fragestellung, die auch nur wiederum die Frage aufwirft, warum das denn nun so ( mit ActiveControl) gemacht werden soll.


Titel: Re: Function VAL()
Beitrag von: crystal am August 04, 2020, 14:56:56
@DF6GL
Meine Vermutung ist, dass der TS mit "val" schlicht den Wert der Variablen auslesen möchte und "val" irrtümlich dafür benutzt. Ich war beim Lesen der Meldungen der Meinung, dass "val" hier nicht "im Sinne des Erfinders" benutzt wurde, zudem auch
val(variable) und
variable.value
etwas durcheinander erwähnt wurden.

Die Funktion
"val(variable)"
versucht, aus dem Textfeld Namens "variable" den (ersten) numerischen Anteil zu extrahieren und dabei alle Nicht-Ziffernzeichen zu ignorieren, während
"variable.value"
den Wert zurückgibt, der aktuell im Formular-Feld "variable" steht.

Weiter scheint dem TS unklar zu sein, dass man mit der Controls-Collection auch per (zusammengesetztem) Namen auf Controls eines Formulars und deren Attribute zugreifen kann.

Da die ursprüngliche Frage des TS eher etwas unpräzise ist, müssen wir abwarten, was er eigentlich gemeint hat...
Titel: Re: Function VAL()
Beitrag von: MzKlMu am August 04, 2020, 15:00:30
Hallo,
es ist doch völlig klar was er will.
Zitatich möchte mit der ermittelten Zahl aus dem Feldnamen weiterarbeiten.
es gibt bei mehrere Felder gleiche Namens, die sich durch die Ziffer unterscheiden

Was ja Aufzählungsfeldern entspricht die in einer Datenbank nicht zu suchen haben.
Titel: Re: Function VAL()
Beitrag von: DF6GL am August 04, 2020, 16:14:08
Hallo,

@crystal:

mir ist schon klar, was der TE will, und mir ist auch klar, was val() erledigt.


Diese Behauptung: 


  (val) versucht, aus dem Textfeld Namens "variable" den (ersten) numerischen Anteil zu extrahieren
ist aber nicht ganz korrekt, wie man hier sieht:

?val("a2")
 0

?val("2a")
 2
?val("2a3")
 2
?val("3a2")
 3


Noch mehr aufpassen muss man, wenn vermeintliche Dezimalzahlen im Spiel sind:

?val("2,5a")
 2

?val("2.5a")
 2,5
Titel: Re: Function VAL()
Beitrag von: crystal am August 04, 2020, 16:44:59
Hallo,

@MzKlMu

Du hast natürlich recht, wenn deine Vermutung stimmt.
Zitat von: undefinedHallo,
es ist doch völlig klar was er will.
Zitat
ich möchte mit der ermittelten Zahl aus dem Feldnamen weiterarbeiten.
es gibt bei mehrere Felder gleiche Namens, die sich durch die Ziffer unterscheiden

Was ja Aufzählungsfeldern entspricht die in einer Datenbank nicht zu suchen haben.
Ich vermute eher, dass es sich dabei um eine etwas ungenaue Formulierung handelt und eigentlich gemeint war:

Ich möchte mit dem (Zahlen-)Wert weiter arbeiten, der sich in Feldern ähnlichen Namens befindet, die sich nur durch Ziffern unterscheiden.

Dabei muss es sich nicht zwingend um Aufzählungen handeln, vielleicht war es auch nur Bequemlichkeit des Entwicklers (Attribut1, Attribut2 usw).

Letztlich können wir das nicht wissen, es sei denn, der TS erklärt es genauer.

@DF6GL
Eine schöne Erklärung zur val()-Funktion. Ich hatte das zugegeben etwas zu stark reduziert.

Ende der persönlichen Ansprache...

Ich bin sehr gespannt, was PeterW dazu schreiben wird, wenn er hoffentlich dazu schreibt.

Grüße,
crystal
Titel: Re: Function VAL()
Beitrag von: Beaker s.a. am August 04, 2020, 17:47:00
Hallo
@ Klaus
ZitatWas ja Aufzählungsfeldern entspricht die in einer Datenbank nicht zu suchen haben.
Das könnten aber auch ungebundene Felder sein. Und wenn er
eben den Zahlenwert aus dem Namen braucht, ist deine Lösung mit dem
Replace m.E. die beste.
Ich habe sowas mal für nummerierte Buttons gebraucht, allerdings ganz
anders mit Josef Pötzls EventBridge gelöst.
gruss ekkehard
Titel: Re: Function VAL()
Beitrag von: PeterW am August 05, 2020, 10:23:30
ich habe das Problem jetzt ganz anders gelöst
ich nutze den Marker des Feldes. Dorthabe ich bereits einen Eintrag drin, dem ich jetzt meine Zahl voranstelle.
Dann ich die folgende Funktion ausführen:
Function fncSuchStr()
    Vfeldname = "Value" & Trim(Str(Val(Me.ActiveControl.Tag))) ' Suchfeld
    Lfeldname = Me.ActiveControl.NAME ' Listenfeld
    Me.Form.Controls(Vfeldname) = Me.Form.Controls(Lfeldname)
End Function

Vielen Dank für eure Anregungen, sie haben meinen Denkprozess unterstützt
Titel: Re: Function VAL()
Beitrag von: Beaker s.a. am August 05, 2020, 17:56:19
Hallo Peter,
Wozu
Trim(Str(Val(Me.ActiveControl.Tag))) ?
Durch die autom. Typumwandlung von VBA erhältst du an dieser Stelle
immer einen String
Vfeldname = "Value" & Me.ActiveControl.Tag ' Suchfeld
gruss ekkehard

P.S.: Dein Code deutet auf das Fehlen von "Option Explicit" in allen
Modulköpfen hin. Ergänze das in eigenem Interesse. Du musst Variable
dann vor Verwendung immer erst deklarieren
Function fncSuchStr()
    Dim Vfeldname As String
    Dim Lfeldname As String
.
Hinweis: in alle neuen Module kannst du es autom. eintragen lassen,
wenn du das 2. Häkchen von oben wie im Bild gezeigt setzt.