[HS] [Excel] [VBA]

Partie du forum pour tout ce qui concerne la partie soft, ou logiciel, dans l'industrie. Forum, conseil, astuce et entraide sur les logiciels d'automatisme ou d'informatique industrielle .
Répondre
MiGaNuTs
Forcené des structures
Forcené des structures
Messages : 151
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret

[HS] [Excel] [VBA]

Message par MiGaNuTs » 06 janv. 2019, 18:09

Bonjour a tous.

J'ai une question un peu hors sujet, mais pas tant que ça.
J'ai besoin d'une fonction excel qui a partir de 2 octets (0-255 donc) me retourne la valeur du signed int qui corresponds.
tant que mon octet de poids fort est <128, pas de problème, c'est facile, c'est 256*poidsfort + poidsfaible
Mais quand mon poids fort est >=128 ca devient chiant a cause du signe, et je patine dans la semoule.
J'ai écrit un bout de VBA pour essayer de résoudre mon problème, mais je ne comprends pas a quel moment ça foire.
je croyait avoir a peu prés compris la gestion des nombres négatifs en binaire, mais apparemment y'a un moment ou j'ai raté une étape.

Code : Tout sélectionner

Function converti(fort As Byte, faible As integer)
    If fort < 128 Then
        converti = fort * 256 + faible
      Else
        converti = ((Not fort) * 256) + (Not faible)
        converti = (Not converti)
    End If
End Function

Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2870
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [HS] [Excel] [VBA]

Message par itasoft » 06 janv. 2019, 22:04

slts,
un exemple parmi d'autres


Dim SOURCE As Byte
Dim RESULT As Integer
'Exemple
SOURCE = 255

If (SOURCE And &H80) > 0 Then
RESULT = 0 - (&H80 - CInt(SOURCE And &H7F))
Else: RESULT = CInt(SOURCE)
End If


MsgBox (RESULT)
Automaticien privé (de tout)
itasoft@free.fr

MiGaNuTs
Forcené des structures
Forcené des structures
Messages : 151
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret

Re: [HS] [Excel] [VBA]

Message par MiGaNuTs » 06 janv. 2019, 23:01

En fait je cherchait pas le bug au bon endroit, pourtant il est énorme et dès la première ligne !
J'ai déclaré "faible" en int et non en byte, c'est ça qui mets le bronx.

Je me suis pris la tête pendant 2h pour une connerie qui était sous mes yeux, juste parce que je cherchait ailleurs.

Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2870
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [HS] [Excel] [VBA]

Message par itasoft » 06 janv. 2019, 23:30

slts,
mais au départ ta source celle qui contient une valeur de 0 à 255 c'est un Byte ou un Integer ??
si c'est un Byte au départ, ya pas besoin d"extraire les poids forts/faibles
exemple:

Function converti(Source As Byte) as Integer
If Source >= 128 Then
converti = 0 - ((Not (SOURCE)) + 1)
Else: converti = Source
End If
End Function
Automaticien privé (de tout)
itasoft@free.fr

MiGaNuTs
Forcené des structures
Forcené des structures
Messages : 151
Enregistré le : 12 nov. 2015, 21:02
Localisation : 45 - Loiret

Re: [HS] [Excel] [VBA]

Message par MiGaNuTs » 07 janv. 2019, 22:23

MES sources, c'est 2 bytes, pas un seul. (enfin 2 "any" <256)

Le truc relou c'est qu’apparemment excel utilise des int en 32 bits quand c'est pour faire sa cuisine dans des cellules, mais des int de 16 bits en VBA.
Et le plus chiant de tout c'est qu'il n'a pas l'air d'aimer les unsigned.

Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2870
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [HS] [Excel] [VBA]

Message par itasoft » 07 janv. 2019, 23:04

slts,
ok, j"avais compris que tu avais un seul Byte de 0 à 255 et que on voulais qu'il se comporte comme un Integer qui évolue entre
-128 à +127
Automaticien privé (de tout)
itasoft@free.fr

philou77
Créateur de langage
Créateur de langage
Messages : 701
Enregistré le : 21 oct. 2015, 10:00

Re: [HS] [Excel] [VBA]

Message par philou77 » 08 janv. 2019, 17:09

Salut !

Ceci devrait aller comme tu veux :
2 Bytes de source, un integer signé en sortie

If PFort < 128 Then ' Calcul sur le mot naturellement positif
Mot = (PFort * 256) + PFaible
Else ' Cacul sur l'inverse du mot et passage en négatif !
Mot = (((Not (PFort)) * 256) + (Not (PFaible))) * -1
End If
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! :D

Répondre