Overflow

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.232
Om foutonderschepping te demonsteren maakte ik de volgende sub:

Code:
Sub ErrorTrapping2()
Dim number1 As Byte
On Error GoTo MyErrorMessage
number1 = InputBox("Give a number")

MsgBox "Multiplication: " & number1 * number1

Exit Sub

MyErrorMessage:
MsgBox Err.Number & " - " & Err.Description


'How could you make this more user friendly?
End Sub

Als men in de Inputbox 1000 ingeeft, krijg je natuurlijk overflow
Maar als je 200 ingeeft ook, blijkbaar omdat 200 * 200 geen byte is.
Er ontgaat me hier iets... Ik heb toch nergens gespecifieerd dat het resultaat binnen de limieten van een byte moet liggen???
 
Je vermenigvuldigd 2 byte types met elkaar. VBA neemt dan aan dat het resultaat ook een byte moet zijn. Vandaar de overflow error.
 
Waarom declareer je niet als Double?
Code:
Dim number1 As [COLOR=#0000ff]Double[/COLOR]
 
Dat kan uiteraard, maar het ging even om de vraag wat er precies gebeurt.
 
In de wereld van Bytes ben ik helaas niet bekend. :rolleyes:
 
Daar kan een getal in van 0 t/m 255.
 
Zover las ik het uit de Help van Vba ook, maar wat kan je ermee.
 
Het neem minder geheugenruimte in dan een Integer, Longword, Double of Variant. Het gaat dus om geheugengebruik.
 
Oké, echt iets van vroeger zeg maar.
 
Wat een simpel macrootje betreft heb je daar inderdaad geen omkijken naar. Maar in grotere projecten, in welke taal dan ook, is het wel degelijk van belang.
 
Het was bedoeld als voorbeeld om studenten foutonderschepping te laten programmeren. Als je een byte vraagt en men geeft iets in dat te groot of te klein is, krijg je fout 6 ("overloop"). Geef je tekst in (of cancel) krijg je fout 13: "Typen komen niet overeen"
Op dat nummer kan je dan inspelen met een voor iedereen begrijpbare melding.
 
Een jaar of wat terug was er eens een vraag over Integer of declareren as Long.
Tegenwoordig kon ik beter altijd maar Long schrijven schreef JkP; zit je altijd goed en qua geheugen maakte dat met de Pc's van nu haast geen verschil.
Vanaf die tijd alleen maar Long.

Nou ja, in ieder geval iets wijzer geworden over Bytes.
Bedankt Ed. :thumb:
 
Dim number1 As Byte

Er ontgaat me hier iets... Ik heb toch nergens gespecifieerd dat het resultaat binnen de limieten van een byte moet liggen???

Ik reageerde hierop eigenlijk.
 
Als je standaard VBA gebruikt heb je eigenlijk ook niet meer nodig. Maar als je routines uit bijvoorbeeld de User32.dll en dat soort zaken gaat gebruiken zal je toch echt de datatypes moeten gebruiken die worden vereist. Als zal je daarin niet snel een Byte tegenkomen.

@Rene:
Dat begreep ik. Zelf doe ik dat zo:
Code:
MyErrorMessage:
    Select Case Err.Number
        Case 13: MsgBox "Onjuiste waarde"
        Case 52: MsgBox "Onjuist pad of bestand"
        Case Else
            MsgBox Err.Number & " - " & Err.Description
    End Select
    Resume Next

Zo kan kan je iedere fout van een eigen bericht of context afhankelijke tekst voorzien.
 
Laatst bewerkt:
of
Code:
Sub M_snb()
'    Dim number1 As Byte
    On Error Resume Next
    number1 = InputBox("Give a number")
    
    MsgBox "Multiplication: " & number1 * number1
    If Err.Number <> 0 Then MsgBox "had nou maar niet gedeclareerd"
End Sub

Ontdek het verschil door het toevoegen/weghalen van de apostrof bij de declaratie.
Declareer alleen wanneer nodig (voor private of public scope); en dan zo algemeen mogelijk: ongespecificeerd, dus Variant.
Dan hoeft geen enkele onbegrijpelijke foutcode vertaald te worden, omdat die nl. eenvoudig niet voorkomt.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan