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

Macros et VBA Excel Discussion :

Passer un tableau Variant/String en Variant/Long


Sujet :

Macros et VBA Excel

  1. #1
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut Passer un tableau Variant/String en Variant/Long
    Bonjour à tous,

    J'ai une chaine de nombres que je splitte.
    Pour des raison de performance je voudrais passer le résultat en Long, mais malgré la boucle il reste obstinément en String (?).
    Au final je pense que je créerai un autre tableau() as Long pour un meilleur gain mais j'aimerai bien comprendre.
    Quelqu'un a une idée du pourquoi et si une autre écriture permettrai de réaliser ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test2()
        Dim ref1 As Variant, i As Long
        ref1 = "1:2:3:4"
        ref1 = Split(ref1, ":")
        For i = 0 To 3
            ref1(i) = CLng(ref1(i))
        Next i
    End Sub
    A tout hasard j'ai tenté ref1(i) = ref1(i) + 0 mais même punition
    eric

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour eriiic,
    Teste avec val("2")

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonne idée, mais non... C'est pareil :-)

  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,

    commence par simplifier ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ref1 = "1:2:3:4"
    ref1 = Split(ref1, ":")
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ref1 = Split("1:2:3:4", ":")
    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 extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour eriiic,
    Il n'est jamais bon de jouer avec le typage des variables en VBA
    la fonction Split induit pour VBA un typage en String, typage qu'il garde en mémoire et te "resert"
    Typer en Variant ne permet que de laisser à VBA le soin de décider du type. Une fois le type décidé, VBA n'en permet pas la modification (question de la gestion "idoine" d'occupation en mémoire)
    Je ne vois pas de solution vraiment totalement "saine" autre que du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim ref1 As Variant, ref2() As Long, i As Long
      ref1 = "1:2:3:4"
      ref1 = Split(ref1, ":")
      ReDim ref2(UBound(ref1))
       For i = 0 To 3
            ref2(i) = CLng(ref1(i))
        Next i
    MsgBox TypeName(ref1(0)) & vbCrLf & TypeName(ref2(0))
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    @Jean-Philippe
    j'ai simplifié pour le forum, en fait ref1 est le résultat de plusieurs opérations de chaines.

    @unparia
    C'est ce que je me suis 'résolu' à faire, sans trop me forcer vu qu'un tableau Long sera le plus performant.
    Mais je m'étonne de ne pas avoir remarqué ça plus tôt.

    Une fois le type décidé, VBA n'en permet pas la modification
    ça n'a l'air qu'être que dans le cas d'un tableau résultant d'un Split.

    Si je dimensionne moi-même mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim ref1(0 To 3) As Variant, i As Long
        ref1(0) = "1"
        ref1(0) = 1
    ou même un variant transformé 'automatiquement' en tableau pour se rapprocher du cas du Split
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim v
        v = [A1:A4].Value 'chaines
        v(1, 1) = 1
    mes Variant/String se transforment bien en Variant/Integer
    Je dis bizarre ce tableau issu de Split... :-)

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    a vrai dire je ne vois pas ou est ton probleme dans ta convertion a moins que tu le réinjecte dans le tableau
    Nom : Capture.JPG
Affichages : 1054
Taille : 102,4 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Euh ...
    Et le cheval blanc d'Henri IV est blanc ...
    Allons allons !
    Et ce serait un miracle si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox TypeName(CLng("1"))
    affichait "Long" ?
    Cela ne ferait toujours pas que "1" ne serait pas de type string. Seul Clng("1") le serait.

    EDIT : enfin, quoi --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim a As Variant
    a = "1"
    MsgBox TypeName(CLng(a)) & vbCrLf & TypeName(a) & vbCrLf & TypeName(CDate(a))
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Invité
    Invité(e)
    Par défaut
    En fait le cheval d'Henri IV était baie blanc c'était son nom.

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Patrick le pb se pose plutôt ici :
    Nom : 2018-04-12_23-02-43.png
