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?
Hallo,
das wichtigste zeigst Du nicht, nämlich den Inhalt von Testfeld3
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
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.
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.
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)
@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", "")
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
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.
@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...
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.
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
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
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
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
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.