Présentation d'un TCD
Bonjour à tous,
Sans doute une question très bête, mais je n'y arrive pas :
Lors de la création de mes Tcd, la présentation est telle que les références de la 1ère colonne ne sont pas répétées lorsque les lignes suivantes lui sont liées, hors je voudrait qu'elles le soient. Un petit exemple simple :
J'obtiens par exemple :
Marc..........12,5.......43
................ 7..........38
................ 8..........25
David..........11..........29
................10..........42
.................9..........34
.................7..........28
Et je voudrais obtenir :
Marc..........12,5.......43
Marc...........7..........38
Marc...........8..........25
David..........11.........29
David..........10.........42
David...........9..........34
David...........7..........28
Soit directement dans mon Tcd si c'est possible, soit en créant un tableau basé sur le Tcd original....
Avez-vous des pistes ?
Merci par avance !!!
Bonjour,
Ce que tu voudrais n'est pas possible à faire avec un TCD.
Vois toutefois les modèles de mise en forme par l'option Format / mise en forme automatique.
Amicalement
bonsoir
ça serait très interessant de pouvoir voir le tableau initial et surtout de à quoi correspondent les 3 lignes pour marc etc... En postant un exemple on pourra se prononcer plus précisemment (ajout d'un champs ou élément calculé) export des lignes correspondant à une personne etc...
cordialement
oups, j'ai édité, je n'avais pas vu que la mise en page avait supprimer mes espaces... Je les ai remplacés par des .... pour la lisibilité...
En fait, j'ai souvent besoin de ce format, je le fait donc "à la main".
Si ce n'est pas possible directement dans 1 Tcd, n'y aurait-il pas la possibilité d'une macro astucieuse qui le génèrerait d'après le Tcd ?
J'ai trouvé une possibilité, dites moi si on peut faire mieux ou plus simple svp :
si mes prénoms sont en colonne A (début du tableau en A1)
Je fait mon nouveau tableau en E1 par exemple.
En E1, je tape "=A1)
En E2, je tape "=SI(A2="";E1;A2)"
Et j'incrémente vers le bas...
Si mon tableau n'a que 3 colonnes :
Je tape en F1 : "=B1" et j'incrémente.
Puis je tape en G2 : "=C1" et j'incrémente...
Le soucis avec cette solution, c'est que si je l'automatise dans une macro, je ne sais pas comment faire pour signaler la fin de l'incrémentation... C'est sans doute simple, mais je ne vois pas... Peut-être une double condition en se servant de la colonne B, mais je ne maîtrise pas les double conditions... Une idée ???
Merci de votre intérêt en tout cas...
Si ce n'est pas clair, j'essaierai de poster un petit fichier exemple, dites moi...
bonjour
bravo pour les efforts d'explication et de tentatives pour trouver une solution...
Ce n'est pas que vos explications ne soient pas claires mais sans un fichier exemple on est un peu obligé de refaire le travail de préparation avant de proposer des solutions ! et il y a beaucoup de questions postées chaque jour. Donc tout le monde gagne du temps avec un classeur exemple sur lequel il est possible de travailler directement.
A bientôt
Désolé, voici donc un fichier exemple.
1er onglet, les données.
2ème onglet :
- colonnes A et B le TCD tel que je l'obtient
- colonnes E et F, ce que je veux obtenir automatiquement (soit une mise en forme du TCD que je ne sais pas faire, soit une macro qui permet de l'obtenir, idéalement quelque soit la forme du TCD (adaptable à tout TCD indépendamment du nombre de colonnes qui peut différer, ça, ce serait le top du top).
Merci beaucoup !!!
bonsoir
je ne vois pas trop où est le problème ou alors j'ai trop abusé de l'apéro estival !!! (ça peut arriver...)
créer un tcd
mettre le champ nom_enqueteur en champ de ligne
mettre le champ temps en champ de ligne par dessus le champ nom_enqueteur en plaçant le champ à droite
mais un TCD ne sert pas vraiment à ça, il suffirait de trier la base par nom enqueteur puis masquer les colonnes qu'on ne veut pas ou faire deux colonnes avec des formules de liaison
où est le problème ??? (à part mes mirettes qui ne voient peut être plus très clair ! la voiture reste au garage ce soir !)
amicalement
hips
re bonsoir,
Effectivement, l'exemple est ici sans doute mal choisi car les données sont déjà présentes dans le fichier de départ et il suffirait de trier et filtrer. Je l'ai fait rapidement car mon soucis partait du TCD généré..
Toutefois, c'est c'est peut-être moi qui ne vois pas très clair, car dans l'explication que vous donnez, soit je là lit mal, soit c'est exactement ce que j'ai fait pour obtenir mes colonnes A et B du 2ème onglet..... Et mon problème est que je voudrais un résultat tel que ce qui est affiché en colonnes E et F, avec les noms répétés à chaque ligne...
J'ai bidouiller quelques petites formules dans ce nouvel exemple qui me permet d'arriver à mes fins (3ème onglet).
Le soucis maintenant serait de créer une macro qui me permette d'arriver à ce résultat, mais quelque soit le nombre de lignes et de colonnes du TCD.... Le petit plus étant les bordures plus épaisses à chaque changement de la 1ère colonne.....
En tout cas, merci de vous pencher sur mon problème....
Cordialement....
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour à tous,
J'utilise des filtres élaborés plutôt que des TCD,
Ici, j'extrais directement des "Données" les 2 colonnes triées par dates et noms,
que veux-tu faire par la suite ?
Sub NouvBase()
Dim Lg%
'Macros par Claude Dubois pour "Kiriko" Excel-Pratique le 8 Août 2010
Application.ScreenUpdating = False
Sheets("Données").Activate
Lg = Range("A65536").End(xlUp).Row
With Sheets("Base")
.Columns(3).Insert
.Range("a1") = Range("i1") 'enquêteur
.Range("b1") = Range("g1") 'temps
.Range("c1") = Range("d1") 'date
'---- extrait ----
Range("a1:i" & Lg).AdvancedFilter Action:=xlFilterCopy, CopyToRange:= _
.Range("a1:c1"), Unique:=True
'---- tri par date et nom ----
.Range("a1:c" & Lg).Sort Key1:=.Range("a1"), Order1:=xlAscending, Key2:= _
.Range("c1"), Order2:=xlAscending, Header:=xlYes
.Columns(3).Delete
.Range("a:b").Columns.AutoFit
.Activate
End With
End Sub
Amicalement
Claude.
Merci beaucoup, cela pourra m'être utile...
Mais mon besoin est de réellement partir d'un Tcd, idéalement adaptable à n'importe quel Tcd quelque soit son nombre de lignes et de colonnes, pour arriver à ce résultat... Il est vrai que dans mon exemple, il est beaucoup plus pratique de passer par les données, mais cet exemple n'était que pour présenter un tcd simple rapidement, ma problématique part bien d'un tcd, que l'on me fourni souvent sans les données initiales (le créateur me passe un fichier ou il fait un copier/coller des valeurs de son Tcd, je n'ai donc pas les données)... Il faut donc faire "comme si" le 1er onglet de mon exemple n'était pas là.....
Merci de votre attention en tout cas!!!
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
Ok mais après, tu l'utilise ce TCD ?
Claude
Re,
Oui, j'en reçoit plusieurs de taille différentes, et je les transforme " à la main" pour obtenir le dernier onglet (le nom répété sur chaque ligne).
Comme tu peux voir, j'ai trouvé des formules qui me permettaient d'y arriver, mais je cherche une macro qui le ferait automatiquement quelque soit la taille du Tcd, avec des lignes plus épaisses à chaque changement de nom (Essai Tcd2).
Merci!!
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
Sub NouvBase()
Dim Lg%, i%
'Macros par Claude Dubois pour "Kiriko" Excel-Pratique le 8 Août 2010
Application.ScreenUpdating = False
Sheets("TCD").Activate
Lg = Range("A65536").End(xlUp).Row - 2
Range("a1:b" & Lg).Copy
With Sheets("Base")
.Range("a1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.Columns("b:b").NumberFormat = "[$-F400]h:mm:ss AM/PM"
.Range("a:b").Columns.AutoFit
.Activate
End With
For i = 2 To Lg
If Cells(i, 1) = "" Then
Cells(i, 1) = Cells(i - 1, 1)
Else
Range(Cells(i, 1), Cells(i, 2)) _
.Borders(xlEdgeTop).Weight = xlMedium
End If
Next i
With Range("a1:b" & Lg)
.Borders(xlEdgeLeft).Weight = xlMedium
.Borders(xlEdgeTop).Weight = xlMedium
.Borders(xlEdgeBottom).Weight = xlMedium
.Borders(xlEdgeRight).Weight = xlMedium
.Borders(xlInsideVertical).Weight = xlThin
End With
Range("a1").Select
End Sub
Amicalement
Claude
C'est royal !!!
Merci beaucoup !!!
Si tu peux éventuellement me donner le paramètre à modifier pour que le résultat se crée sur un nouvel onglet (ça me permettra de l'appliquer occasionnellement sur un vrai TCD, car ici, ta solution marche parfaitement dans l'exemple que je t'ai décrit, mais en cas de vrai TCD, on ne peut pas "coller par dessus"), ça serait super....
En tout les cas, ça me dépanne vraiment, mille mercis !!!!
Si le "défi" t'intéresse, mais cette fois, ce n'est vraiment pas urgent pour moi, d'autres ont peut-être plus besoin de tes lumières, le cas se présente rarement, une évolution de ta solution pourrait mettre utile:
Un bouton avec une boite de dialogue demandant sur combien des premières colonnes appliquer la "recopie".. Je m'explique : Quelquefois, j'ai en 1ère colonne les noms, puis en 2ème des dates ou autre, qui elles aussi ne sont pas répétées.
Je ne sais pas ce qui est plus simple : "détecter" toutes les colonnes où il n'y a pas répétition automatiquement, ou créer une boite de dialogue demandant à l'utilisateur sur combien de colonnes il veut appliquer la duplication des cellules vers le bas... Je met un nouvel exemple, c'est peut-être plus simple....
En tout cas, encore merci !!!!
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir,
Comme je disais + haut, je ne connais pas le fonctionnement des TCD,
mais si tu me dis que seule la dernière colonne est complète et que les précédentes
sont à compléter, alors oui on sait détecter sans boite de dialogue,
dans ton dernier exemple, les vides en A et B sont bien sur les mêmes lignes ?
confirme ?
Si tu peux éventuellement me donner le paramètre à modifier pour que le résultat se crée sur un nouvel onglet
on ne peut pas "coller par dessus"
développe, j'ai pas trop pigé ce point.
Claude
Re,
Merci encore de ton intérêt.
Oui, les vides en A et B sont sur les mêmes lignes, si j'ai bien compris la question.. Il peut arriver qu'il y ait dans la colonne B plusieurs "subdivisions" des noms en A. En gros, quelque soit la colonne, si une cellule est vide, il faut répéter ce qu'il y a dans la cellule supérieure...
Dans ta solution, le résultat se met en lieu et place du tableau existant, ce que je souhaitais, c'est qu'il se crée sur un nouvel onglet. En effet, dans le cas d'un vrai Tcd, on ne peut pas remplacer les cellules...
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
La feuille "Base" est pour moi temporaire,
à toi de la renommer comme tu veux après la macro
Sub NouvBase()
Dim Lg%, CL%, i%, A As Byte
'Macros par Claude Dubois pour "Kiriko" Excel-Pratique le 8 Août 2010
Application.ScreenUpdating = False
Sheets("TCD2").Activate
Lg = Range("A65536").End(xlUp).Row - 2
CL = Columns(200).End(xlToLeft).Column
Range(Cells(1, 1), Cells(Lg, CL)).Copy
With Sheets("Base")
.Range("a1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.Columns(CL).NumberFormat = "[$-F400]h:mm:ss AM/PM"
.Range("a:g").Columns.AutoFit
.Activate
End With
Range(Cells(1, 1), Cells(Lg, CL)).Borders.LineStyle = xlNone
'---- boucle sur toutes colonnes moins une ----
For A = 1 To CL - 1
For i = 2 To Lg
If Cells(i, A) = "" Then
Cells(i, A) = Cells(i - 1, A)
Else
Range(Cells(i, A), Cells(i, CL)) _
.Borders(xlEdgeTop).Weight = xlMedium
End If
Next i
Next A
'----
With Range(Cells(1, 1), Cells(Lg, CL))
.Borders(xlEdgeLeft).Weight = xlMedium
.Borders(xlEdgeTop).Weight = xlMedium
.Borders(xlEdgeBottom).Weight = xlMedium
.Borders(xlEdgeRight).Weight = xlMedium
.Borders(xlInsideVertical).Weight = xlThin
End With
Range("a1").Select
End Sub
Claude
Bonjour, désolé de la réponse tardive, qui pouvait être interprétée comme un manque de reconnaissance, ce n'est pas le cas...
Mille mercis, je teste ça dès que je récupère mon ordi (je poste depuis mon téléphone)....
J'espère me former à Vba et pouvoir aider à mon tour, je trouve le principe de ce forum d'entraide plus que louable....
Encore merci!!!