Avatar billede KFjorbak Nybegynder
09. november 2011 - 13:19 Der er 13 kommentarer

beregning med tal fra tekstbox i vba

Jeg har lavet en brugerformular, hvor der indtastes nogle værdier, som så skal bruges til at beregne nogle værdier, der sættes ind i en tekstbox i samme brugerformular og jeg har nu siddet med det så længe og prøvet så mange forskellige ting, så jeg er blevet helt lost. Jeg har derfor brug for hjælp med et par spørgsmål:

Hvis vba skal kunne regne videre med brugerens indtastning, hvordan skal det så konverteres til tal?

Når vba har beregnet en værdi ud fra indtastningerne i tekstbox, får man et udtryk med punktum imellem - f. eks 7.5, når jeg så vil regne videre med det, laves det om til 75:

Eks:
txtVærdi = 7.5
Værdi = txtVærdi
Værdi = CDbl(txtVærdi)
Værdi = Format(txtVærdi, "#,##0.00")

Har blandt andet prøvet disse tre muligheder, og i alle tilfælde ender Værdi med at blive 75 :(
Avatar billede supertekst Ekspert
09. november 2011 - 13:35 #1
DK / UK - version?

Indtaster du 7.5?
Avatar billede supertekst Ekspert
09. november 2011 - 13:40 #2
Prøv:
    txtværdi = Me.TextBox1
    værdi = CDbl(Replace(txtværdi, ".", ","))
    værdi2 = Format(værdi, "#,##0.00")
Avatar billede KFjorbak Nybegynder
09. november 2011 - 13:40 #3
Hvordan kan man se om det er DK eller UK?
Nej, 7.5 beregnes ud fra nogle indtastninger i brugerformularen.
Avatar billede supertekst Ekspert
09. november 2011 - 13:53 #4
Prøv at anvende det der er anført i #2 (replace).

(DK/UK - mente jeg selv Office-pakken)
Avatar billede neoman Novice
09. november 2011 - 14:04 #5
7.5 er syv og en halv med UK locale indstilling. Hvis du har dansk locale indstillet , så vil indtastning af 7.5 altid blive læst som 75. Så hvis du et eller andet sted fabrikerer et tal som 7,5, men bruger funktionen Str til at få tallet ud som streng, så får du 7.5, fordi Str er ligeglad med den lokale separator og bruger "." som decimal separato. Hvis du bruger CStr så vil du få 7,5.
Avatar billede KFjorbak Nybegynder
09. november 2011 - 21:47 #6
Tusind tak for jeres svar :)

@ supertekst
Office pakken er dansk.

Replace giver rigtigt nok 7,5, men skal jeg ikke have 7.5 for at kunne regne videre med værdien i vba?

@ neoman
Forstår ikke helt hvor jeg skal bruge CStr? hvis jeg bruger det på den værdi, vba har beregnet til 7.5, får jeg 75.
Avatar billede supertekst Ekspert
09. november 2011 - 22:53 #7
Prøv:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    txtværdi = Me.TextBox1
    værdi = CDbl(Replace(txtværdi, ".", ","))
    værdi2 = Format(værdi, "#,##0.00")
   
    værdi3 = CDbl(værdi2) * 2
    værdi4 = CDbl(værdi2) * 2.5 '<---
   
End Sub
Avatar billede neoman Novice
10. november 2011 - 08:39 #8
I dit eksempel:
Eks:
txtVærdi = 7.5
Værdi = txtVærdi
Værdi = CDbl(txtVærdi)
Værdi = Format(txtVærdi, "#,##0.00")

er slaget tabt efter første linje, for DER har txtVærdi fået 75 som værdi. Det viser du har en locale indstilling som bruger "," som decimal separator og ej "."

Hvor får du "7.5" fra ? Enten indtaster du det selv, så lad være at bruge "." ved indtastning, eller gså beregner systemet det, og du selv fremtvingrer brugen af "." som separator et eller andet sted ved en type konvertering fra tal til streng, og så går det galt. Lad være - VBA kan holde styr på det selv.

Du skal ikke have "7.5" at regne på,  med dansk locale indstilling,  men "7,5"
Avatar billede KFjorbak Nybegynder
10. november 2011 - 11:27 #9
Jeg har nu sat Format på selve beregningen, hvilket giver "," som separator.

Det ser nu ca sådan her ud:

Værdi1 = CDbl(txtTextbox1)
Værdi2 = CDbl(txtTextbox2)
Procent1 = CDbl(txtTextbox3)
Procent2 = CDbl(txtTextbox4)

txtVærdi.Value = Format(Værdi1*(Procent1/100)+Værdi2*(Procent2/100), "#,##0.00")

Er det den rigtige måde at hive de indtastede værdier ud på, og formatere beregningen?

Alle mine indtastede værdier var faktisk heltal, så det er i beregningen, at "." bliver separator - ved ikke helt hvorfor.

Eksempel:
Værdi1 = 10
Værdi2 = 5
Procent1 = 50
Procent2 = 50

uden format: 7.5, med format: 7,5
Avatar billede KFjorbak Nybegynder
10. november 2011 - 11:43 #10
@ supertekst:
Jeg havde egentlig lavet en Sub for hver textbox, som kørte hver gang, jeg ændrede i boxen ( Sub Textbox_Change() ), men kan se at du har foreslået
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean).

Jeg kender ikke denne funktion, og er ikke helt med på, hvad det der står i parentesen gør? Men er denne bedre at bruge, når man vil opdatere beregningen hver gang en værdi i en af boxene ændres?
Avatar billede neoman Novice
10. november 2011 - 11:48 #11
Der er et eller andet helt ufroståeligt her.

Tal er tal, og du bør holde dig til TAL til numeriske beregninger.

Format er en måde at vise et tal på, som ikke har indflydelse på tallets værdi. Meeen, hvis du begynder at lave ting som

"txtVærdi.Value = Format(Værdi1*(Procent1/100)+Værdi2*(Procent2/100), "#,##0.00")"

så ryger du altså ud i problemer, fordi du konverter et tal til en streng, og formentligt bruger så strengen længere henne. Og det er sikkert dér det er gået galt for dig.

Formattering af tal har ingen indlydelse på tallet. Når du viser tallet i en textboks, så er det tekstboksens format der bestemmer hvordan tallet vises, uden at ændre dets værdi. Men når du begynder at cykle frem og tilbage mellem tal og strenge, så er det jo præcist der det går galt. 

Kan du vise et helt forløb, dvs input, beregning og output.

I øvrigt bør du have OPtion Explicit øverst i dit modul, og deklarere alle variable, så der er styr på havd der er streng og hvad der er tal.

Dit første eksempel:
Værdi = txtVærdi
Værdi = CDbl(txtVærdi)
Værdi = Format(txtVærdi, "#,##0.00")

viser en sammenblanding af koncepter: cdbl producerer et tal, mens Format outputter en streng).
Avatar billede KFjorbak Nybegynder
16. november 2011 - 14:10 #12
Tusind tak for hjælpen :)
min fejl lå primært i, at jeg ikke vidste, at Format funktionen lavede tallet til en streng, så det var neomans sidste kommentar, der løste problemet :)
Avatar billede KFjorbak Nybegynder
22. januar 2012 - 16:41 #13
@ neoman: lægger du et svar, så du kan få point?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester