2017-06-06 10 views
-4

Je voudrais savoir comment utiliser la méthode bitconverter dans Excel VBA. Je voudrais convertir 4 octets chacun placé dans une cellule de différence dans un entier de 32 bits en utilisant BitConverter.ToInt32.Convertisseur de bits VBA

Quelqu'un peut-il m'aider avec un exemple à utiliser dans VBA? Je pense que je suis aux prises avec la syntaxe.

Merci

+0

'je voudrais convertir 4 octets à un integer' 32 bits et' je voudrais convertir 4 octets à un nombre entier de 32 bits en utilisant BitConverter.ToInt32 dans VBA' sont deux questions différentes [] (https : //meta.stackexchange.com/q/66377/147640). Que voulez-vous faire - trouver un moyen d'appeler les méthodes 'BitConverter' de .NET à partir de VBA ou convertir 4 octets en un int dans VBA? – GSerg

+0

Merci pour votre réponse! Mon but final est de convertir 4 octets en un int en VBA. Je pense que le plus pratique serait appel BitConverter de .NET, mais s'il y a un autre chemin, je serais également heureux d'apprendre – KarmaWin

+0

Si vous voulez appeler. BitConverter de .NET, alors chercher comment appeler le code .NET de VBA, don ' t demander aux gens d'écrire votre code pour vous. –

Répondre

2
  • Avec CopyMemory:

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) 
    
    Public Function BytesToLong(b() As Byte) As Long 
        CopyMemory BytesToLong, b(LBound(b)), 4 
    End Function 
    
  • Sans CopyMemory 1:

    Private Type thebytes 
        b(1 To 4) As Byte 
    End Type 
    
    Private Type thelong 
        l As Long 
    End Type 
    
    
    Public Function BytesToLong(b() As Byte) As Long 
        Dim tb As thebytes, tl As thelong 
        Dim lb As Long 
    
        lb = LBound(b) 
        tb.b(1) = b(lb) 
        tb.b(2) = b(lb + 1) 
        tb.b(3) = b(lb + 2) 
        tb.b(4) = b(lb + 3) 
    
        LSet tl = tb 
    
        BytesToLong = tl.l 
    End Function 
    
  • Sans CopyMemory 2:

    Public Function BytesToLong(b() As Byte) As Long 
        Dim lb As Long 
        lb = LBound(b) 
    
        If (b(lb + 3) And &H80) = &H80 Then 
        BytesToLong = (b(lb) + b(lb + 1) * &H100& + b(lb + 2) * &H10000 + (b(lb + 3) And Not &H80) * &H1000000) Or &H80000000 
        Else 
        BytesToLong = b(lb) + b(lb + 1) * &H100& + b(lb + 2) * &H10000 + b(lb + 3) * &H1000000 
        End If 
    
    End Function 
    
+1

Belle réponse spoonfeeder ... serait définitivement upvote si c'était une question décente. –

+0

@ Mat'sMug J'ai essayé de ne pas répondre, mais il ne semble pas y avoir d'autres doublons que https://stackoverflow.com/q/7801080/11683 et https://stackoverflow.com/q/15782705/11683, donc j'ai pensé, peu importe. J'ai upvoted votre commentaire. – GSerg

+1

eh, ce que le diable, l'avoir de toute façon =) –