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 :

Join sur Array multidimentionnelle


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut Join sur Array multidimentionnelle
    Bonsoir,
    Je n'arrive pas à faire un truc tout bête.
    J'utilise régulièrement la fonction Join pour transformer une array en chaine texte avec un séparateur.
    Je voudrais faire la même chose avec une variable array multidimentionnelle.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim vtest(2, 2) As Variant
     
    vtest(0, 0) = "NomChamp1"
    vtest(0, 1) = "Valeur1"
    vtest(1, 0) = "NomChamp2"
    vtest(1, 1) = "Valeur2"
     
    Debug.Print Join(Application.Index(vtest, 2, 2), ",")
    Je n'arrive pas à faire fonctionner ça... Pouvez-vous m'aider?
    Merci d'avance !

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonsoir,

    essai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub essai()
      Tbl = [A1:C3]
      For i = 1 To UBound(Tbl, 2)
        temp = temp & Join(Application.Index(Tbl, i), ",") & ","
      Next i
      MsgBox temp
    End Sub
    Boisontier

  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
    c'etait pas loin
    par ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test1()
    'par les lignes
        Dim vtest(2, 2) As Variant
        vtest(0, 0) = "NomChamp1"
        vtest(0, 1) = "Valeur1"
        vtest(1, 0) = "NomChamp2"
        vtest(1, 1) = "Valeur2"
        For i = 1 To UBound(vtest)
            temp = temp & Join(WorksheetFunction.Index(vtest, i, 0), " ,")
        Next
        Debug.Print "ligne par ligne : " & temp
    End Sub
    ou par colonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test2()
    'par les colonnes
        Dim vtest(2, 2) As Variant
        vtest(0, 0) = "NomChamp1"
        vtest(0, 1) = "Valeur1"
        vtest(1, 0) = "NomChamp2"
        vtest(1, 1) = "Valeur2"
        For i = 1 To UBound(vtest, 2)
            temp = temp & Join(Application.Transpose(WorksheetFunction.Index(vtest, 0, i)), " ,")
        Next
        Debug.Print "colonne par colonne : " & temp
    End Sub
    resultat
    ligne par ligne : NomChamp1 ,Valeur1 ,NomChamp2 ,Valeur2 ,
    colonne par colonne : NomChamp1 ,NomChamp2 ,Valeur1 ,Valeur2 ,
    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
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Aucune réponse éclairée n'est à ce stade possible. Elle ne le sera que lorsque le demandeur aura bien voulu exposer de manière indubitable les aboutissants précis !

  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
    bonsoir jacques
    Citation Envoyé par jojo86 Voir le message
    Bonsoir,
    Je n'arrive pas à faire un truc tout bête.
    J'utilise régulièrement la fonction Join pour transformer une array en chaine texte avec un séparateur.
    Je voudrais faire la même chose avec une variable array multidimentionnelle.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim vtest(2, 2) As Variant
     
    vtest(0, 0) = "NomChamp1"
    vtest(0, 1) = "Valeur1"
    vtest(1, 0) = "NomChamp2"
    vtest(1, 1) = "Valeur2"
     
    Debug.Print Join(Application.Index(vtest, 2, 2), ",")
    Je n'arrive pas à faire fonctionner ça... Pouvez-vous m'aider?
    Merci d'avance !
    pour moi sa demande est claire

    sauf que quand je vois cette ligne dans sa tentative
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Join(Application.Index(vtest, 2, 2), ",")
    je serait amené a penser qui'il essaie de joindre toute les ligne colonnes d'un coup ce qui est impossible bien entendu car la fonction "join" ne fonctionne que sur une variable tableau a une !! dimention!!! ( un array)

    je lui est donc montré comment joindre son tableau 2 dim de 2 facons differentes

    le principe etant de créer des tableaux 1 dim avec les colonnes séparément ou les lignes par la fonction index et (+transpose) pour les colonnes car une seule colonne d'un tableau a 2 dim est un tableau a 2 dim donc transpose est de rigueur

    je te l'accorde 2 boucles imbriquées sur ligne colonnes alimentant une variable string pourrait tres bien faire l'affaire

    bref il a les moteurs a lui de savoir dans quel sens est son besoins
    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
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    @patrick :
    On en a parlé récemment, la fonction index est très lente par rapport à une boucle sur variable tableau...
    Donc, dans ce cas, je préconise une fonction perso qui renvoie un string après une double boucle...........

  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
    bonsoir Franck

    j'ai fait quelques tests a ce sujet il y aurais pas mal a en dire

    en fait je me suis rendu compte que tout dependait des valeurs traitées et de la longueur de la chaine finaleselon les cas c'est pas la double boucle qui gagne

    perso je verrait un avantage au doubles boucle si j'ai un traitement a faire dans les sub-chaines
    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 confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Salut Patrick
    Cherche ce qu'il a de gênant dans cette expression :
    pour moi sa demande est claire
    Si une demande est claire :
    1) elle l'est (et elle ne l'est pas "pour Pierre", "pour Paul", .....)
    2) elle ne donne déjà pas lieu à deux propositions (selon que ...)

    Je continue personnellement à me poser des questions quant à ce qu'il entend très exactement par ce "Join" d'un tableau à plusieurs dimensions.

    PS : il est d'ailleurs assez probable que l'on y "verrait plus clair" s'il nous disait ce qu'il entend faire du résultat de ce "Join"-là, quel qu'il soit.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    bonsoir
    c'etait pas loin
    par ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test1()
    'par les lignes
        Dim vtest(2, 2) As Variant
        vtest(0, 0) = "NomChamp1"
        vtest(0, 1) = "Valeur1"
        vtest(1, 0) = "NomChamp2"
        vtest(1, 1) = "Valeur2"
        For i = 1 To UBound(vtest)
            temp = temp & Join(WorksheetFunction.Index(vtest, i, 0), " ,")
        Next
        Debug.Print "ligne par ligne : " & temp
    End Sub
    ou par colonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test2()
    'par les colonnes
        Dim vtest(2, 2) As Variant
        vtest(0, 0) = "NomChamp1"
        vtest(0, 1) = "Valeur1"
        vtest(1, 0) = "NomChamp2"
        vtest(1, 1) = "Valeur2"
        For i = 1 To UBound(vtest, 2)
            temp = temp & Join(Application.Transpose(WorksheetFunction.Index(vtest, 0, i)), " ,")
        Next
        Debug.Print "colonne par colonne : " & temp
    End Sub
    resultat
    Salut Patrick,
    Tu avais bien compris ma demande. C'est le sub test2 qui m’intéresse.
    Maintenant, se pose la question des performances... En attendant ta réponse, j'ai mis en place une boucle.
    Ma variable ne dépassera pas les 10 à 15 lignes avec des données assez courtes (moins de 25 caractères).

    Je me demande donc ce que je dois exploiter... Qu'en penses-tu? unparia semblait mitigié sur l'utilisation du "Index".

    Merci d'avance,

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    unparia semblait mitigié sur l'utilisation du "Index"
    Pas du tout par cela, mais par l'utilisation du résultat obtenu (la chaîne de caractères unique résultante elle-même) !
    En d'autres termes : que veux-tu exactement faire ensuite de ceci (résultat du test 2) :
    NomChamp1 ,NomChamp2 ,Valeur1 ,Valeur2 ,
    à quoi veux-tu l'utiliser, très précisément. Pour obtenir quoi à partir de cette chaîne ?

  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
    bonjour jojo
    franchement 10 /15 lignes je me poserais meme pas la question de performence

    on peut parler de choix pour la performence a partir que quelques millier de lignes sinon c'est meme pas la peine de se caser la tete

    c'est mon opignion
    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
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Unparia n'est pas "mitigé" sur l'emploi de Index. Unparia sait...
    (Salut Jacques, mes excuses pour avoir parlé en ton nom)

    C'est moi qui suit, non pas mitigé, mais contre l'utilisation d'Index selon les cas.
    Avec 16 lignes tu n'auras pas de souci. Avec 16 000 ce ne sera pas la même sauce.

    Si tu veux comparer, compare :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Option Explicit
     
    Sub Test()
    Dim Tbl(1000, 4), res As String, t#, s$
     
        RempliTab Tbl, "Un string"
        s = ";"
     
        'pijaku : double boucle + Join
        t = Timer
        res = Join2D3(Tbl, s, 1)
        Debug.Print "Double boucle + Join ByRow : " & Len(res) & "      " & Timer - t
        res = vbNullString
     
        'PatrickToulon
        t = Timer
        res = Join2D4(Tbl, s, True)
        Debug.Print "Index (Patrick)  ByRow : " & Len(res) & "      " & Timer - t
        res = vbNullString
     
        'pijaku : double boucle + Join
        t = Timer
        res = Join2D3(Tbl, s, 2)
        Debug.Print "Double boucle + Join ByColumn : " & Len(res) & "      " & Timer - t
        res = vbNullString
     
        'PatrickToulon
        t = Timer
        res = Join2D4(Tbl, s, False)
        Debug.Print "Index (Patrick)  ByColumn : " & Len(res) & "      " & Timer - t
    End Sub
     
    Private Sub RempliTab(Tb, maVar As Variant)
    Dim i&, j&
        For i = LBound(Tb, 1) To UBound(Tb, 1)
            For j = LBound(Tb, 2) To UBound(Tb, 2)
                Tb(i, j) = maVar
            Next
        Next
    End Sub
     
    Private Function Join2D3(Tbl, Sep As String, Optional Order As Integer) As String
    'Tbl : la variable tableau 2 dimensions à joindre
    'Sep : le séparateur à utiliser
    'Order : le sens
        'ignoré : Order = 1 ==> par ligne
        'par ligne : Order = 1
        'par colonne : Order = 2
    Dim i&, j&, StrTemp()
        If Order = 1 Or Order = 0 Then
            ReDim StrTemp(UBound(Tbl, 1))
            For i = LBound(Tbl, 1) To UBound(Tbl, 1)
                For j = LBound(Tbl, 2) To UBound(Tbl, 2)
                    StrTemp(i) = StrTemp(i) & Tbl(i, j) & Sep
                Next
            Next
        ElseIf Order = 2 Then
            ReDim StrTemp(UBound(Tbl, 2))
            For i = LBound(Tbl, 2) To UBound(Tbl, 2)
                For j = LBound(Tbl, 1) To UBound(Tbl, 1)
                    StrTemp(i) = StrTemp(i) & Tbl(j, i) & Sep
                Next
            Next
        Else
            Exit Function
        End If
            Join2D3 = Join(StrTemp, vbNullString)
    End Function
     
     
    Private Function Join2D4(vtest, Sep$, ByRow As Boolean) As String
    'PatrickToulon
    Dim temp$, i&
        If ByRow Then
            For i = LBound(vtest) To UBound(vtest)
                temp = temp & Join(WorksheetFunction.Index(vtest, i + 1, 0), Sep)
            Next
        Else
            For i = LBound(vtest, 2)  To UBound(vtest, 2)
                temp = temp & Join(Application.Transpose(WorksheetFunction.Index(vtest, 0, i + 1)), Sep)
            Next
        End If
        Join2D4 = temp
    End Function
    Tu y verras, notamment, un oubli dans la fonction de Patrick (salutations au passage).
    Tu pourras également constater la lenteur induite par Index sur un grand nombre de lignes et presque pas de lenteur sur un plus petit nombre. (pas très français cette phrase )

    N'empêche que tu n'as pas répondu à l'essentielle question d'Unparia concernant les aboutissants de cette fonction.....

  13. #13
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Franck
    Tout-à-fait (tu as bien compris ma question).
    Et les tenants également car si (en plus) les données de ce tableau dynamique sont le contenu d'une plage continue --->> nul besoin de la moindre boucle pour parvenir à cette "concaténation" (je ne veux pas utiliser ici le terme "Joining", non alors approprié)
    Donc : 2 questions :
    1) la question essentielle : pour en faire quoi exactement ?
    2) la question subsidiaire : comment ce tableau dynamique a-t-il été alimenté, très exactement ?

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par unparia Voir le message
    Et les tenants également car si (en plus) les données de ce tableau dynamique sont le contenu d'une plage continue --->> nul besoin de la moindre boucle pour parvenir à cette "concaténation" (je ne veux pas utiliser ici le terme "Joining", non alors approprié)
    Bonjour,

    Dans l'attente de réponse à tes questions, je ne peux que te

  15. #15
    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
    perso ca me fait bien marrer votre theorie sur la vitesse d'execution des deux methodes

    je viens de refaire le test 20 fois pour etre sur de ce que je dis

    alors voila les deux methodes index et double boucle avec creation du tableau et transformation en chaine
    pour 3000 items

    il se trouve que quand je lance les deux sub l'une derriere l'autre dans l'ordre que vous voulez etonnament les deux font le meme temps

    1. apres je lance la premiere celle que vous voulez
    2. j'obtiens un temps
    3. je rehinitialise vba je vide le debug
    4. *et lance la 2d methode
    5. devinez qui gagne


    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
    30
    31
    32
    Sub test2_by_colonnes_in_2_boucle()
        t = Timer
        'par les colonnes
        Dim vtest(3000, 2) As Variant
        'je vais remplir  le tableau(vtest)de 3000 lignes
        For i = 0 To 3000
            vtest(i, 0) = "nomChamp" & i + 1: vtest(i, 1) = "valeur" & i+1
        Next
        For c = 0 To UBound(vtest, 2) - 1
            For i = 0 To UBound(vtest) - 1
                temp = temp & vtest(i, c) & " ,"
            Next
        Next
        Mid(temp, Len(temp), 1) = " "    'on enleve la derniere virgule a la fin
        MsgBox "   " & "en " & Timer - t & "  " & "secondes"
        Debug.Print "colonne par colonne : " & Trim(temp)
    End Sub
     
    Sub test2()
        t = Timer
        'par les colonnes
        Dim vtest(3000, 2) As Variant
        'je vais remplir  le tableau(vtest)de 3000 lignes
        For i = 0 To 3000
            vtest(i, 0) = "nomChamp" & i + 1: vtest(i, 1) = "valeur" & i+1
        Next
        For i = 1 To UBound(vtest, 2)
            temp = temp & Join(Application.Transpose(WorksheetFunction.Index(vtest, 0, i)), " ,")
        Next
        MsgBox "en " & Timer - t & "  " & "secondes"
        Debug.Print "colonne par colonne : " & temp
    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

  16. #16
    Expert éminent
    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
    Par défaut
    Bonjour !

    Vite fait en passant :

    Citation Envoyé par pijaku Voir le message
    la fonction index est très lente par rapport à une boucle sur variable tableau...
    Oui, mais seulement quand elle est mal utilisée et donc mal codée ‼
    Ne jamais prendre l'intégralité d'une plage de cellules pour en extraire une ligne ou une colonne …

    Quand les données sont déjà dans une variable tableau,
    s'il y a du volume à traiter une boucle limite effectivement le temps d'exécution.
    Mais si la source de la variable tableau est une plage de cellules,
    INDEX bien utilisée en lecture directe limitée au maximum à une paire de colonnes ou de lignes n'est pas si lente !

    Une variante pour jojo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Demo1()
        Dim V(), W
            V = Array(Array("NomChamp1", "Valeur1"), Array("NomChamp2", "Valeur2"))        
        For Each W in V
            Debug.Print Join(W, ",")
        Next
    End Sub
    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  17. #17
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour à tous

    Et si je m'amusais maintenant à mettre en oeuvre la méthode de tremplin dont j'ai parlé (j'ai ouvert une discussion à ce sujet) il y a ... un mois ? deux mois ? ... je ne sais plus.
    Allez, c'est l'occasion de la tenter et de comparer --->>
    J'essaye et reviens, ne serait-ce que pour dire quels ont été ses résultats.
    A plus

  18. #18
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bon ... la voilà testée, cette méthode tremplin --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub CommandButton2_Click()
     Dim deb As Double, p As Range, i As Long
     deb = Timer
     Dim vtest(3000, 2) As Variant
     For i = 0 To 3000
        vtest(i, 0) = "nomChamp" & i + 1: vtest(i, 1) = "valeur" & i + 1
     Next
     Set p = Range("A1:B3000")
     Application.ScreenUpdating = False
     p = vtest
     MsgBox Timer - deb & " secondes  ---> " & Join(Application.Transpose(Range("A1:A3000")), ",") & "," & Join(Application.Transpose(Range("B1:B3000")), ",")
     p.ClearContents
     Application.ScreenUpdating = True
    End Sub
    Résultats (loin d'être mauvais ) entre 0,015 secondes et 0.0299 secondes (selon l'état de la machine lors du lancement). A tester une 20aine de fois...


    J'en profite pour dire toute l'importance qu'avait la seconde de mes questions (plus haut), à laquelle jojo n'a pas daigné répondre. On voit là une partie de la raison de cette seconde question, hein ...

    Et tout cela n'enlève absolument rien à ma première question (essentielle), également laissée sans réponse de jojo : A quoi va être utilisée "utilement" une telle chaîne de caractères ?

  19. #19
    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
    @jacques

    Nom : Capture.JPG
Affichages : 1801
Taille : 128,0 Ko

    soit plus du double de temps qu'avec index

    et encore!!!!c'est une escroquerie ton truc car ton calcul timer est fait avant que les chaines soit etablies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Timer - deb & " secondes  ---> " & Join(Application.Transpose(Range("A1:A3000")), ",") & "," & Join(Application.Transpose(Range("B1:B3000")), ",")

    la tu fait fort hein !!!

    voila ton test réalisé honetement
    c'est a dire tout ce qui est temporaire est vidé ou supprimé avant de calculer le temps
    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
    Private Sub CommandButton2_Click()
        Dim deb As Double, p As Range, i As Long
        deb = Timer
        Dim vtest(3000, 2) As Variant
        For i = 0 To 3000
            vtest(i, 0) = "nomChamp" & i + 1: vtest(i, 1) = "valeur" & i + 1
        Next
        Set p = Range("A1:B3000")
        Application.ScreenUpdating = False
        p = vtest
        temp = Join(Application.Transpose(Range("A1:A3000")), ",") & "," & Join(Application.Transpose(Range("B1:B3000")), ",")
        p.ClearContents
        MsgBox Timer - deb & " secondes  ---> " & temp
        Application.ScreenUpdating = True
    End Sub
    Nom : Capture.JPG
Affichages : 1784
Taille : 113,6 Ko

    tu te rends bien compte que deja créer un tableau puis le transférer sur sheets et travailler sur les colonnes du sheets(meme sans selection) est beaucoup plus long que travailler directement avec la variable tableau
    tu me fait peur des fois
    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

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Soyons clair.
    3 méthodes sont décrites ici.
    Pour la demande actuelle, 16 lignes sur 2 colonnes, peu importe le choix, c'est de l'instantané.

    Par contre, pour une autre utilisation, Patrick, les tests doivent être un peu plus poussé.
    Ta méthode est très rapide lorsqu'il n'y a pas beaucoup de colonnes.
    Par contre, elle devient (exponentiellement) de plus en plus lente à mesure que l'on ajoute des colonnes...

    Celles (les méthodes) d'unparia et la mienne sont plus performantes sur de grandes plages de données.
    Et pour cause!

    Alors que dire si l'utilisateur veut une concaténation ByRow d'une variable tableau de taille (1 To 3000, 1 to 50) ?
    Dans ce cas, il vaudra mieux double-boucler...

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/09/2006, 15h55
  2. [PHP/SQL] foreach sur array multiples
    Par Flushovsky dans le forum Langage
    Réponses: 1
    Dernier message: 18/09/2006, 10h49
  3. LEFT JOIN sur sous requete
    Par passie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/06/2006, 12h51
  4. INNER JOIN sur une requete UPDATE
    Par Immobilis dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/03/2006, 14h05
  5. pb sur ARRAY
    Par heleneh dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/09/2005, 09h58

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