Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Excel/VBA] Userform decimal via komma en punt

Pagina: 1
Acties:

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 30-11 13:47
Teneerste, ik heb bewust géén versie info toegevoegd in de tag, omdat de code zowel op Excel 2003 als 2007 moet werken.

Situatie:
Via een Userform wordt de gebruiker om verschillende soorten informatie gevraagd. Een van de vragen betreft het gewicht. Dit gewicht kan zowel in KG als in lbs (ponden) worden ingevuld. Hiervoor zijn twee verschillende velden gemaakt. In het Excelbestand moet vervolgens alleend e KG waarde komen.

Probleem:
Afhankelijk van de instellingen wordt een punt of een komma gebruikt om de decimalen van de eenheden te scheiden. Ik wil het de gebruiker zo makkelijk mogelijk maken en beide accepteren.

Geprobeerd:
- google -> lastig zoeken, je komt vooral antwoorden tegen m.b.t. format van cells
- komma altijd vervangen door punt, levert niet het gewenste resultaat

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Met een regexp of een split() functie de input zelf parsen?
Overigens is in vba de punt altijd decimaal teken, dus zou het altijd omzetten van een , naar een punt en dan val() eroverheen wel moeten werken. Tenzij de gebruikers ook nog duizendtallen gaan invoeren natuurlijk. :)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 30-11 13:47
Ik snap er niets van, maar de volgende code werkt:

code:
1
2
3
4
5
6
7
  Dim ponden_punt As Double
  On Error GoTo gewichterror
  ponden_punt = Replace(Me.TxtGewichtlbs, ".", ",")
  On Error GoTo 0
  Dim lbs As Double
  lbs = 0.45359237
  Me.TxtGewichtKG.Value = ponden_punt * lbs


Het aparte is dat ik de waarde in het inputveld om moet zetten naar een komma, en de lbs een punt moet zijn.. Of zeg ik nu iets doms?

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 23:50
Of je code werkt is afhankelijk van de regional settings van je gebruiker.

Failsafe oplossing:
code:
1
2
3
4
5
6
7
8
9
10
11
  Dim ponden_punt As Double
  On Error GoTo gewichterror
  if application.decimalseperator= "," then
    ponden_punt = Replace(Me.TxtGewichtlbs, ".", ",")
  else
    ponden_punt = Replace(Me.TxtGewichtlbs, ",", ".")
  end if
  On Error GoTo 0
  Dim lbs As Double
  lbs = 0.45359237
  Me.TxtGewichtKG.Value = ponden_punt * lbs


De reden voor je verwarring: Wat er uit het inputveld komt wordt geintepreteerd met behulp va je regionale instellingen, het getal wat je hard in je code zet moet gewoon met een punt, omdat in VBA code de punt altijd het decimale symbool is.

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 30-11 13:47
Dank je, zeer duidelijke uitleg! De application.decimalseperator was de term die ik zocht.

(edit, kleine opmerking.. .value achter Me.TxtGewichtlbs is handig, en de juiste schrijfwijze van decimalseparator is DecimalSeparator)

[ Voor 43% gewijzigd door pietje63 op 12-09-2008 23:28 ]

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Kleine aanvulling:
Door pondenpunt als double te declareren introduceer je idd een impliciete conversie die leest uit de lokale instellingen. Imho zou het netter zijn om ponden_punt als tekst te declaren en val() te gebruiken. Die laatste is namelijk lokale-instellingen onafhankelijk. Je krijgt dan:

code:
1
2
3
4
Const lbs=0.45359237
Dim ponden as string
ponden=Replace(Me.TxtGewichtlbs, ", ".")
me.TxtGewichtKg = val(ponden) * lbs

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1