Réorganisation fichier Excel

Hello,

Concernant le schéma l'ordre à très peu d'importance, car les caractéristiques sont liées à un numéro de série unique.

Autrement dit, on pourrait imaginer avoir tout les n°de série, avec toutes les adresses MAC, ensuite la ram etc.., ou bien avoir le numéro de série avec les caractéristiques qui se suivent.

Concrètement :

  • une valeur qui se répète pour un même numéro de série n'est pas un pb (sauf pour les macs que l'on concatène)
  • Les valeurs vides sont interdites.

Petit schéma

N°de série | Nom de la caractéristique | valeur

SN1 | Adresse Mac |MAC ETH+WIFI

SN1 | RAM |8 Go (ne doit pas etre vide)

SN1 | Taille disque |8 Go (ne doit pas etre vide)

SN1 |Fréquence proc |8 Go (ne doit pas etre vide)

On parcourt toutes les caractéristiques et on passe au SN2

Bonsoir,

Pas facile d'avoir des réponses précises... !

Du coup, ça n'ivalidait rien de ce que j'avais écrit, mais tes réponses laissaient des portes ouvertes à pas mal de variations. Plus je me suis aperçu que j'avais loupé une colonne (SMART) que tu n'as pas relevé.

J'ai donc cherché la stratégie permettant le maximum d'adaptation :

Je garde la structure initiale de la première procédure : soit concaténation préalable des adresses MAC, puis traitement général.

Mais je place toutes les colonnes en variables. A partir d'un tableau que tu pourras redéfinir :

    Col = Array("N°serie", "Fréquence du processeur", "Capacité mémoire", _
     "Adresse MAC", "OS", "Taille disque", "SMART")

Ici les en-tête de colonnes à prélever sont prises dans l'ordre où elles sont dans le fichier...

Ce tableau doit lister les libellés (de façon exacte puisqu'ils varient d'un fichier à l'autre), en commençant impérativement par le numéro de série, mais l'ordre de tous les autres libellés est modifiable, et tu peux en retrancher ou en ajouter, et selon l'ordre que tu adoptes tu définis en même temps l'ordre des résultats, car ils seront traités dans cet ordre.

Second tableau sur lequel tu dois le cas échéant intervenir si tu modifies celui ci-dessus :

    k = Array(0, 0, 0, 0, 0, 0, 0)

Pas compliqué : il doit comporter autant de 0 qu'il y a d'éléments dans le précédent (qui seront remplacés ensuite par les numéros de colonnes correspondants).

Tu pourras donc à partir de ces deux éléments réaliser toutes les adaptations (pour des fichiers à traiter de façon semblable) selon les informations à recueillir, et avec des possibilités de varier les informations recueillies et l'ordre final des résultats. Sans avoir à toucher au reste du code.

La première partie est écrite. Il me reste la seconde : une double boucle, sur les lignes du tableau source et sur les colonnes d'informations à recueillir, ce qui sera plus homogène que la précédente version.

Je ne sais si j'aurai le temps d'écrire ce qui manque demain car je me déplace (et en plus j'aurai vraisemblablement quelques problèmes de connexion à régler...) Ce sera dès que possible (NB- par écrire, je n'entends pas seulement produire les lignes de code manquantes, ce qui sera assez vite fait, plus vite que pour la première version, mais ce qui va avec à la suite : tests et vérification des quelques points critiques, ce n'est pas que ce soit très long mais il est un peu hasardeux de s'y livrer quand on est dérangé en permanence pour autre chose ).

@+

Bonsoir,

Nouvelle version à voir :

Sub Reorganisation()
    Dim Tbl(), aa, k, Col, i%, j%, n%
    aa = Worksheets("Feuil1").Range("A1").CurrentRegion
    'Traitement Adresse MAC
    Col = Array("N°serie", "Adresse MAC"): k = Array(0, 0)
    For i = 1 To UBound(aa, 2)
        'remplacer 1 ci-dessous par ligne d'en-tête si pas 1
        If aa(1, i) = Col(0) Then
            k(0) = i
        ElseIf aa(1, i) = Col(1) Then
            k(1) = i
        End If
    Next i
    For i = 0 To 1
        If k(i) = 0 Then
            MsgBox Col(i) & " non détecté !" & Chr(10) & "Vérifier.", vbCritical, _
             "Intitulé manquant"
            Exit Sub
        End If
    Next i
    For i = 4 To UBound(aa) 'boucle à partir 1re ligne données
        If aa(i, k(1)) <> "" Then
            j = i
            If j < UBound(aa) Then
                Do While aa(j + 1, k(0)) = aa(i, k(0))
                    j = j + 1
                    If aa(j, k(1)) <> "" Then
                        aa(i, k(1)) = aa(i, k(1)) & " + " & aa(j, k(1))
                        aa(j, k(1)) = ""
                    End If
                    If j = UBound(aa) Then Exit Do
                Loop
            End If
            i = j
        End If
    Next i
    'Définition des items à répertorier (ordre de succession qu'on veut
    ' en résultat, le n° de série restant en tête de liste)
    Col = Array("N°serie", "Fréquence du processeur", "Capacité mémoire", _
     "Adresse MAC", "OS", "Taille disque", "SMART")
    'Initialiser k avec le même nombre d'éléments que Col
    k = Array(0, 0, 0, 0, 0, 0, 0)
    For j = 0 To UBound(Col)
        For i = 1 To UBound(aa, 2)
            If aa(1, i) = Col(j) Then k(j) = i: Exit For
        Next i
    Next j
    For i = 0 To UBound(k)
        If k(i) = 0 Then
            MsgBox "L'intitulé " & Col(i) & " n'a pas été détecté!" & Chr(10) _
             & "Vérifier.", vbCritical, "Intitulé manquant"
            Exit Sub
        End If
    Next i
    'Boucle sur chaque ligne d'extraction
    'Pour chaque ligne, boucle sur les colonnes concernées
    For i = 4 To UBound(aa)
        For j = 1 To UBound(Col)
            If aa(i, k(j)) <> "" Then
                ReDim Preserve Tbl(2, n): Tbl(0, n) = aa(i, k(0))
                Tbl(1, n) = Col(j): Tbl(2, n) = aa(i, k(j)): n = n + 1
            End If
        Next j
    Next i
    'Affectation du tableau résultats
    With Worksheets("ligne")
        .Range("A1").CurrentRegion.Offset(1).ClearContents
        .Range("A2").Resize(n, 3).Value = WorksheetFunction.Transpose(Tbl)
        .Activate
    End With
End Sub

J'ai mis quelques commentaires pour repérer les différentes parties.

En complément à mon post précédent concernant les adaptations, un petit point à rajouter : les boucles sur les lignes du tableau source doivent commencer à la première ligne de données (ici 4, antérieurement c'était 2).

Noter qu'ici la ligne 1 porte des en-têtes mais seulement dans les colonnes qui nous intéressent, la ligne 2 porte une mention en A2 mais le reste est vide, ligne 3 porte des mentions dans toutes les colonnes jusqu'à T, les données commencent ligne 4 mais toutes les colonnes ne sont pas servies... On prélève le tableau source par CurrentRegion à partir de A1 : A1 est vide mais A2 ne l'est pas de même que les autres ligne de la colonne jusqu'en A13, et la ligne 3 est remplie jusqu'en T3, ce qui assure de couvrir A1:T13... Si le tableau source comporte de nombreux trous, il conviendra de s'assurer qu'aucune ligne ou colonne entièrement vide n'est susceptible de le scinder (au besoin tester préalablement que la la plage prélevée couvre bien la totalité du tableau source).

Cordialement.

Hello MFERRAND,

Un grand merci !

Je m'excuse pour le manque de précision de mes messages. Comme quoi, savoir le résultat ne veut pas toujours dire savoir l'exprimer correctement!

Bon, j'ai de la marge de progression et ça c'est cool.

Bonne journée a tous.

Rechercher des sujets similaires à "reorganisation fichier"