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 :

Avez vous un code pour mettre une liste en Tableau?


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Freelancer
    Inscrit en
    Février 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Freelancer

    Informations forums :
    Inscription : Février 2017
    Messages : 40
    Points : 9
    Points
    9
    Par défaut Avez vous un code pour mettre une liste en Tableau?
    Bonjour a tous,

    J ai une liste sur en 3 colonnes et je cherche a mettre ca en tableau 2D.
    En colonne 1 j ai le nom qui ira en axe vertical du tableau
    En colonne 2 j ai l attribut qui ira en axe horizontal du tableau
    En colonne 3 J ai la valeur a mettre en intersection dans le tableau.

    Attention: Je n ai pas toujours les memes attributs (colonne 2) pour tous les noms. Il y aura donc des champs vides dans le tableau final.

    Meme si ce code a l air simple, je suis trop debutant pour le realise mais en gros voila ce que je ferais :
    1- Liste la colonne 1 et la copie en colonne 2 du tableau en valeur unique - En A2
    2- Liste la colonne 2 et la copie en transposant avec valeurs unique dans le tableau - En B1
    3- Pour chaque valeur en colonne 3, lis la colonne 1 et 2 et va chercher le croisement dans le tableau 2d - Ca ca a l air hyper complique a faire...

    Merci de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 664
    Points : 5 797
    Points
    5 797
    Par défaut
    Bonjour

    Si tes valeurs en colonne 3 sont numériques, un TCD te donnera le résultat en quelques seconde.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Freelancer
    Inscrit en
    Février 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Freelancer

    Informations forums :
    Inscription : Février 2017
    Messages : 40
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Bonjour

    Si tes valeurs en colonne 3 sont numériques, un TCD te donnera le résultat en quelques seconde.

    Les valeurs sont du texte et je ne veux pas de TCD. Je sais... ca complique :-)

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 664
    Points : 5 797
    Points
    5 797
    Par défaut
    Meme si ce code a l air simple, je suis trop debutant pour le realise mais en gros voila ce que je ferais :
    1- Liste la colonne 1 et la copie en colonne 2 du tableau en valeur unique - En A2
    2- Liste la colonne 2 et la copie en transposant avec valeurs unique dans le tableau - En B1
    3- Pour chaque valeur en colonne 3, lis la colonne 1 et 2 et va chercher le croisement dans le tableau 2d - Ca ca a l air hyper complique a faire...
    Pour les points 1 et 2, utilise l'enregistreur de macro
    Pour le 3:c'est très simple a faire en Excel avec une combinaison des formules INDEX et EQUIV, une fois la formule correcte trouvée, il suffit de la traduire en vba (si besoin l'enregistreur de maccro peut là encore t'aider)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Freelancer
    Inscrit en
    Février 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Freelancer

    Informations forums :
    Inscription : Février 2017
    Messages : 40
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Pour les points 1 et 2, utilise l'enregistreur de macro
    Pour le 3:c'est très simple a faire en Excel avec une combinaison des formules INDEX et EQUIV, une fois la formule correcte trouvée, il suffit de la traduire en vba (si besoin l'enregistreur de maccro peut là encore t'aider)
    Bon, je viens de faire le 1 et 2... et suis assez fier de moi.

    Par contre c est le grand inconnu pour la suite.

    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
    Sub List2Table()
     
    Dim LastRowA As Long
    Dim LastRowB As Long
     
    LastRowA = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
     
    Sheets("Sheet1").Range("A1:A" & LastRowA).Copy
    Sheets("2DTable").Range("A1").PasteSpecial
    Sheets("2DTable").Range("A1" & LastRowA).RemoveDuplicates Columns:=1, Header:=xlYes
     
    Sheets("Sheet1").Range("B1:B" & LastRowA).Copy
    Sheets("2DTable").Range("B1").PasteSpecial
    Sheets("2DTable").Range("B1" & LastRowA).RemoveDuplicates Columns:=2, Header:=xlYes
     
    LastRowB = Sheets("2DTable").Cells(Rows.Count, 2).End(xlUp).Row
    Sheets("2DTable").Range("B2:B" & LastRowB).Copy
    Sheets("2DTable").Range("B1").PasteSpecial Transpose:=True
    Sheets("2DTable").Range("B2:B" & LastRowB).Clear
     
    End Sub

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 664
    Points : 5 797
    Points
    5 797
    Par défaut
    Exemple: Avec une rechercheV et en ajoutant une colonne à ton tableau de base

    Nom : 2019_02_19_10_47_38_Microsoft_Excel_Classeur2.jpg
Affichages : 397
Taille : 59,5 Ko

    A noter que tu peux remplacer les NA par ce qui t'arrange en ajoutant la fonction sierreur à la formule

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Freelancer
    Inscrit en
    Février 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Freelancer

    Informations forums :
    Inscription : Février 2017
    Messages : 40
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Exemple: Avec une rechercheV et en ajoutant une colonne à ton tableau de base

    Nom : 2019_02_19_10_47_38_Microsoft_Excel_Classeur2.jpg
Affichages : 397
Taille : 59,5 Ko

    A noter que tu peux remplacer les NA par ce qui t'arrange en ajoutant la fonction sierreur à la formule
    Excellent... je vais essayer de monter ca en VBA.

  8. #8
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,


    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
    Sub Stat2DTab()
      Set f = Sheets("BD")
      TblBD = f.Range("A2:C" & f.[A65000].End(xlUp).Row).Value  ' Array pour rapidité
      colCrit1 = 1: colCrit2 = 2: colOper = 3
      Set Result = f.Range("f1")                                        ' Adresse résultat
      Set d1 = CreateObject("Scripting.Dictionary")    ' Dictionnaire index pour rapidité
      Set d2 = CreateObject("Scripting.Dictionary")
      Dim TblTot(): ReDim TblTot(1 To UBound(TblBD), 1 To UBound(TblBD, 2))
      Dim TblTotLig(): ReDim TblTotLig(1 To UBound(TblBD))
      Dim TblTotCol(): ReDim TblTotCol(1 To UBound(TblBD, 2))
      For i = LBound(TblBD) To UBound(TblBD)
        clé1 = TblBD(i, colCrit1): If d1.exists(clé1) Then lig = d1(clé1) Else d1(clé1) = d1.Count + 1: lig = d1.Count
        clé2 = TblBD(i, colCrit2): If d2.exists(clé2) Then col = d2(clé2) Else d2(clé2) = d2.Count + 1: col = d2.Count
        TblTot(lig, col) = TblTot(lig, col) + TblBD(i, colOper)
        TblTotLig(lig) = TblTotLig(lig) + TblBD(i, colOper)
        TblTotCol(col) = TblTotCol(col) + TblBD(i, colOper)
      Next i
      Result.Offset(1).Resize(d1.Count, 1) = Application.Transpose(d1.keys)   ' titre lignes
      Result.Offset(, 1).Resize(1, d2.Count) = d2.keys                        ' titres colonnes
      Result.Offset(1, 1).Resize(d1.Count, d2.Count) = TblTot                 ' stat 2D
      Result.Offset(d1.Count + 1, 1).Resize(, d2.Count) = TblTotCol   ' totaux colonnes
      Result.Offset(1, d2.Count + 1).Resize(d1.Count) = Application.Transpose(TblTotLig) ' totaux lignes
    End Sub

    Nom : T2D.gif
Affichages : 229
Taille : 18,4 Ko

    Si la colonne 3 est du texte, cf SimulTCD

    Nom : T2D2.gif
