[XLS] table en ligne à mettre en colonnes

ccciolll

Membre expert
Club iGen
Bonjour,

j'ai reçu aujourd'hui une table formatée de la façon suivante (je simplifie volontairement, le principe étant le même quelque soit le nombre de variantes)



Uploaded with ImageShack.us

càd
NOM(tab)DUPONT
PRE(tab)Jean
AD(tab)10, rue Bidule
NOM(tab)DURAND
PRE(tab)Michel
AD(tab)10, rue Truc

Et je voudrais l'avoir sous une forme un peu plus classique, soit



Uploaded with ImageShack.us

càd
NOM(tab)PRE(tab)AD
DUPONT(tab)Jean(tab)10, rue Bidule
Durand(tab)Michel(tab)10, rue Truc


La solution que j'ai utilisée c'est d'exporter mon fichier de base en txt+tab, importer le résultat dans un bloc texte de QuarkXpress7 (qui est équipé d'un outil rechercher-remplacer le plus performant que je connaisse), et rechercher-remplacer les NOM(tab) par du vide, et les (return)PRE et (return)AD par du vide
et ainsi arriver au résultat escompté.
Évidemment cela ne fonctionne que si les NOM, PRE, AD sont toujours dans le même ordre dans le fichier de base, et de préférence toujours présents (genre si on a par moment un NOM, AD, sans le PRE au milieu, ça décale le résultat et il faut intervenir à la main, si on s'en aperçois.

Bon, j'ai ma solution papa-bricole, mais comme je ne suis probablement pas le premier à rencontrer ce type de problème (je n'ai pas su, néanmoins, quels mots clefs utiliser pour faire une recherche) je me dis qu'il doit exister des solutions plus techniques (et plus sûres).

J'ai excel 2004 (ça, c'est la limite imposée).

---------- Nouveau message ajouté à 14h37 ---------- Le message précédent a été envoyé à 14h31 ----------

Pour simplifier, on pourrait même dire : je veux passer de
1
2
3
1
2
3
1
2
3


à
1 2 3
1 2 3
1 2 3


donc un peu plus <qu'une simple transposition en collage spécial.
 
Une macro te rageant le contenu de la seconde cellule en fonction de la première te fera ça très facilement...

- Création feuille 2 vide
- Parcours de colonne 1, tant que non vide
== Si nom alors passage à la ligne suivante de feuille 2 et écrire valeur colonne 2 dans colonne 1 de feuille 2
== Si prénom alors écrire valeur colonne 2 dans colonne 2 de feuille 2
== Si ad alors écrire valeur colonne 2 dans colonne 3 de feuille 2
== passage à la ligne suivante de feuille 1 (pour lecture)
- fin tant que
 
Une petite macro vite fait qui devrait fonctionner avec Excel 2004 (en tout cas elle fonctionne bien avec Excel 2011) :

Bloc de code:
Sub TriezMoiÇa()
Application.ScreenUpdating = False

' ajoute une feuille "Destination"
Origine = ActiveSheet.Name
Worksheets.Add after:=Worksheets(Origine)
ActiveSheet.Name = "Destination"

' Initialisation des colonnes de la feuille "Destination"
With Worksheets("Destination")
    Range("A1").Value = "NOM"
    Range("B1").Value = "PRE"
    Range("C1").Value = "AD"
End With
j = 1

' Remplissage en triant les colonnes selon l'identifiant
With Worksheets(Origine)
    For i = 1 To .UsedRange.Rows.Count
        Select Case .Range("A" & i)
        Case Is = "NOM"
            j = j + 1
            MaCol = "A"
        Case Is = "PRE"
            MaCol = "B"
        Case Is = "AD"
            MaCol = "C"
        End Select
    Worksheets("Destination").Range(MaCol & j) = .Range("B" & i)
    Next i
End With

Application.ScreenUpdating = True
End Sub
En l'exécutant à partir de la feuille dans laquelle sont tes données, ça te créera une feuille nommée "Destination" où tout sera trié et rangé. Bien entendu, comme tes données ne sont pas exactement celles de ton exemple, il te faudra un peu adapter.

Comme tu peux le voir, il y a tout de même un principe de base : pour chaque contact, il y a au minimum la ligne "NOM", laquelle est indispensable au bon fonctionnement de la macro. S'il devait y avoir des contacts sans nom, il faudra faire quelques adaptations...
 
  • J’aime
Réactions: ccciolll
Cela dit, une macro, ça vaut le coup s'il y en a vraiment beaucoup, et/ou régulièrement, mais s'il ne s'agit que de quelques dizaines d'adresses, à faire une fois, des "copier -> Collage spécial -> transposer" assortis de quelques insertions de cellules vides devraient permettre d'aller plus vite !
 
Ben rien que dans le cas qui me concernait, j'avais 93 noms * 6 variables, soit 558 lignes, donc le copier coller dans excel n'était pas réalisable (car un collage + transposer basique ferait 558 colonnes et je ne serai pas plus avancé, pour que ça marche il faudait faire 93 copier-coller en sélectionnant à chaque fois 6 cellules. Un peu fastidieux, je préfère la méthode avec Xpress).
Donc pas vraiment de solution « tout public »
Soit on tombe sur un type sympa qui compose une macro de base, soit on se fait offrir une formation macro excel par son employeur&#8230;
OK, je vais tester ta macro chez moi et si j'arrive à la maîtriser, je la garderai sous le coude pour plus tard (puisque j'avais déjà réglé mon problème avec ma méthode bricolage finalement tout de même assez rapide, peut-être même plus rapide que de modifier une macro pré-écrite si le fichier reçu est suffisamment régulier).

---------- Nouveau message ajouté à 10h48 ---------- Le message précédent a été envoyé à 10h31 ----------

Alors, premier test. Il m'a fallu du temps avant de trouver comment faire pour créer une macro en saisie directe du code car quand j'allais dans nouvelle macro il me mettait un enregistreur façon script de photoshop. J'ai peut-être déjà un peu merdé de ce côté là.

Breffles, j'ai testé, il a créé la nouvelle feuille avec les colonnes, mais ensuite j'ai eu un message d'erreur que voici
Erreur d'exécution '1004':
Erreur définie par l'application ou par l'objet


et quand j'ai cliqué sur débogage, il m'a surligné ceci :
Worksheets("Destination").Range(MaCol & j) = .Range("B" & i)

Cela dit comme j'ai un peu manipulé le code, c'est peut-être ça qui fait bugger.
Voilà mon code modifié :

Bloc de code:
Sub TriezMoiCa()
'
' TriezMoiCa Macro
' passer une extract BDD en lignes de Olivier à une BDD en colonnes normale
'
' ajoute une feuille "Destination"
Origine = ActiveSheet.Name
Worksheets.Add after:=Worksheets(Origine)
ActiveSheet.Name = "Destination"

' Initialisation des colonnes de la feuille "Destination"
With Worksheets("Destination")
    Range("A1").Value = "NOM"
    Range("B1").Value = "PRE"
    Range("C1").Value = "FON"
    Range("D1").Value = "TEL"
    Range("E1").Value = "MOB"
    Range("F1").Value = "FAX"
    Range("G1").Value = "EML"
End With
j = 1

' Remplissage en triant les colonnes selon l'identifiant
With Worksheets(Origine)
    For i = 1 To .UsedRange.Rows.Count
        Select Case .Range("A" & i)
        Case Is = "nom"
            j = j + 1
            MaCol = "A"
        Case Is = "prenom"
            MaCol = "B"
        Case Is = "fon"
            MaCol = "C"
        Case Is = "tel"
            MaCol = "D"
        Case Is = "mobile"
            MaCol = "E"
        Case Is = "fax"
            MaCol = "F"
        Case Is = "email"
            MaCol = "G"
        End Select
    Worksheets("Destination").Range(MaCol & j) = .Range("B" & i)
    Next i
End With

Application.ScreenUpdating = True
End Sub


---------- Nouveau message ajouté à 10h52 ---------- Le message précédent a été envoyé à 10h48 ----------

EDIT :

J'ai aussi en ligne 1 de mon original, une ligne de titre, ça peut poser problème ?
 
Ben oui, évidemment. Si la première ligne ne doit pas être prise en compte, il faut commencer la boucle sur la deuxième ligne. Donc mettre i = 2 au lieu de i = 1.
 
D'accord, alors maintenant admettons que le fichier fourni soit pollué.

par exemple, je cherche NOM, PRE et AD mais j'ai un fichier comme ça

NOM(tab)Machin
PRE(tab)Bidule
PSEUDO(tab)Dudule
AD(tab)10, rue du Truc


Est-ce que cette macro va aussi se bloquer sur PSEUDO qui n'est pas dans la liste des « value » ?
Car ce sera le cas des fichiers que j'aurais à traiter(si j'en ai à nouveau), et c'est cette faculté d'ignorer la « pollution » qui me faisait paraître une solution Macro supérieure à mon bricolage via Xpress.
 
Est-ce que cette macro va aussi se bloquer sur PSEUDO qui n'est pas dans la liste des « value » ?


Ben pour éviter ça, tu ajoutes au début un "range H1="Autres" , et dans le "select case", juste avant le "End Select", un "case else" -> "MaCol="H", comme ça toutes les rubriques inattendues iront se caser en colonne H, mais attention, s'il y a plusieurs rubriques inattendues par "fiche", seule la dernière sera conservée.
 
  • J’aime
Réactions: ccciolll
Ouaip ! Et si tu fais plusieurs essais avec le même classeur, n'oublie pas de supprimer la feuille "Destination" entre chaque essai.
 
Ah ben on s'était mal compris. Pour moi, s'il y a des lignes imprévues, ce sont des pollutions et je souhaite les ignorer. Chose que fait déjà parfaitement la macro fournie (je n'avais pas pu le constater car j'avais mon erreur dûe à la ligne de titres qui bloquait mes tests et qui justement m'a fait croire qu'il fallait absolument que tous les champs contrôlés aient un contenu répertorié dans la macro, d'où cette question sur la pollution).

Donc c'est NICKEL ! (à ce détail près qu'il faudra que je réécrive partiellement cette macro à chaque usage car les codes à retrouver et classer seront potentiellement différents, mais là c'est tout à fait dans mes compétences, je viens de le faire)

MERCI !
 
Dernière édition:
  • J’aime
Réactions: Aliboron