IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Convertir le contenu d'un String en type Long


Sujet :

VBA

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Convertir le contenu d'un String en type Long
    Bonjour,

    je voudrais convertir le contenu d'un String en type Long.
    voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Dim i As Long
        Dim txt As String
     
        txt = Chr(255) & Chr(255) & Chr(255) & Chr(156) ' <== on a en hexa FFFFFF9C
    Je voudrais mettre la valeur de txt dans i qui est de type Long pour obtenir comme valeur -100 dans i.

    Avez-vous une astuce?

    Merci,

    Lian

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 67
    Points : 52
    Points
    52
    Par défaut
    Salut,

    tu peux peut être essayer la fonction CLng, c'est un fonction qui transforme une valeur en un entier long.

    Je pense que ce code marche

    Cordialement,

    Dylan

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    salut Dylan,

    hélas non ça ne marche pas! Ca serait trop facile!
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txt = Chr(255) & Chr(255) & Chr(255) & Chr(255) & Chr(156)
    J'ai comme erreur "Incompatibilité de type".
    Ca aurait marché si txt = "-100", mais là txt a comme valeur hexa FFFFFF9C ce qui équivaut en base 10 à la valeur -100.
    C'est comme ça que c'est codé sur la variable de type Long.

    Lian

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    l'idée ici est de passer par ton contraire : Hex(Asc( ))

    tu parcours chaque caractère de ton txt pour récupérer le 255, et après tu fais le traitement que tu veux
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Salut jpcheck,

    je voulais éviter de convertir les hexa en string, pour ensuite convertir le string hexa en type Long ça fait des manipulations supplémentaires.

    La variable txt (en String) contient déjà valeur de type Long, l'astuce que je ne trouve pas c'est comment mettre la valeur du txt (type String) dans la variable i de type Long, sans avoir une erreur "Incompatibilité de type". La fonction Clng s'attend à avoir des valeurs numériques "visibles" (-100) et non sa représentation en numérique machine (FFFFFF9C).

    Lian

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour, bonjour !

    Il ne s'agit pas du tout de convertir des hexa en string vu qu'à la base les codes des caractères n'en sont pas ‼

    La procédure indiquée est la bonne : convertir chaque caractère en hexa à concaténer dans une chaine
    puis au final convertir cette chaine préfixée de la notation hexadécimale
    comme dans l'exemple de l'aide VBA de la fonction Val, bref le B-A-BA en informatique …

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    ok s'il n'y pas d'autre solution, je prends celle que vous proposez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub test()
        Dim txt As String, tmp as String
        Dim i As Long, j As Long
     
        txt = Chr(255) & Chr(255) & Chr(255) & Chr(156)
        tmp = ""
        For j = 1 To Len(txt)
            tmp = tmp & Hex(Asc(Mid(txt, j, 1)))
        Next j
        Debug.Print tmp
        i = Val("&H" & tmp)
        Debug.Print i
        j = &HFFFFFF9C
        Debug.Print j
    End Sub
    Ce qui m'embete dans cette solution, c'est qu'on convertit la variable txt qui a pour valeur hexa FFFFFF9C (donc 4 octets) en du Hexadecimal "visible" sous forme de String à 8 octects (la fonction Hex() renvoie String), pour ensuite appeler la fonction Val() qui transforme le hexadecimal String en Long à 4 octets... c'est pas très optimisé.

    N'y-a-t-il pas une fonction/astuce qui dit à VBA de faire "comme si" txt est du Long pour qu'on puisse mettre directement txt dans i ?

    Lian

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Non car VBA respecte la Logique, tant au niveau mathématiques comme du type de données !

    A la base, il s'agit peut-être alors d'un problème de conception de l'applicatif …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Ok, merci pour vos réponses.

    Lian

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Sans explication de l'origine de la chaîne source, c'est la seule solution.

    Cependant je rappellerais qu'un simple type de données Long à la même représentation quel que soit le langage,
    en C, Delphi, VB comme tous les autres et bien entendu VBA !

    La représentation en caractères de -100 enregistrée en Long n'est pas celle présentée !

    Si la source est enregistrée en Long, il suffit de la lire en VBA aussi en Long et pas besoin de conversion "texte" !
    Conception à revoir donc …

    _____________________________________________________________________________________________________
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  11. #11
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Bonjour Marc,

    Pour tout te dit, la zone texte contient du numérique de type Long mais en codage EBCDIC...
    j'ai une étape de transcodification en ASCII avant de convertir en type Long ASCII.

    Lian

  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    OK, pas d'autre choix depuis une chaîne de caractères ASCII.

    Par contre si la source EBCDIC ne contient que des données numériques Long,
    via une recherche sur le net tu devrais trouver la conversion directe en Long normal.
    Mais cela ne fera rien gagner …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  13. #13
    Invité
    Invité(e)
    Par défaut
    Salut lian76us,

    Même si ça ne se sait pas beaucoup, le langage VBA permet de récupérer directement (de manière native) la valeur du Tableau inclus dans le String.
    Le type de donnée string est composé de 2 Tableaux entrelacé de type Byte (8 bit) pour être compatible avec Unicode (16 bits) qu'il t'es possible de récupérer comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub StringToByte()
        Dim txt As String
        Dim Tb() As Byte
        txt = Chr(255) & Chr(255) & Chr(255) & Chr(156) ' <== on a en hexa FFFFFF9C
        Tb = txt
    End Sub
    Je pense que c'est ça que tu recherche depuis le début ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Function StringToArrayByte(Txt As String) As Byte()
        StringToArrayByte = Txt
    End Function
     
    Function ArrayByteToString(Tb() As Byte) As String
        ArrayByteToString = Tb
    End Function
     
    Sub ConversionTest()
        Dim s(1 To 2) As String
        s(1) = Chr(255) & Chr(255) & Chr(255) & Chr(156)
        ' Double conversion en utilisant les 2 fonctions au dessus.
        s(2) = ArrayByteToString(StringToArrayByte(Chr(255) & Chr(255) & Chr(255) & Chr(156)))
    End Sub
    Il vaut mieux tout de même utiliser les fonctions Asc sur chaques caractères (plus fiable).
    Ici, Chr(156) renvoi l'équivalent d'un ChrW(256 + 83) parce que la représentation utilisé en interne est UNICODE 16 bit.
    Tous ou presque tous les caractères qui sont supérieur à 127 (limite du ASCII basique en principe) sont différents du codage ASCII.
    Chr(128) => ChrW(8364) etc... [Asc(ChrW(8364)) renvoi bien 128 par exemple].
    Les caractères Unicode et ASCII étant identique entre 0 et 127.
    Dernière modification par Invité ; 12/10/2015 à 19h25.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Salut Nouveau2,

    je note ton astuce qui peut être utile dans d'autre cas.
    Cependant, avec tes exemples, on peut toujours pas mettre la valeur de type Byte dans une variable Long, pour faire apparaitre -100.

    Lian

  16. #16
    Invité
    Invité(e)
    Par défaut
    Salut,

    Module1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Property Get ConversionString() As ConversionString
        Static o As New ConversionString
        Set ConversionString = o
    End Property
     
    Sub Test()
        Dim Tb() As Byte
        Dim l As Long
     
        Tb() = Strings.StrConv(Chr(156) & Chr(255) & Chr(255) & Chr(255), vbFromUnicode)
        l = ConversionString.ArrayByteUnicodeToLong(Tb())
     
    End Sub
    Classe ConversionString
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Option Explicit
     
    #If VBA7 Then 'Office 2010
        Private Declare PtrSafe Sub CopyMemory_ Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
        Private Declare PtrSafe Sub ZeroMemory_ Lib "kernel32" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As LongPtr)
    #Else ' Office 2007
        Private Declare Sub CopyMemory_ Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
        Private Declare Sub ZeroMemory_ Lib "kernel32" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)
    #End If
     
    Function ArrayByteAnsiToLong(Value() As Byte) As Long
        Const SIZEOF_LONG_VALUE As Long = 4
        Dim i As Long
        Dim Count As Long
     
        Count = UBound(Value()) - LBound(Value()) + 1
     
        If Count = SIZEOF_LONG_VALUE Then
            CopyMemory_ ArrayByteAnsiToLong, Value(LBound(Value())), SIZEOF_LONG_VALUE
        End If
    End Function

  17. #17
    Invité
    Invité(e)
    Par défaut
    Plus simple lors d'une éventuel utilisation.

    Dans la classe ConversionString:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Function StringAnsiToLong(Value As String) As Long
        Const SIZEOF_LONG As Long = 4
        Dim Tb() As Byte
        Dim Count As Long
     
        Tb() = StrConv(Value, vbFromUnicode)
        Count = UBound(Tb()) - LBound(Tb()) + 1
     
        Select Case Count
            Case Is <= 0
                Exit Function
            Case Is < SIZEOF_LONG
                CopyMemory_ StringAnsiToLong, Tb(LBound(Tb())), Count
            Case SIZEOF_LONG
                CopyMemory_ StringAnsiToLong, Tb(LBound(Tb())), SIZEOF_LONG
            Case Is > SIZEOF_LONG
                Err.Raise 6
            Case Else
                Err.Raise 1000, , "Impossible de convertir la chaîne de texte (String) d'entrée vers un format Long. " & _
                    "La chaîne de texte (String) d'entrée doit contenir 4 caractères Maximum au format Ainsi."
        End Select
    End Function
    Module1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Test()
        Dim l As Long
     
        l = ConversionString.StringAnsiToLong(Chr(156) & Chr(255) & Chr(255) & Chr(255))
    End Sub
    Dans cette représentation, l'opérateur de concaténation '&' ajoute des éléments à l'Array. La taille de l'array augmente.
    Chr(156) & Chr(255) est égal à Chr(156) & Chr(255) & Chr(0) & Chr(0).
    Chr(156) => Chr(156) & Chr(0) => Chr(156) & Chr(0) & Chr(0) => Chr(156) & Chr(0) & Chr(0) & Chr(0)


    Sinon, si ça ne convient pas, inverse les éléments de l'array.
    Dernière modification par Invité ; 14/10/2015 à 05h14.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2003
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Salut Nouveau2,

    je note cette possibilité.
    j'avais trouvé une autre solution un plus mathématique, mais VBA ne l'accepte pas, peut-être que tu peux me dire pourquoi :

    soit notre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim l as long
    l = &HFFFFFF9C  '<-- ce que represente donc -100
    'mathématiquement parlant ça doit équivaloire à
    l = &HFF * &H1000000 + &HFF * &H10000 + &HFF * &H100 + &H9C
    j'ai une erreur de dépassement de capacité alors que ça doit être équivalent...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir le contenu d'une String en ligne de code
    Par DamS2502 dans le forum Langage
    Réponses: 5
    Dernier message: 29/04/2008, 07h40
  2. Instancier un type avec son nom contenu dans un String
    Par the666deus dans le forum Langage
    Réponses: 7
    Dernier message: 24/05/2007, 14h41
  3. Réponses: 2
    Dernier message: 19/05/2007, 20h51
  4. Déterminer le type du contenu d'un string
    Par nicerico dans le forum Langage
    Réponses: 2
    Dernier message: 05/02/2007, 15h18
  5. Convertir un string en type property ou object
    Par bencot dans le forum Langage
    Réponses: 2
    Dernier message: 20/11/2004, 20h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo