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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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,

  6. #6
    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 ?

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

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

  9. #9
    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 ?

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

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

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

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

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