Textwerte in Zahlenwerte konvertieren
#1
Hallo,

eigentlich sollte es eine leichte Aufgabe sein. Die Typkonvertierung von  Stringwerten in eine Zahl,
um danach das Maximum des Feldes zu berechnen.

Leider krieg ich es nicht hin.

Hier mein Code:

Sub Max_Werte()

Dim i%, str As Variant
ReDim f(0 To 10)

For i = 0 To 10
str = str & Application.RandBetween(10, 100) & " "  'als String
f(i) = Application.RandBetween(10, 100)                   'gleich als Zahlenwerte
Next

Debug.Print WorksheetFunction.Max(f)  'OK

str = Split(Application.Trim(str), " ")

'!!!  Die Umwandlung von Stringwerten in Zahlenwerten klappt nicht
For i = LBound(str) To UBound(str) 
str(i) = CInt(str(i)) 'Problemstelle, hier hakt es
Next

Debug.Print WorksheetFunction.Max(str)

End Sub


Wie kann ich die Werte aus dem Feld str in Zahlenwerte umwandeln, damit ich das
Maximum für str berechnen kann?
Top
#2
Hallo,

über ein anderes Array mit dem passenden Typ geht es so

Code:
Sub Max_Werte()

   Dim i%, strTest As Variant, lngArray() As Long
   ReDim f(0 To 10)
  
   For i = 0 To 10
      strTest = strTest & Application.RandBetween(10, 100) & " "  'als String
      f(i) = Application.RandBetween(10, 100)                   'gleich als Zahlenwerte
   Next
  
   Debug.Print WorksheetFunction.Max(f)  'OK
  
   strTest = Split(Application.Trim(strTest), " ")
   ReDim lngArray(0 To UBound(strTest))
   '!!!  Die Umwandlung von Stringwerten in Zahlenwerten klappt nicht
   For i = LBound(strTest) To UBound(strTest) - 1
      lngArray(i) = strTest(i) 'Problemstelle, hier hakt es
   Next
  
   Debug.Print WorksheetFunction.Max(lngArray)

End Sub
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • santana
Top
#3
Hallo Stefan,

habe ich natürlich schon längst gemacht. Das Problem liegt für mich ganz woanders, nämlich in der

Logik bzw. ist eine Verständnisfrage.

Warum geht so etwas nicht:

str(i) = CInt(str(i))

Schaut man sich die Geschichte mal im Einzelschrittmodus im Lokalfenster an, sieht man das die

Anführungszeichen nicht verschwinden, also der Stringtyp erhalten bleibt.

Ergo sind  Funktionen wie Max und Min erst verfügbar mittels eines

Hilfsfeldes, wie du es ja auch machen würdest.

Letztendlich versteh ich nicht warums nicht geht.

Aber Danke!
Top
#4
Hi,

zu meinem Verständnis.

Ergibt dieser Code wirklich zwei Mal dieselben 11 Zufallszahlen?
Code:
...
   For i = 0 To 10
      strTest = strTest & Application.RandBetween(10, 100) & " "  'als String
      f(i) = Application.RandBetween(10, 100)                   'gleich als Zahlenwerte
   Next
...
Top
#5
Zitat:Ergibt dieser Code wirklich zwei Mal dieselben 11 Zufallszahlen?

Nein!

Eigentlich wollte ich hier nur 2 Felder gegenüberstellen. Feld f wo alles so läuft wie geplant

und das "Problemfeld" str, dass stets ein aus Strings bestehendes Feld bleibt.
[-] Folgende(r) 1 Nutzer sagt Danke an santana für diesen Beitrag:
  • Rabe
Top
#6
Hallo,

(04.06.2018, 20:29)santana schrieb: Warum geht so etwas nicht:

str(i) = CInt(str(i))

Schaut man sich die Geschichte mal im Einzelschrittmodus im Lokalfenster an, sieht man das die
Anführungszeichen nicht verschwinden, also der Stringtyp erhalten bleibt.

das einzelne Array-Element hat da den Typ String und ich konnte es auch mit Val und *1 nicht umwandeln, das Element behält den Typ String. Googeln brachte mich aber auf den Lösungsvorschlag.
Gruß Stefan
Win 10 / Office 2016
Top
#7
Hi,

ach so, das soll nicht heißen "als gleiche Zahlenwerte", sondern "abspeichern gleich als Zahlenwerte" ohne nachfolgende Umwandlung.
Top
#8
Der Spaß geht weiter!

Aber hier die Erklärung warum das Ganze nicht funktionierte.
(Beide Felder erhalten Gleiche Zufallszahlen)

Sub Lösung_Typenkonflikt()
Dim i%, h, str As Variant, tmp
ReDim f(0 To 10)
For i = 0 To 10
tmp = Application.RandBetween(10, 100)
Debug.Print TypeName(tmp)
str = str & tmp & ","
f(i) = tmp
Next
Debug.Print TypeName(str)
str = Split(Application.Trim(str))
Debug.Print TypeName(str)
Debug.Print TypeName(f)

'Deshalb geht so etwas nicht:
For i = 0 To 10
str(i) = h(i) '! Typenkonflikt geht nicht
str(i) = CStr(h(i)) '! Typenkonflikt geht nicht
Next

End Sub
Top
#9
Hi,

was soll h(i) sein?
da ist es klar das ein Typenkonflikt kommen muss

Ein Varianten Array mit Split erzeugt hat immer Text!
Da Split immer einen String ausgibt.

Variant arbeitet nach dem Prinzip, wenn Byte reicht dann Byte, wenn Byte nicht reicht dann Integer usw.
Wenn mal ein Text drinnen ist, dann bleibt dies bei Text (nur bei einem Variantenarray) da jeder numerische Wert auch als Text abgelegt werden kann.
Bug oder Feature, wer weiß es schon ;)
lg Chris
Feedback nicht vergessen.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
Top
#10
Hallo,

vielleicht sollest Du dir angewöhnen Option Explicit zu verwenden. So bemerkst Du eine nicht deklarierte Variable besser.
Gruß Stefan
Win 10 / Office 2016
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste