• Publicité

Excel donées non traitées à classer en tableau

Dans ce forum, vous pouvez poser toutes vos questions concernant l'utilisation de logiciels de bureautique (Microsoft Office, Open Office, etc.)

Modérateurs: Sebastien, Stéphane, Christophe

Excel donées non traitées à classer en tableau

Messagepar chris.d » 20 Aoû 2015 12:46

Bonjour,

j'ai pu voir sur d'autres postes que vous étiez calés niveau Excel, ce qui n'est pas mon cas et pourtant on me demande de travailler vite et bien. Je me permet de faire appel à vous car j'ai besoin d'aide.
Étant donné que les images sont plus explicites que les mot voici mon soucis:
Lien =>http://hpics.li/bd95d52

j'aimerais traiter mes 23000 lignes et les reformuler en tableau (manuellement c'est impossible :-( )

colonne A : correspond au code de ma plante
colonne B : correspond au différentes type de caractéristiques de ma plante
colonne C : correspond à ma valeur de caractéristique

pourriez-vous m'aider s'il vous plait

merci d'avance

Christopher d
chris.d
No0b
No0b
 
Messages: 3
Enregistré le: 20 Aoû 2015 11:00

Re: Excel donées non traitées à classer en tableau

Messagepar Sebastien » 20 Aoû 2015 15:28

Bonjour,