Affichages : 1044
Taille : 20,9 Ko

    Après passage dans la boucle on devrait avoir des Integer


    Mais ton intervention n'aura pas été inutile puisque c'est en faisant la capture que je me suis aperçu de la différence fondamentale qui explique ce comportement.

    Si on regarde la variable elle-même (Ref1 ici dans la capture) elle est de type Variant/String !
    Dans un tableau 'normal' où les valeurs peuvent passer de Variant/String <--> Variant/Long, la variable elle-même est de type Variant/Variant.

    Avec Split() on se retrouve donc avec une variable Variant ne pouvant pas varier :-s
    Drôle de concept qui me dépasse. Obélix dirait "Ils sont fous ces ricains" :-)
    Je pense qu'il faut se faire une raison.
    Merci à tous :-)
    eric

  11. #11
    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 !

    Citation Envoyé par eriiic Voir le message
    ça n'a l'air qu'être que dans le cas d'un tableau résultant d'un Split.
    Oui comme clairement indiqué dans l'aide VBA de Split !


    Citation Envoyé par eriiic Voir le message
    Après passage dans la boucle on devrait avoir des Integer
    Et non comme déjà évoqué juste au dessus et déjà précédemment par unparia (Salut !),
    la variable tableau résultant de Split étant déclarée soit en String soit en Variant/String par défaut
    comme du reste c'est clairement visible dans ta capture des fenêtres Espions & Variables locales

    Ce n'est donc pas une simple variable Variant mais une variable Variant/String.

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    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)

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour Marc-L

    ça n'a l'air qu'être que dans le cas d'un tableau résultant d'un Split.
    Oui comme clairement indiqué dans l'aide VBA de Split !
    rien vu sur le type de tableau retourné dans l'aide 2010.
    Qu'as-tu vu de si clair ?
    eric

  13. #13
    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

    Dans mon aide, il est indiqué plusieurs fois « sous-chaînes » et du reste comme sur MSDN,
    en lisant l'explication de chacun de ses arguments.

    Si l'aide apporte un doute, en cours d'exécution la consultation de la fenêtre Variables locales l'ôte …
    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)

  14. #14
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    « sous-chaînes » ne veut pas dire type Variant/String chez moi mais bon.
    Oui, c'est bien dans la fenêtre espion que je l'ai vu.
    Merci
    eric

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    salut eriic

    Split, fonction

    Voir aussi Exemple Particularités
    Description
    Renvoie un tableau de base
    zéro à une dimension contenant le nombre spécifié de sous-chaînes.
    Syntaxe
    Split(expression[,
    delimiter[, limit[,
    compare]]])
    La syntaxe de la fonction Split comprend les arguments nommés suivants :

    souschaines!!!!!! donc string sinon ils auraient ecris nombres
    split est une fonction texte du debut a la fin
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    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




    Oui comme Join & Filter, avec Split le triptyque référencé dans le tutoriel Manipuler les chaînes de caractères …
    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)

  17. #17
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Je ne vois pas en quoi on peut en déduire que c'est obligatoirement un tableau Variant/String et non un tableau Variant/Variant avec des données Variant/String comme il aurait très bien pu l'être s'ils avaient fait ce choix.
    Là on aurait pu changer le type des données.
    Vous faites des spéculations et affirmations à partir de la réponse, pas très rigoureux ça ;-)
    eric

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    speculation?????

    essaie msgbox ubound(split(2,1)) tu verrabien peut etre que tu a plus de chance que tout les autres
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  19. #19
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Il faut rester dans le contexte du post, là tu pars sur autre chose.
    Spéculation (déductions si tu préfères) sur le type de donnée retournée à la seule lecture de l'aide.

    cf :
    Je ne vois pas en quoi on peut en déduire que c'est obligatoirement un tableau Variant/String et non un tableau Variant/Variant avec des données Variant/String comme il aurait très bien pu l'être s'ils avaient fait ce choix.
    Mais bon, pas la peine d'épiloguer trop longtemps. Le sujet n'avancera plus puisque expliqué :-)

  20. #20
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour à tout ce beau monde,

    Voici une autre façon de faire (contournement de création d'une seconde variable) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Demo()
    Dim ref As Variant, i&
     
       ref = Array(Split("1:2:3:4", ":"))
       ReDim Preserve ref(0 To UBound(ref(LBound(ref)))) As Variant
       For i = LBound(ref) + 1 To UBound(ref)
          ref(i) = CLng(ref(LBound(ref))(i))
       Next i
       ref(LBound(ref)) = CLng(ref(LBound(ref))(0))
    End Sub
    Au final, ref est de type Variant/Variant avec des données de type Variant/Long.
    Je ne sais pas si c'est ce qu'y est recherché ici...
    Cordialement,
    Franck

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Passer un tableau de string à un dll c++
    Par marcus7 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2013, 13h53
  2. [COM] Convertion string en VARIANT
    Par themadmax dans le forum C++
    Réponses: 0
    Dernier message: 21/08/2007, 18h26
  3. Réponses: 5
    Dernier message: 04/06/2007, 17h07
  4. Réponses: 10
    Dernier message: 05/02/2007, 11h21
  5. Passer Tableau de String à une procedure.
    Par JFKen dans le forum Access
    Réponses: 3
    Dernier message: 02/08/2006, 16h26

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