2015-10-29 6 views
1

J'essaie de trouver octets bas/haut d'un certain nombre comme:octets haut et bas en VBA

If TextBox1.Value <> "" Then 
If TextBox1.Value < 65535 Then 
Dim lowByte As Byte 
Dim highByte As Byte 
Dim number As Long 
Dim textBoxValueLong As Long 
textBoxValueLong = Val(TextBox1.Value) 
lowByte = textBoxValueLong And &HFF& 
highByte = Fix(textBoxValueLong/256) 
number = highByte * 256 + lowByte 
Worksheets(1).Cells(1, 1) = highByte 
Worksheets(1).Cells(1, 2) = lowByte 
Worksheets(1).Cells(1, 3) = number 
End If 
End If 

Mais si le nombre est inférieur à -255, j'ai une erreur de débordement dans cette chaîne highByte = Fix(textBoxValueLong/256)

Qu'est-ce qui ne va pas? UPD: Si j'utilise cette chaîne: highByte = (textBoxValueI And &HFF00&)/256, il est possible de diviser en deux octets. Mais comment le fusionner correctement? Si j'utilise les numéros < 0 J'ai une erreur ici: number = highByte * 256 + lowByte

+2

essayez ça? http://www.vbi.org/Items/article.asp?id=56 – Jeremy

+0

@Jeremy Merci pour le lien. Ça m'a aidé. Mais comment connecter ces octets? Si j'essaie 'number = highByte * 256 + lowByte' voici une erreur (entrée <0) – levshkatov

Répondre

1

déclare highBite et Lowbyte comme long à la place, et vous serez en mesure de les fusionner

mais pour octet bas je suggère d'utiliser l'opérateur mod

lowByte = textBoxValueLong Mod 256 
+0

Ca a aidé mais pourquoi? lowByte et highByte sont dans la plage [0 ... 255], alors pourquoi utiliser Long au lieu de Byte? – levshkatov

+0

Merci pour l'explication! Et pourquoi vous utilisez Mod 256 au lieu de And & HFF &? – levshkatov

+1

mod, car lowByte = textBoxValueLong Et & HFF & ne produira pas de résultat correct pour les nombres négatifs, longtemps parce que highbyte contient un résultat négatif pour les nombres négatifs, ce qui n'est pas autorisé pour les octets (0 ... 255 seulement) – tsolina

1

Si vous avez vraiment besoin loByte et hiByte comme Byte s et doit rester dans les 2 octets plage entier, alors ce qui suit devrait être la solution:

Sub testInteger() 

Dim sTBV As String 

sTBV = "32767" 
'sTBV = "-32768" 

Dim maxI As Integer 
maxI = 127 * 256 + 255 
Dim minI As Integer 
minI = -128 * 256 

If Val(sTBV) >= minI And Val(sTBV) <= maxI Then 

    Dim i As Integer 
    i = Val(sTBV) 

    Dim loByte As Byte, hiByte As Byte 

    loByte = i And &HFF& 
    hiByte = (i And &HFF00&)/256 

    Dim j As Integer 
    j = Val("&H" & Hex(hiByte) & IIf(Len(Hex(loByte)) = 1, "0" & Hex(loByte), Hex(loByte))) 

    MsgBox hiByte & ", " & loByte & ", " & j 

Else 

    MsgBox "out of integer range" 

End If 

End Sub 

La plage de 2 octets est comprise entre -32768 et 32767 uniquement.