Dans votre capture d'écran, on voit deux tableaux (Le premier qui se trouve dans les colonnes ABC et le deuxième qui se trouve de E à Y).
:arrow: L'objectif, c'est de transformer le premier tableau vers le deuxième (donc le résultat final serait avoir une ligne par plante)
ou
:arrow: De transformer le deuxième vers le premier (donc le résultat final serait d'avoir une ligne par caractéristique pour chaque plante).

En attente de cette précision.

@+
Image
Avatar de l’utilisateur
Sebastien
Administrateur
Administrateur
 
Messages: 5506
Enregistré le: 14 Fév 2005 19:17
Localisation: LILLE

Re: Excel donées non traitées à classer en tableau

Messagepar chris.d » 20 Aoû 2015 15:48

Bonjour, effectivement je n'ai pas précisé, j'ai le tableau en colonne et je souhaite le passer en ligne

cordialement,
chris.d
No0b
No0b
 
Messages: 3
Enregistré le: 20 Aoû 2015 11:00

Re: Excel donées non traitées à classer en tableau

Messagepar Sebastien » 20 Aoû 2015 17:11

Je vais essayer de faire une macro pour faciliter la mise en ligne des données. Le problème est que d'une fleur à l'autre, il n'y a pas le même nombre de champs et donc, avec cette disposition, on doit prévoir des colonnes vides pour ne pas tout décaler
Dans l'exemple, certaines fleurs ont une seule couleur, d'autre 2. D'autres en auront peut être trois dans vos 23.000 lignes. Il faut donc que je trouve un moyen pour trouver à l'avance le nombre de colonnes nécessaires avant de lancer la recopie des données.

Je reposte si je trouve une solution.

@+
Image
Avatar de l’utilisateur
Sebastien
Administrateur
Administrateur
 
Messages: 5506
Enregistré le: 14 Fév 2005 19:17
Localisation: LILLE

Re: Excel donées non traitées à classer en tableau

Messagepar chris.d » 20 Aoû 2015 17:24

Merci de passer du temps à essayer de résoudre mon soucis,

Effectivement le gros problème est la double valeur, pour floraison , couleurs , etc...

ça décale tout mon tableau...

merci pour votre aide
chris.d
No0b
No0b
 
Messages: 3
Enregistré le: 20 Aoû 2015 11:00

Re: Excel donées non traitées à classer en tableau

Messagepar Sebastien » 21 Aoû 2015 20:33

Bonjour,

J'ai fait une macro qui, je l'espère, fonctionnera sur vos 23.000 lignes. Je l'ai testé sur l'exemple que vous l'avez fourni et ça marche (à un petit détail près. cf. explication plus bas)

Rappel du tableau cible :


Description du fichier et de la macro :

Pour fonctionner, le classeur doit avoir trois feuilles nommées :
  • DONNEES
  • DESTINATION
  • TEMP

DONNEES contient votre tableau d'origine
DESTINATION contient le tableau cible (remis en ligne)
TEMP ne sert qu'à effectuer certaines étapes du traitement.

Pour trier les données, il faut se placer dans la feuille DONNEES et lancer la macro TRAITEMENT_DONNEE

Tous sera remis en forme automatiquement.

Code de la macro :

Code: Tout sélectionner
Sub TRAITEMENT_DONNEE()

'Déclaration des variables
Dim ENTETE As Range
Dim PLANTE As Range
Dim dernierecolonne As Integer
Dim derniereligne As Integer
Dim derniereligne2 As Integer
Dim compteur As Integer
Dim ligneplante As Integer
Dim lignecarac As Integer
Dim r As Integer
Dim CODE As String
Dim CARAC As String
Dim VALEUR As String

'La Macro a besoin de trois feuilles pour fonctionner
' Une feuille DONNEES qui contient de tableau d'origine
' Une feuille DESTINATION qui contiendra le tableau remis en ligne
' Une feuille TEMP qui sert pour divers traitement

'Afin de déterminer la taille du tableau final, nous allons
'utiliser un tableau croisé dynamique pour identifier les
'entête de colonnes. Ce tableau sera créé dans la feuille TEMP

Sheets("TEMP").Select
Range("A1").Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "DONNEES!R1C1:R45C3", Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="TEMP!R1C1", TableName:="Tableau croisé dynamique5", _
        DefaultVersion:=xlPivotTableVersion14
Sheets("TEMP").Select
Cells(1, 1).Select

With ActiveSheet.PivotTables("Tableau croisé dynamique5").PivotFields( _
        "Caractéristiques")
        .Orientation = xlColumnField
        .Position = 1
End With
 
With ActiveSheet.PivotTables("Tableau croisé dynamique5").PivotFields("Valeur")
        .Orientation = xlColumnField
        .Position = 2
End With
   
ActiveSheet.PivotTables("Tableau croisé dynamique5").PivotFields( _
        "Caractéristiques").Subtotals = Array(False, False, False, False, False, False, False _
        , False, False, False, False, False)
ActiveSheet.PivotTables("Tableau croisé dynamique5").PivotFields( _
        "Caractéristiques").RepeatLabels = True

'On sélectionne les entêtes identifiées dans le TCD et on les copie
Range("A2").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy

'On colle ces entêtes dans le tableau de DESTINATION
Sheets("DESTINATION").Select
Range("B1").Select
ActiveSheet.Paste
Range("A1").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "CODE"

'On récupère la liste des plantes
Sheets("TEMP").Select
Cells.Select
Selection.Delete Shift:=xlUp
Range("A1").Select
Sheets("DONNEES").Select
Range("A2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

'on va supprimer les doublons de codes de plantes
'on va utiliser la feuille TEMP pour faire ce tri
Sheets("TEMP").Select
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("$A$1:$A$30000").RemoveDuplicates Columns:=1, Header:=xlNo

'on va copier cette liste sans doublon pour la placer dans le tableau DESTINATION
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("DESTINATION").Select
Range("A2").Select
ActiveSheet.Paste
Range("A1").Select

'Définition des plages pour traitement des données
dernierecolonne = Cells.SpecialCells(xlCellTypeLastCell).Column
derniereligne = Cells.SpecialCells(xlCellTypeLastCell).Row
Set ENTETE = Range(Cells(1, 1), Cells(1, dernierecolonne))
Set PLANTE = Range(Cells(1, 1), Cells(derniereligne, 1))

Sheets("DONNEES").Select
Range("A2").Select

derniereligne2 = Range("A" & Rows.Count).End(xlUp).Row
compteur = derniereligne2 - 1

'Démarrage de la boucle de traitement
Do While compteur > 0

    'enregistrement des variables à placer
    CODE = ActiveCell.Value
    CARAC = ActiveCell.Offset(0, 1).Value
    VALEUR = ActiveCell.Offset(0, 2).Value
   
    'On repère la position (ligne) de la plante dans le tableau de destination
    If Not IsError(Application.Match(CODE, PLANTE, 0)) Then
        ligneplante = Application.Match(CODE, PLANTE, 0)
    'On repère la position (colonne) de la caractéristique dans le tableau de destination
        If Not IsError(Application.Match(CARAC, ENTETE, 0)) Then
            lignecarac = Application.Match(CARAC, ENTETE, 0)
        Else
       
        End If
   
        'On va coller la caractéristique de la plante dans le tableau de DESTINATION
        'Trois cas possible
        'La plante a deux valeurs pour une même caractéristique
        If Worksheets("DESTINATION").Cells(ligneplante, lignecarac).Value <> "" And Worksheets("DESTINATION").Cells(ligneplante, lignecarac + 1).Value = "" Then
            Worksheets("DESTINATION").Cells(ligneplante, lignecarac + 1).Value = VALEUR
            ActiveCell.Offset(1, 0).Select
            compteur = compteur - 1
        'La plante a + de deux valeurs pour une même caractéristique
        ElseIf Worksheets("DESTINATION").Cells(ligneplante, lignecarac).Value <> "" And Worksheets("DESTINATION").Cells(ligneplante, lignecarac + 1).Value <> "" Then
            r = 0
            Do While Not IsEmpty(Worksheets("DESTINATION").Cells(ligneplante, lignecarac + r).Value)
                r = r + 1
            Loop
            Worksheets("DESTINATION").Cells(ligneplante, lignecarac + r).Value = VALEUR
            ActiveCell.Offset(1, 0).Select
            compteur = compteur - 1
       
        Else
        'La plante a une caractéristique
            Worksheets("DESTINATION").Cells(ligneplante, lignecarac).Value = VALEUR
            ActiveCell.Offset(1, 0).Select
            compteur = compteur - 1
        End If
       
    Else
        'traitement de la ligne suivante
        ActiveCell.Offset(1, 0).Select
        compteur = compteur - 1
    End If

'On relance le traitement
Loop
   
End Sub



Lien direct vers le fichier XLSM :
http://www.astucesinternet.com/data/ima ... PLANTE.zip



Limite de la macro (le "détail" dont je parle au début) :
Afin de trouver une méthode qui ne décale pas les colonnes, j'ai utilisé un TCD pour identifier toutes les colonnes à créer. L'inconvenient est que la macro va créer autant de colonnes qu'il y a de valeurs pour une même caractéristique.
Par exemple, pour la couleur des feuilles, dans l'exemple il y a deux valeurs. Il y a vert (deux fois) et panaché (une fois). La macro va donc créer deux colonnes pour cette couleur de feuilles alors que seule le première colonne sera remplie (chaque fleur de l'exemple n'a qu'une seule couleur).
Cette problématique ne crée aucun décalage, c'est juste qu'il y a une colonne vide qu'il faudra supprimer manuellement (pour le moment car je cherche un moyen d'automatiser la suppression des colonnes vides).


Je vous invite à tester le fichier proposé, et dans un second temps d'insérer vos 23.000 lignes dans la feuille DONNEES de ce même fichier afin de voir si cela fonctionne (il faudra supprimer le contenu des feuilles DESTINATION et TEMP avant chaque lancement de la macro).
Conseil : Ne travaillez qu'avec des copies et pas sur votre fichier directement.

Tenez-nous au courant.

@+
Image
Avatar de l’utilisateur
Sebastien
Administrateur
Administrateur
 
Messages: 5506
Enregistré le: 14 Fév 2005 19:17
Localisation: LILLE


Retourner vers Forum d'entraide : Bureautique

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

  • Publicité