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 :

Fusion de deux tableau VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut Fusion de deux tableau VBA
    Chères amies chers amis du forum
    Je souhaites fusionner deux tableau VBA de tailles différentes par une méthode ou algo plus optimal que boucle plus redim preserve. L objectif final est d obtenir un array qui serviras de paramétre a un autofilter.
    Auriez vous une idée svp?
    Merci

  2. #2
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    bonsoir,

    Un tableau est un regroupement d'éléments.
    Le principe du tableau, c'est accéder à un élément du jeu d'éléments par un indice.
    Fusionner 2 tableaux implique forcément une boucle de façon transparente ou non par la création d'un nouvel tableau comportant suffisamment d'éléments pour y recopier les 2 tableaux.
    A moins que tu sois prêt à rédiger le nombre de lignes de code qu'il faut à la place d'une boucle!
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  3. #3
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci

    J'avais pas grand espoir mais comme je ne connais pas toutes les fonction de VBA, peut etre qu'il existait une qui faisait cela.

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Un petit exemple fusion de 2 tableaux à 1 dimension sans boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
      Dim a As Variant
      Dim b As Variant
      Dim c As String
      Dim d As String
      Dim e() As String
      a = Array("l", "m", "n")
      b = Array("o", "p", "q")
      c = Join(a, ",")
      d = Join(b, ",")
      e = Split(c & "," & d, ",")
    End Sub
    Je ne suis pas certain que ça puisse servir à ton cas mais ça peut être intéressant pour certains...
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  5. #5
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour alain
    je ne suis pas certain que ça puisse servir à ton cas mais ça peut être intéressant pour certains...
    oui, pour moi car en reprenant 2 tableaux qui contiennent une plage, j'ai traduit ton code de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim a, b, x As Integer
    Dim c As String
    Dim d As String
    Dim e() As String
     
    a = Range("A2:A8")
    b = Range("B2:B8")
    c = Join(WorksheetFunction.Transpose(a), ",")
    d = Join(WorksheetFunction.Transpose(b), ",")
    e = Split(c & "," & d, ",")
    For x = 0 To UBound(e)
      MsgBox e(x)
    Next
    Bonne soirée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonsoir,
    Je pensais à ces fonctions (Join et Split) qui utilisent forcément en interne des boucles.
    Je me cites:
    Fusionner 2 tableaux implique forcément une boucle de façon transparente ou non par la création d'un nouvel tableau ...
    Il m'avait semblé que Nono Sto ne voulait pas à tort de boucles et de Redim Preserve pour des raisons de performances. Cette méfiance à l'égard de boucles ne me semblait pas justifiée.

    Ces fonctions (Join et Split) sont certainement les dernières auxquelles j'aurais recours dans une qu^te de performances pour deux tableaux géants à fusionner.
    Je n'ai pas vérifié, si quelqu'un pouvait faire les essais sur de grandes données, il est évident que la solution actuelle couplée avec la fonction WorkSheet Transpose est encore la mois envisageable dans un souci de performances.
    Alors qu'une boucle bien pensée serait plus optimale et rapide d’exécution.
    Par exemple:
    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
     
        Tb1_Bound = UBound(Table1)
        Sum_Bound = Tb1_Bound + UBound(Table2)
        ReDim Table_Fuse(Sum_Bound)
     
        While AllBound
     
            If SumBound > ref1 Then
                Table_Fuse(AllBound) = Table2(Sum_Bound - Tb1_Bound)
            Else
                Table_Fuse(AllBound) = Table1(Sum_Bound)
            End If
     
            AllBound = AllBound - 1
     
        Wend
    Une autre solution avec une Api déclarée en tête de module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Declare Sub Fusion Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
                            ByRef Final As Any, _
                            ByRef Cible As Any, _
                            ByVal Nb_elem As Long)
     
     
        'Dans une procédure test, Les 2 tableaux doivent être du même type de données.
        ReDim tb_final(UBound(tb1) + UBound(tb2))
        Fusion tb_final(1), tb1, (UBound(tb1) * Len(tb1(1)))
        Fusion tb_final(UBound(tb1) + 1), tb2, (UBound(tb2) * Len(tb2(1)))
    Les exemples supposent qu'on est en base 1 avec les tableaux.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  7. #7
    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
    Bonsoir.
    Citation Envoyé par NVCfrm Voir le message
    Les exemples supposent qu'on est en base 1 avec les tableaux.
    Même pour tb_final(0) en ligne n°9 ? Uniquement pour les tableaux à fusionner alors …

    Sinon juste pour info, j'ai récemment (re)constaté sur les versions 2003 & 2007

    la limitation de la fonction Application.Transpose de 255 caractères par élément …
    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)

  8. #8
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonsoir Marc,
    merci. erreur corrigée!

    Edit:
    Une autre erreur corrigée de l'utilisation de Len avec un tableau sans précision d'indice.
    Je pensais dans un autre langage
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  9. #9
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut fusion de deux tableaux
    Bonjour,

    Une solution sans doute ni plus rapide ni plus élégante qui me vient a l'esprit.

    - copier les deux tableaux l'un en dessous de l'autre sur une feuille temporaire sans boucle for.
    -copier le contenu de la feuille dans un tableau final
    -effacer ou supprimer la feuille temporaire.

    Que pensent les connaisseurs de cette solution un peu tordue dont je n'ai pas vérifié la validité.

    Cordialement,

  10. #10
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    bonjour nibledispo,
    Une solution sans doute ni plus rapide ni plus élégante qui me vient a l'esprit.
    Je crois pouvoir t'affirmer que c'est la plus élégante et la plus performante.
    La fonctionnalité de copier/coller est probablement la plus rapide en échange de données.
    Je penses (une bêtise peut-être) que des registres spéciaux sont dédiées aux instructions de copie pour accélérer leur exécution.
    Ton idée est davantage meilleure encore, surtout si l'on doit construire les données en mémoire pour les transférer au final sur une feuille. Autant y aller directement.
    Comme quoi, il ne faut jamais oublier qu'Excel à travers le VBA dispose de moyens très puissants et simple à tel point, qu'on se complique généralement la tâche en pensant ailleurs.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  11. #11
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut fusion de deux tableaux
    Bonjour NVCfrm,

    Je suis bien heureux d'avoir pour une fois apporté une solution satisfaisante qui est pour moi un encouragement à persévérer dans l'étude de VBA.

    Edit: suite à une réponse de Mercatog sur une autre discussion (Piixx-2) il convient d'apporter une limitation liée à la mémoire de l'ordinateur avec éventuelle utilisation de "transpose" ultérieure.

    Cordialement,

Discussions similaires

  1. fusion de deux tableaux en un autre tableau
    Par Naswd_94 dans le forum Débuter
    Réponses: 5
    Dernier message: 09/12/2014, 09h20
  2. Réponses: 2
    Dernier message: 27/05/2011, 10h30
  3. Afficher un tableau sur la fusion des deux colonnes de l'article
    Par slaima15 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 18
    Dernier message: 13/10/2010, 02h35
  4. Fusion de deux tableaux triés en un tableau trié
    Par adri010 dans le forum Débuter
    Réponses: 8
    Dernier message: 10/06/2010, 19h50
  5. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53

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