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 :

probleme:variable string en retour au lieu d'un array


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut probleme:variable string en retour au lieu d'un array
    Bonjour a tous
    j'ai un petit soucis avec le retour d'une variable
    cela devrait être un array mais au lieu de ca j'ai le string de l'array
    si quelqu'un a une idée du pourquoi comment je suis preneur


    connaissances minimum en JS requises
    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
    '=======================================================================
    'teste de restitution en tableau
    Function NBP2(max, T)
        Set sc = CreateObject("ScriptControl")
        code = code & "function NBP(max){var keys= new Array(); var a = 0;for(i = 2; i <= max; i++) {var j = 1;var racine = Math.floor(Math.sqrt(i));"
        code = code & "do {j++;} while(j <= racine && i%j != 0);if(j > racine) {keys.push(a);keys[a]=i;a=a+1; }};return keys}"
        With sc: .Language = "JScript": .AddCode code: End With
        T = Timer: NBP2 = sc.Run("NBP", max): T = Timer - T
    End Function
     
    Sub test2()
        Dim T
        resultat = NBP2(100000, T)
        ' ici je ne comprends pas j'ai un string en retour dans les variables locales
        Debug.Print resultat ' ici c'est un string alors que ca ne devrait pas en être 
        Debug.Print "temps ecoulé " & T & " secondes"
    End Sub
    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

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Désolé, j'y connais rien en JS, mais j'ai bien un tableau comme ça

    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
    '=======================================================================
    'teste de restitution en tableau
    Function NBP2(max, T) As Variant
        Set sc = CreateObject("ScriptControl")
        code = code & "function NBP(max){var keys= new Array(); var a = 0;for(i = 2; i <= max; i++) {var j = 1;var racine = Math.floor(Math.sqrt(i));"
        code = code & "do {j++;} while(j <= racine && i%j != 0);if(j > racine) {keys.push(a);keys[a]=i;a=a+1; }};return keys}"
        With sc: .Language = "JScript": .AddCode code: End With
        T = Timer: NBP2 = Split(sc.Run("NBP", max), ","): T = Timer - T
    End Function
     
    Sub test2()
        Dim T
        resultat = NBP2(100000, T)
        Debug.Print UBound(resultat)
        Debug.Print "temps ecoulé " & T & " secondes"
    End Sub
    Si besoin d'injecter les éléments sur une feuille, un petit Transpose... s'impose
    Dans la fonction ou dans l'appelante, au choix

    Ici, dans la fonction, pour injecter le résultat en partant de la cellule active
    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
    '=======================================================================
    'teste de restitution en tableau
    Function NBP2(max, T) As Variant
        Set sc = CreateObject("ScriptControl")
        code = code & "function NBP(max){var keys= new Array(); var a = 0;for(i = 2; i <= max; i++) {var j = 1;var racine = Math.floor(Math.sqrt(i));"
        code = code & "do {j++;} while(j <= racine && i%j != 0);if(j > racine) {keys.push(a);keys[a]=i;a=a+1; }};return keys}"
        With sc: .Language = "JScript": .AddCode code: End With
        T = Timer: NBP2 = Application.Transpose(Split(sc.Run("NBP", max), ",")): T = Timer - T
    End Function
     
    Sub test2()
        Dim T
        resultat = NBP2(100000, T)
        Debug.Print UBound(resultat)
        Debug.Print "temps ecoulé " & T & " secondes"
        ActiveCell.Resize(UBound(resultat), 1).Value = resultat
    End Sub

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    BONSOIR jOE
    re

    oui spliter le résultat mais ce serait prendre le chemin le plus facile sans comprendre pourquoi keys devient un string en VBA
    c'est pas normal keys est bien un array dans le JS
    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

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    T'as posé la question dans la section VBA, j'ai donc touché le VBA


    tient, c'est côté js qui ça coince apparemment : http://ramblings.mcpher.com/Home/exc...control/arrays

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut
    re
    y amemprise je crois
    en fait dans ton lien on traite un dictionnaire Scripting.dictionary

    et en JavaScript on traite cet object comme l'Object "Scripting.arraylist" dans VBA avec le suffixe "[FONT=Courier New].toArray()[/FONT]" pour avoir un tableau

    le ".sort" pour un dico en vba ca n'existe pas seulement pour Scripting.arraylist et sortedlist je crois aussi sauf que sortedlist possède (cle/valeur) comme le dico mais pas arraylist
    [FONT=Courier New]
    "return new VBArray(arrayIn).toArray();}"


    dans mon code keys et d'entrée un array non il y a quelque chose qui cloche mais je comprends pas

    je recherche
    a si il y avait Mercatog dans le coin on serait fixé [/FONT]


    re
    d'ailleurs tiens fait le test
    j'ai remplacer return keys par return keys[5]
    regarde le résultat
    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
    '=======================================================================
    'teste de restitution en tableau
    Function NBP2(max, T)
        Set sc = CreateObject("ScriptControl")
        code = code & "function NBP(max){var keys= new Array(); var a = 0;for(i = 2; i <= max; i++) {var j = 1;var racine = Math.floor(Math.sqrt(i));"
        code = code & "do {j++;} while(j <= racine && i%j != 0);if(j > racine) {keys.push(a);keys[a]=i;a=a+1; }};return keys[5];}"
        With sc: .Language = "JScript": .AddCode code: End With
        T = Timer: NBP2 = sc.Run("NBP", max): T = Timer - T
    End Function
     
    Sub test2()
        Dim T
        resultat = NBP2(1000, T)
        ' ici je ne comprends pas j'ai un string en retour dans les variables locales
        Debug.Print resultat ' ici c'est un string alors que ca ne devrait pas en être
        Debug.Print "temps ecoulé " & T & " secondes"
    End Sub
    voila on est bien donc d'accords keys est bien un array
    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

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Patrick

    Je n'ai pas de réponse exacte mais j'ai des doutes que Run transforme le tableau js Keys en string ou en objet JScriptTypeInfo (de la même manière)

    Regarde ton code avec les lignes 6 ou 7 en commentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function NBP2(max, T)
    code = code & "function NBP(max){var keys= []; var a = 0;for(i = 2; i <= max; i++) {var j = 1;var racine = Math.floor(Math.sqrt(i));"
    code = code & "do {j++;} while(j <= racine && i%j != 0);if(j > racine) {keys.push(a);keys[a]=i;a=a+1; }};return keys;}"
    Set Sc = CreateObject("ScriptControl")
    With Sc: .Language = "JScript": .AddCode code: End With
    T = Timer: Set NBP2 = Sc.Run("NBP", max): T = Timer - T
    'T = Timer: NBP2 = Sc.Run("NBP", max): T = Timer - T
    Debug.Print TypeName(NBP2); VarType(NBP2)
    End Function
    Les 2 cas ont une vartype=8 , càd string (cher à Marc-L)

    Pour tester le cas de "l'objet"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test2()
    Dim T As Long
    Dim Elm
     
    Set resultat = NBP2(1000, T)
    For Each Elm In resultat
        Debug.Print Elm                                   '
    Next Elm
    End Sub

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    et ben voila
    on a donc un abject en retour c'est assez étonnant je vais bucher la question
    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
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Un "objet" bizarre car en même temps c'est un string!
    l'Array javascript n'est plus un Array vba après le Run (même chose que eval)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set NBP2=Sc.eval("NBP(" & max & ")")

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonsoir au fait

    oui bizarre d'autant plus que ta déclaration js

    var keys[] 'est normalement un tableau et retourne un string ou object en vba

    autant et tandis que

    var keys= new array() retourne un string en vba
    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

  10. #10
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    quand on passe par une variable objet, on obtient en retour un Type JScriptTypeInfo

    Je pense que VBA comprend que l'objet ne lui appartient pas, il arrive à la lire mais pas sous la forme d'un tableau de String() manipulables en VBA.
    Peut-être passe-t-il l'ensemble des éléments du Array en une seule passe et devient un String "rassemblé", un peu comme un Join de compatibilité ?

    Partant de là, pourquoi l'utilisation, côté VBA, d'un Split de remise "en bon ordre" n'est pas une solution que tu envisages Patrick ?
    L'avantage, c'est que ça se fait en une seule passe d'instruction, je n'ai trouvé aucune autre astuce si concise, les autres vont chercher chaque Keys du JScriptTypeInfo pour les placer dans un Dictionnary (avec un item nul), ce qui revient à faire une boucle sur tout tes éléments, qui est moins rapide qu'un Split

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    oui Joe j'ai aussi fait quelque recherche et il semblerait qu'il n'y ai pas de solution

    ce qui me gène dans l'histoire c'est que je passe par JS car la même chose en VBA prend 2.5 fois plus de temps avec la même méthode

    et que de passer par un tableau est forcement plus rapide qu'avec un string alimenté dans la boucle

    et je me retrouve a spliter un tableau
    ou a devoir reboucler sur les item de l'Object

    et sur un tableau de 100 000 items ,rien que le split me rajoute minimum!!!! 0.5 seconde selon le cache des fois bien plus

    conclusion cette voie est perdue ,bien qu'intéressante dans le sens ou je m'exerce a métriser le JS dans un scriptcontrol
    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

  12. #12
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je note quand même qu'il y a de la racine carrée dans ton JS .... mais alors, je croyais que c'était vraiment "n'importe quoi"

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    Mon but est d'explorer les méthodes avec JS ou VBA et de voir comment ca se comporte en terme de mémoire et donc de temps d'exécution
    car j'ai remarqué l'énorme différence de temps de calcule entre JS et vba pour la discutions (grand débat sur les nombres premiers )
    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

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour Patrick,

    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
    24
    25
    26
    27
    28
    29
    Sub test2()   
     Dim T
        Set resultat = NBP2(100000, T)
        a = FunCount(resultat)
        For I = 0 To a
            Debug.Print NBP3(resultat, I)
       Next
    End Sub
    '=======================================================================
    'teste de restitution en tableau
    Function NBP2(max, T) As Object
        Set sc = CreateObject("ScriptControl")
        code = code & "function NBP(max){var keys= new Array(); var a = 0;for(i = 2; i <= max; i++) {var j = 1;var racine = Math.floor(Math.sqrt(i));"
        code = code & "do {j++;} while(j <= racine && i%j != 0);if(j > racine) {keys.push(a);keys[a]=i;a=a+1; }};return keys}"
        With sc: .Language = "JScript": .AddCode code: End With
        T = Timer: Set NBP2 = sc.Run("NBP", max): T = Timer - T
    End Function
     Function NBP3(T, I)
      Set sc = CreateObject("ScriptControl")
      code = code & "function NBP(T,i){return T[i]}"
       With sc: .Language = "JScript": .AddCode code: End With
        NBP3 = sc.Run("NBP", T, I)
     End Function
       Function FunCount(T)
        Set sc = CreateObject("ScriptControl")
         code = code & "function NBPCount(T){return T.length}"
       With sc: .Language = "JScript": .AddCode code: End With
        FunCount = sc.Run("NBPCount", T)
       End Function
    javascript a été conçu dans les années 70 par sun le vendeur de machine à laver!

    Le but était de pouvoir implanter un um même programme des des machines disposant de différents microprocesseur!

    Javascript s'adapte à ce que le programme appelant attend. Donc un variant un string, un objet le tableau, mais ça n'en fait pas un objet Vba pour autant!
    Images attachées Images attachées  
    Dernière modification par Invité ; 09/12/2016 à 17h17.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour Patrick,
    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
    Public Sub testScriptControl()  
      Dim  sc As Object
    Set sc = CreateObject("ScriptControl")
            With sc
            .Language = "JScript"
            .AddCode _
                 "function NBP(max){var keys= new Array(); var a = 0;for(i = 2; i <= max; i++) {var j = 1;var racine = Math.floor(Math.sqrt(i));" & _
                 "do {j++;} while(j <= racine && i%j != 0);if(j > racine) {keys.push(a);keys[a]=i;a=a+1; }};return GetT(keys)}" & _
                  "function GetT(ja) {" & _
                   "var dict = new ActiveXObject('Scripting.Dictionary');" & _
                    "for (var i=0;i < ja.length; i++ )dict.add(i,ja[i]);" & _
                    "return dict.items();}"
     
           resultat = .Run("NBP", 1000)
           End With
        For i = LBound(resultat) To UBound(resultat)
            Debug.Print resultat(i) & ":";
        Next i
        Range("A1").Resize(1, UBound(resultat)) = resultat
        End Sub
    Dernière modification par Invité ; 13/12/2016 à 09h34.

Discussions similaires

  1. [XL-2003] Variable String au lieu d'un nom de Feuille
    Par MatMout dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2010, 11h04
  2. [TPW][Débutant] Retour chariot dans variable string
    Par dimi2 dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 03/04/2008, 20h22
  3. Probleme avec string et variable.
    Par pierre987321 dans le forum Delphi
    Réponses: 3
    Dernier message: 26/04/2007, 13h22
  4. Réponses: 6
    Dernier message: 14/02/2004, 14h01

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