Neuigkeiten:

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

Mobiles Hauptmenü

Function VAL()

Begonnen von PeterW, August 04, 2020, 11:09:50

⏪ vorheriges - nächstes ⏩

PeterW

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?
Viele Grüße aus Berlin
Peter

MzKlMu

Hallo,
das wichtigste zeigst Du nicht, nämlich den Inhalt von Testfeld3
Gruß Klaus

PeterW

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
Viele Grüße aus Berlin
Peter

MzKlMu

#3
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.
Gruß Klaus

DF6GL

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.

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

PhilS

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

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MzKlMu

#6
@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", "")
Gruß Klaus

crystal

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
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

DF6GL

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.


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

crystal

@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...
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

MzKlMu

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.
Gruß Klaus

DF6GL

#11
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
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

crystal

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
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Beaker s.a.

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
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)

PeterW

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
Viele Grüße aus Berlin
Peter