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 :

Code regroupement excel VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut Code regroupement excel VBA
    Bonjour,

    J'ai du mal à adapter ce code fait par Tauthème pour créer une clé avec deux colonnes ! Le but étant juste de regrouper les éléments ayant les mêmes occurrences pour chaque cellule des deux colonnes et les séparer à chaque fois de deux lignes ! La première colonne contient des string et l'autre des valeurs concaténées avec des Astérix à l'intérieur de la chaîne !

    J'ai un problème lorsque je lance le code, on me dit incompatibilité de type, je pense que je l'ai mal modifié vu qu'à la base, il était utilisé pour créer une clé sur trois colonnes !

    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
    Private OS As Worksheet 'déclare la variable OS (Onglet Source)
    Private OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Private NL As Long 'déclare la variable NL (Nombre de Lignes)
    Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)
     
    Sub Macro1()
    Dim D As Object 'déclare la variable ND (Dictionnaire)
    Dim CC As String 'déclare la variable CC (Concaténation de Colonnes)
    Dim TL() As Variant 'déclare la variable TL (Tableai de Lignes)
    Dim I As Long 'déclare la variable I (Incrément de lignes)
    Dim J As Integer 'déclare la variable J (incrément de lignes)
    Dim K As Long 'déclare la variable K (incrément de lignes)
    Dim L As Integer 'déclare la variable L (incrément de colonnes)
    Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
     
    Set OS = ThisWorkbook.Sheets("Feuil2") 'définit l'onglet source OS (à adapter)
    Set OD = ThisWorkbook.Sheets("Feuil3") 'définit l'onglet destination OD (à adapter)
    TC = OS.Range("A1").CurrentRegion 'définit le tableau de cellules TC (à adapter)
    NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellulles TC
    NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellulles TC
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionaire D
    For I = 2 To NL 'boucle sur toutes les ligne du tableau de cellues TC (en partant de la seconde)
        'définit la concaténation CC
        'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
        CC = CStr(TC(I, 3)) & CStr(TC(I, 6)) '& CStr(TC(I, 3)) c'est ici que je modifie le code
        D(CC) = D(CC) + 1 'alimente le dictionnaire avec le concaténation CC
    Next I 'prichaine ligne de la boucle
    TE = D.keys 'récupère tableau TE (Tableau des Éléments) les éléments du dictionnaire D sabs doiblon
    TOC = D.items 'récupère tableau TOC (Tableau des OCcurrences) le nombre d'occurrence de chaque élément de TE
    For I = LBound(TE) To UBound(TE) 'boucle sur tous les éléments de TE
        If TOC(I) > 1 Then 'condition 1 : si l'élément a plusieurs occurrences
            K = 1 'initialise la variable K
            For J = 2 To NL 'boucle 1 sur toutes les lignes J du tableau de cellules TC (en partant de la seconde)
                'condition 2 : si la concaténation des colonne 1 deux et trois est égale à TE(I)
                'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
                'If CStr(TC(J, 1)) & CStr(TC(J, 2)) & CStr(TC(J, 3)) = TE(I) Then c'est normalement cette ligne de code qui était utilisée
                If CStr(TC(J, 3)) & CStr(TC(J, 6)) = TE(I) Then 'ici ma modification pour avoir que deux colonnes
                    'redimensionne le tableau de lignes TL (autant de ligne que TC a de colonnes,K colonnes)
                    ReDim Preserve TL(1 To NC, 1 To K)
                    For L = 1 To NC 'boucle 2 : sur toutes les colonnes de TC
                        TL(L, K) = TC(J, L) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition)
                    Next L 'prochaine colonne de la boujcle 2
                    K = K + 1 'incrémente K
                End If 'fin de la condition 2
            Next J 'prochaien ligne de la boucle 1
            If K > 1 Then 'condition 3 : si K est supérieur à 1 (au moins une occurrence trouvée)
                'définit la cellue de destination DEST
                Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(3, 0))
                'revoie dans DEST redinensionnée le tableau TL transposé
                DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'erreur se trouve su cette ligne (Incompatibilité de type)
            End If 'fin de la condition 3
            Erase TL 'vide le tableau TL
        End If 'fin de la condition 1
    Next I 'prochain élément du tableau TE
    End Sub
    Merci pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Si l'erreur se produit sur une ligne précise (surlignée en jaune, quelle est-elle ? Sinon, exécute la macro ligne à ligne, en mémorisant bien la dernière ligne exécutée. Lorsque l'erreur se produit, tu es capable de dire la ligne fautive.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Bonjour,

    j'avais précisé dans le code de ma publication ! Peut être n'avez vous pas pu lire !

    L'erreur se trouve au niveau de la ligne 53 (Incompatibilité de type) !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'erreur se trouve su cette ligne (Incompatibilité de type)
    Merci pour votre aide

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    C'est le ".value" qui est en trop. Mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEST.Resize(UBound(TL, 2), UBound(TL, 1)) = Application.Transpose(TL)
    Et la prochaine fois, tu dis : "l'erreur se produit sur la ligne 53".

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

    Citation Envoyé par Daniel.C Voir le message
    C'est le ".value" qui est en trop
    S'il est d'un côté, c'est bien de l'ajouter aussi de l'autre …

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    S'il est d'un côté, c'est bien de l'ajouter aussi de l'autre …
    Mais, s'il n'est pas de l'autre, il faut bien le retrancher de celui-ci...

    Euh tu ajouterais la propriété Value à la fonction Transpose ? Osé

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

    Je préfère préciser la propriété au lieu de laisser Excel choisir car parfois, plantage quand même !

    Exemple : [E1:F3].Value = Application.Transpose([A1:C2].Value)

    Là effectivement TL étant une variable tableau, c'est à proscrire, autant pour moi !
    Mais dans la ligne source du post #3 Value ne devrait pas être en cause car ce code fonctionne de mon côté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Demo()
                                                  TL = [A1:C2].Value
        [E1].Resize(UBound(TL, 2), UBound(TL)).Value = Application.Transpose(TL)
    End Sub

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Alors, c'est que,, comme on travaille en base 0 par défaut, il aurait fallu ajouter 1 à Ubound :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim tabl(2)
    tabl(0) = 1
    tabl(1) = 2
    tabl(2) = 3
    Range("A1").Resize(UBound(tabl) + 1) = Application.Transpose(tabl)

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Bonjour,

    Après avoir enlevé le "value" j'ai toujours la même erreur à la même ligne, je vous mets un fichier test pour que vous le constatiez par vous même, les lignes doivent être regroupées si les données de la colonne "GROUPE" et "SOMMEPVC..." (assemble les valeurs qui ont le groupe identique et la sommePVC identique par bloc, ajoute deux lignes avant de passer à un autre bloc) ! Le code marche bien quand je l'utilise sur le fichier de départ en utilisant les trois clés de concaténation !

    Merci d'avance pour votre aide

    Nom : Sans titre.jpg