Affichages : 293
Taille : 41,3 Ko

    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
    Sub Stat2DTab()
      Set f = Sheets("BD")
      TblBD = f.Range("A2:C" & f.[A65000].End(xlUp).Row).Value  ' Array pour rapidité
      colCrit1 = 1: colCrit2 = 3: colOper = 2
      Set AdrResult = f.Range("f1")                                 ' Adresse résultat
      Set d1 = CreateObject("Scripting.Dictionary")    ' Dictionnaire index pour rapidité
      Set d2 = CreateObject("Scripting.Dictionary")
      Dim TblRes(1 To 100, 1 To 100)
      For i = LBound(TblBD) To UBound(TblBD)
        clé1 = TblBD(i, colCrit1): If d1.exists(clé1) Then lig = d1(clé1) Else d1(clé1) = d1.Count + 1: lig = d1.Count
        clé2 = TblBD(i, colCrit2): If d2.exists(clé2) Then col = d2(clé2) Else d2(clé2) = d2.Count + 1: col = d2.Count
        TblRes(lig, col) = TblBD(i, colOper)
      Next i
      AdrResult.Offset(1).Resize(d1.Count, 1) = Application.Transpose(d1.keys)   ' titre lignes
      AdrResult.Offset(, 1).Resize(1, d2.Count) = d2.keys                        ' titres colonnes
      AdrResult.Offset(1, 1).Resize(d1.Count, d2.Count) = TblRes         '  résultat
      '-- coloriage titres
      AdrResult.Offset(1).Resize(d1.Count).Interior.Color = vbBlack
      AdrResult.Offset(1).Resize(d1.Count).Font.Color = vbWhite
      AdrResult.Offset(, 1).Resize(, d2.Count).Interior.Color = vbBlack
      AdrResult.Offset(, 1).Resize(, d2.Count).Font.Color = vbWhite
      '--- tri
      Set Rng = AdrResult.Resize(d1.Count + 1, d2.Count + 1)    ' tri lignes & colonnes
      Rng.Offset(1).Resize(Rng.Rows.Count - 1, Rng.Columns.Count).Sort key1:=Rng.Cells(2, 1), _
         Order1:=xlAscending, Header:=xlNo, MatchCase:=False, Orientation:=xlSortColumns
      Rng.Offset(, 1).Resize(Rng.Rows.Count, Rng.Columns.Count - 1).Sort key1:=Rng.Cells(1, 2), _
         Order1:=xlAscending, Header:=xlNo, MatchCase:=False, Orientation:=xlSortRows
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Freelancer
    Inscrit en
    Février 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Freelancer

    Informations forums :
    Inscription : Février 2017
    Messages : 40
    Points : 9
    Points
    9
    Par défaut
    Mr Boigontier,

    Merci pour votre aide.
    J'utilise votre macro Stat2DTab
    J'ai changé la donnée colCrit 2 et colOper =3 car en 2eme colonne j'ai mon axe horizontal du tableau et j'ai les valeur en colonne 3

    Par contre j'ai une erreur maintenant si je l'utlise sur mes données.
    J'ai 50100 valeurs avec 43 attributs (donc 44 colonnes) et 1253 lignes attendues.

    EDIT: L'erreur est sur cette ligne
    TblRes(lig, col) = TblBD(i, colOper)


    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
    Sub Stat2DTab()
      Set f = Sheets("BD")
      TblBD = f.Range("A2:C" & f.[A65000].End(xlUp).Row).Value  ' Array pour rapidité
      colCrit1 = 1: colCrit2 = 2: colOper = 3
      Set AdrResult = f.Range("f1")                        ' Adresse résultat
      Set d1 = CreateObject("Scripting.Dictionary")        ' Dictionnaire index pour rapidité
      Set d2 = CreateObject("Scripting.Dictionary")
      Dim TblRes(1 To 100, 1 To 100)
      For i = LBound(TblBD) To UBound(TblBD)
        clé1 = TblBD(i, colCrit1): If d1.exists(clé1) Then lig = d1(clé1) Else d1(clé1) = d1.Count + 1: lig = d1.Count
        clé2 = TblBD(i, colCrit2): If d2.exists(clé2) Then col = d2(clé2) Else d2(clé2) = d2.Count + 1: col = d2.Count
        TblRes(lig, col) = TblBD(i, colOper)
      Next i
      AdrResult.Offset(1).Resize(d1.Count, 1) = Application.Transpose(d1.keys)   ' titre lignes
      AdrResult.Offset(, 1).Resize(1, d2.Count) = d2.keys                        ' titres colonnes
      AdrResult.Offset(1, 1).Resize(d1.Count, d2.Count) = TblRes                 ' résultat
      '-- coloriage titres
      AdrResult.Offset(1).Resize(d1.Count).Interior.Color = vbBlack
      AdrResult.Offset(1).Resize(d1.Count).Font.Color = vbWhite
      AdrResult.Offset(, 1).Resize(, d2.Count).Interior.Color = vbBlack
      AdrResult.Offset(, 1).Resize(, d2.Count).Font.Color = vbWhite
      '--- tri
      Set Rng = AdrResult.Resize(d1.Count + 1, d2.Count + 1)    ' tri lignes & colonnes
      Rng.Offset(1).Resize(Rng.Rows.Count - 1, Rng.Columns.Count).Sort key1:=Rng.Cells(2, 1), _
         Order1:=xlAscending, Header:=xlNo, MatchCase:=False, Orientation:=xlSortColumns
      Rng.Offset(, 1).Resize(Rng.Rows.Count, Rng.Columns.Count - 1).Sort key1:=Rng.Cells(1, 2), _
         Order1:=xlAscending, Header:=xlNo, MatchCase:=False, Orientation:=xlSortRows
    End Sub

  10. #10
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Le tableau TblRes() n'a pas assez de lignes.

    Modifier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dim TblRes(1 To 2000, 1 To 100)

    Boisgontier

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Freelancer
    Inscrit en
    Février 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Freelancer

    Informations forums :
    Inscription : Février 2017
    Messages : 40
    Points : 9
    Points
    9
    Par défaut
    Merci!

    Par contre la macro fait une erreur de traitement. Elle copie mes données non pas en texte mais en valeur. Exemple: Si j'ai dans une cellule 10E2, alors la macro va écrire le résultat mathématique de 10 exposant 2, soit 100. La macro va écrire 100.

  12. #12
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    C'est cette ligne qui convertit en numérique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AdrResult.Offset(1, 1).Resize(d1.Count, d2.Count) = TblRes                 ' résultat
    Modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        TblRes(lig, col) = "'" & TblBD(i, colOper)
    Boisgontier
    Fichiers attachés Fichiers attachés

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Freelancer
    Inscrit en
    Février 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Freelancer

    Informations forums :
    Inscription : Février 2017
    Messages : 40
    Points : 9
    Points
    9
    Par défaut
    Merci, je vais essayer ça.

  14. #14
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    TU ouvres ta liste dans Word
    Tu la convertis en tableau
    Tu copies-colles le tableau Word dans Excel

    Pour les détails, tu regardes ici.

Discussions similaires

  1. code pour rafraichir une liste déroulante
    Par morgane32 dans le forum VBA Access
    Réponses: 5
    Dernier message: 02/09/2008, 17h06
  2. Changer le code pour mettre plutôt une image ?
    Par Bruno13 dans le forum Delphi
    Réponses: 1
    Dernier message: 17/11/2006, 18h09
  3. [FTP] Code pour mettre une image en background
    Par Link14 dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2006, 21h10
  4. code HTML pour mettre une image en background dans un menu
    Par Link14 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 16/10/2005, 12h11
  5. Réponses: 2
    Dernier message: 01/04/2003, 22h09

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