January 20, 2003
Varför står det:
Run-time error '6':
Overflow
När jag skriver in ett värde i Text1.Text som ÖVERSTIGER 50???
Private Sub Command4_Click()
If Val(Text1.Text) < 11 Then
Text6.Text = 1000 * Val(Text1.Text) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) < 21 Then
Text6.Text = 1000 * 10 + 900 * (Val(Text1.Text) - 10) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) < 51 Then
Text6.Text = 1000 * 10 + 900 * 10 + 800 * (Val(Text1.Text) - 20) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) < 101 Then
Text6.Text = 1000 * 10 + 900 * 10 + 800 * 30 + 650 * (Val(Text1.Text) - 50) + (Val(Text3.Text) * 20) + Val(Text4.Text)
Else
If Val(Text1.Text) > 100 Then
Text6.Text = 1000 * 10 + 900 * 30 + 800 * 30 + 650 * 50 + 450 * (Val(Text1.Text) - 100) + (Val(Text3.Text) * 20) + Val(Text4.Text)
End If
End If
End If
End If
End If
End Sub
då måste det vär vara nåt fel på 4e o 5e if-satserna???
jättetacksam om hjälp!!
September 28, 2002
Du får köra lite beräkningar åt gången, exempel:
Dim majs, majs2 As Long
majs = (1000 * 10) + (900 * 10)
majs = majs + (800 * 30)
majs2 = 650 * (Int(Text1.Text) - 50) + (Int(Text3.Text) * 20) + Int(Text4.Text)
Text6.Text = majs + majs2
Givetvis går att göra på andra sätt, men det funkar iaf 🙂
tips: använd elseif istället för if följt av else
September 28, 2002
Jag tror det har nåt med '*'-operatorn att göra, att den använder sig automagiskt av integers eller nåt.
En annan lösning är att sätta 'CLng' framför talen, exempel:
(CLng(1000) * 10) + (CLng(900) * 10) + (CLng(800) * 30)
Detta fungerar dock endast om resultatet läggs i en variabel av typen long, dvs att man inte lägger resultatet i textfältet direkt.
September 28, 2002
Textfälten har inte den begränsningen, de klarar av större tal än 32767 (precis som Long).
Däremot klarar inte *-operatorn av att summan blir högre.
Därför Fungerar inte:
Dim x as Long
x = 5000*500
Men följande fungerar:
Text1.Text = CLng(3000) * 500
För då tvingar man *-operatorn att använda Long på summan.
July 28, 2003
Problemet är inte *-operatorn, utan hur VB gör automatiska typomvandlingar. Utan Clng omvandlar VB till integer (implicit type casting), vilken har begränsningen jag nämnde ovan. När man själv talar om för VB att omvandla till Long (explicit type casting) slipper man det problemet. Dessutom kan man inte säga att textfält har ett begränsat talområde eftersom de inte har ett talområde överhuvud taget. Text-fält kan bara innehålla text, inget annat. De kan däremot ha en begränsning för hur lång texten får vara. Den brukar dock vara betydligt längre än 5 (längden på "32767").
September 28, 2002
Vb gör om till integers när man använder *-operatorn, på vilket sätt är det då inte operatorn som är problemet? (jag vet att vb gör om det till en integer vid användande av *)
Long = 456456456 , fungerar till exempel, men inte Long = 5000*500.
Textfält klarar visst av stora tal, sedan att dom hanterar det som text är en annan fråga och jag har inte påstått något annat.
July 28, 2003
Det är inte användatet av operatorn som gör att VB omvandlar till int. När VB ser konstanterna 5000/500 eller what ever... ser VB det som en int. Om du skriver:
Long a = 5000 * 500, ser VB det som:
Long a = (Int) 5000 * (Int) 500.
Om du däremot gör:
Long b = 5000
Long c = 500
Long a = b * c, ska det inte vara några problem.
September 28, 2002
July 28, 2003
Att det inte blir det när du skriver
Long a = 28687324 beror på att i det fallet omvandlar VB det automatiskt till Long....
Så varför omvandlar VB det till ints när man gör uträkningar? Bra fråga. Det är dessutom ganska dumt att göra det, eftersom dagens datorer är 32-bitars och därför är snabbare med 32-bitars tal, dvs. long. Antagligen är det något som har hängt med sedan 16-bitars-datorerna... rätta mig om jag har fel här... har inte använt VB på många år nu.
Troligen vill VB minimera antalet typomvandlingar, varför den först tittar på den första operationen som ska göras
ex:
Long a = 5000 * 500
Här är första operationen *. För att kunna göra den behöver inte VB göra någon typomvandling... både 5000 och 500 är ju redan int:ar (att operationen genererar ett overflow kan ju inte VB veta). När operationen har gjorts tittar VB på nästa steg, '='. Där behövs det en typomvandling (Int --> Long). Tyvärr har redan *-operationen gjorts, så overflow har redan skett...
I fallet
Long a = 123456789
ser VB direkt att 123456789 måste omvandlas till Long. Inget overflow sker.
2 Guest(s)