Affichages : 286
Taille : 195,9 Ko

    Un exemple de disposition !

    Nom : Sans titre.jpg
Affichages : 286
Taille : 195,9 Ko

  10. #10
    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
    Citation Envoyé par Daniel.C Voir le message
    Alors, c'est que,, comme on travaille en base 0 par défaut, il aurait fallu ajouter 1 à Ubound
    Non car même par défaut en base 0, la variable tableau créée directement à partir d'un Range est toujours en base 1
    car une colonne ou une ligne ne peut être inférieure à 1 ! Facile à vérifier dans la fenêtre des Variables locales

    Comme la base par défaut est de zéro, il faut juste préciser la valeur basse à 1 de chaque dimension ‼
    Cf aide VBA et tutoriel déjà indiqué dans discussion précédente ! Ou encore forcer la base par défaut à 1 …

    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Après avoir enlevé le "value" j'ai toujours la même erreur à la même ligne
    Désolé, ce fut une ânerie de ma part.

    Sinon, comment veux-tu qu'on teste ton code ? il manque - au moins - je n'ai pas été plus loin Feuil2 et Feuil3.

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





    Oui, mais même pas besoin de tester son code, j'ai édité mon précédent message … (et ce n'était pas tant une ânerie !)

  13. #13
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    @Marc : Oui, d'ailleurs :

    la variable tableau créée directement à partir d'un Range est toujours en base 1
    Elle n'est pas créée à partir d'un range mais ça revient au même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve TL(1 To NC, 1 To K)
    Le "Preserve" ne sert à rien, mais dans ce cas, ce n'est pas grave, comme la variable n'a pas été initialisée).

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



    Bref, dans la ligne incriminée, rien de spécial …

    Cela doit provenir de la destination mais comme on ne peut la voir, il doit chercher de son côté !

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

    En fait, c'est juste la transposition de la variable TL qui coince …
    Du reste, je trouve idiot de créer une variable tableau puis de la transposer ‼
    C'est plus logique de l'alimenter en transposant directement les données au fur et à mesure …

    Sinon effectuer la transposition dans une nouvelle variable tableau via des boucles.

    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _____________________________________________________________________________________________________
    La meilleure façon de ne pas avancer est de suivre une idée fixe. (Jacques Prévert)

  16. #16
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    On le fait d'habitude quand on redimensionne le nombre de lignes. Le tableau se présente alors (colonne, ligne). D'où le "Transpose", mais au pire, ça ne plante pas.

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



    Oui moi aussi je n'ai jamais eu ce souci dans mes codes !
    Mais en général je ne transpose que des plages de cellules …
    Et si je crée une variable tableau, je l'alimente directement au bon format !

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par Marc-L Voir le message


    Cela doit provenir de la destination mais comme on ne peut la voir, il doit chercher de son côté !
    Bonjour,

    De la destination ? Il n'y a rien dans la feuille de destination ! Par ailleurs j'ai modifié mon fichier test !

    Merci pour votre aide

    Citation Envoyé par Daniel.C Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve TL(1 To NC, 1 To K)
    Le "Preserve" ne sert à rien, mais dans ce cas, ce n'est pas grave, comme la variable n'a pas été initialisée).
    Bonjour,

    Lorsque j'enlève le Redim Preserve, j'ai une errer bien avant maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
                    'ReDim Preserve TL(1 To NC, 1 To K)
                    For L = 1 To NC 'boucle 2 : sur toutes les colonnes de TC
                        TL(L, K) = TC(J, L) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition) 'erreur à cette ligne maintenant (incompatibilité de type)
    Il n y a t il pas un problème de type de variables ?

    Par ailleurs, j'ai modifié le fichier test !

    Merci pour votre aide

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




    Deux solutions déjà indiquées dans le post #16 ‼


  20. #20
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par Marc-L Voir le message


    Sinon effectuer la transposition dans une nouvelle variable tableau via des boucles.
    A moins que je m'y prenne mal, j'ai toujours le même problème, ça a probablement un rapport avec les éléments de la colonne B je pense ! Parce que le code ainsi que les méthodes proposées fonctionnent dès que j'enlève la colonne B ou au pire fonctionne pour un premier assemblage sur la colonne B mais rien d'autre, la clé que j'ai créé avec votre aide dans mon précédent poste pose un problème ! Cela pourrait être du à quoi ?

    Nom : Sans titre.jpg
Affichages : 257
Taille : 754,7 Ko

    Merci

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/01/2023, 10h20
  2. [excel-vba]imprimer les code vba
    Par CIBOOX dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/07/2007, 16h39
  3. EXCEL/ VBA Erreur sur le code VBA : rediriger l’erreur
    Par hiline6 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/12/2006, 16h28
  4. Réponses: 1
    Dernier message: 03/08/2006, 12h34

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