Automatisation de changement de mise en forme de tableau
Bonjour à tous!
Je reviens vers vous pour m'aider à trouver une macro d'automatisation de mise en forme de tableau.
je sais à quoi va ressembler mon tableau de départ et je sais à quoi il doit ressembler à la fin pour que je puisse l'exploiter ensuite avec une autre macro.
Le truc c'est que ce tableau va se composer de plusieurs centaines de lignes, du coup si je pouvais avoir une macro pour automatiser le processus de changement de mise en forme, je gagnerais beaucoup de temps et éviterais un boulot monstre de répétition.
J'arrête là les blablabla...... et vous joins un fichier avec en feuil1 mon tableau de départ et en feuil2 à quoi il doit ressembler après passage de la macro!!
UN GRAND MERCI d'avance pour le(s) coups de main(s)
Bonjour,
A tester.
Cdlt.
Option Explicit
Public Sub Decroisertableau()
Dim wss As Worksheet, wsd As Worksheet
Dim lastRow As Long, LastCol As Integer
Dim Lig As Long, i As Long, Col As Integer
Application.ScreenUpdating = False
Set wss = Worksheets("Feuil1")
Set wsd = Worksheets("Feuil2")
wsd.Cells.Clear
With wss
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
LastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
.Range(.Cells(1, 1), .Cells(1, LastCol)).Copy Destination:=wsd.Cells(1, 1)
Lig = 1
Col = wsd.Cells(1, Columns.Count).End(xlToLeft).Column + 1
For i = 2 To lastRow
If .Cells(i, 1) = .Cells(i - 1, 1) Then
.Range(.Cells(i, 2), .Cells(i, LastCol)).Copy Destination:=wsd.Cells(Lig, Col)
Else
Lig = Lig + 1
.Range(.Cells(i, 1), .Cells(i, LastCol)).Copy Destination:=wsd.Cells(Lig, 1)
End If
Col = wsd.Cells(Lig, Columns.Count).End(xlToLeft).Column + 1
Next
End With
Set wss = Nothing: Set wsd = Nothing
End Sub
Bonjour Jean Eric
Après test de votre code, tout est parfait
La macro réalise la modification de mise en forme du tableau, j'ai essayé de faire quelques modifications sur le tableau initial et pas de bug en vue!!
Donc un GRAND MERCI à vous pour votre temps passé sur mon problème, de bonne heure en plus^^
2 sujets postés en 2jours et 2 réponses efficaces de votre part, que demandé de plus??!!
Continuez ainsi et longue vie au forum excel-pratique
Si vous avez encore un peu de temps à me consacrer je veux bien que vous m'expliquiez votre macro et surtout sa logique, je suis novice en vba mais j'aimerais bien progresser..... Merci
Bonne journée à vous
Re,
A te relire, si ce n'est pas suffisant.
Cdlt.
Option Explicit
Public Sub Decroisertableau()
' déclaration de toutes les variables (obligatoire avec Option explicit)
Dim wss As Worksheet, wsd As Worksheet
Dim lastRow As Long, LastCol As Integer
Dim Lig As Long, i As Long, Col As Integer
Application.ScreenUpdating = False
' initialisation des variables objets.
Set wss = Worksheets("Feuil1") ' Source.
Set wsd = Worksheets("Feuil2") ' Destination.
' suppression des données
wsd.Cells.Clear
With wss ' Source
' dernière ligne non vide de la colonne 1 de la feuille source.
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
' dernière colonne de la ligne 1 de la feuille source.
LastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
' copie la première ligne de la feuille source dans la feuille destination
' (A1 ou Cells(1,1)).
.Range(.Cells(1, 1), .Cells(1, LastCol)).Copy Destination:=wsd.Cells(1, 1)
Lig = 1
' dernière colonne de la ligne 1 de la feuille destination.
Col = wsd.Cells(1, Columns.Count).End(xlToLeft).Column
For i = 2 To lastRow ' source
' Nota : dans l'exemple les données sont triées par nom de villes.
' Si A2 = A1 de la feuille source
If .Cells(i, 1) = .Cells(i - 1, 1) Then
' on copie la ligne 2 de la feuille source dans la dernière colonne + 1
' de la feuille destination (sans le nom de ville).
.Range(.Cells(i, 2), .Cells(i, LastCol)).Copy Destination:=wsd.Cells(Lig, Col + 1)
Else
' Sinon, on copie les données de la feuille source dans une nouvelle ligne de
' la feuille destination.
Lig = Lig + 1
.Range(.Cells(i, 1), .Cells(i, LastCol)).Copy Destination:=wsd.Cells(Lig, 1)
End If
' dernière colonne de la ligne 1 de la feuille destination pour les prochaines copies.
Col = wsd.Cells(Lig, Columns.Count).End(xlToLeft).Column
' prochaine ligne de la feuille source
Next
End With
'RAZ des variables objets.
Set wss = Nothing: Set wsd = Nothing
End Sub
Re,
Merci pour les explications, je vais pouvoir progresser et comprendre comment vous avez abordé le problème et le résoudre surtout!
Merci encore.
Et je reviendrais vers vous si besoin
Cordialement
Bonjour,
Je cherche a faire à peu pres le chemin inverse que le tableau expliqué ici, Auriez vous un coup de main à prêter?
J'explique dans le fichier joint le chemin rechercher....
Mettre en forme des données mensuelle sur colonne en données mensuel par ligne....
Merci d'avance...
Bonjour à tous
Je veux travailler sur le même principe mais sans prendre les 2 colonnes ( fonction et niveau )
mercii
Bonsoir supzak!
Tout d'abord, il est conseillé d'éviter de poster à la suite d'un sujet existant, un nouveau sujet..... il faut mieux ouvrir ton propre, tu auras plus de chance d'avoir des réponses!! (d'après ce que j'ai pu comprendre^^ )
De plus, mieux vaut privilégier les fichiers au format (.xls) pour que le maximum de personnes puisse ouvrir et consulter ton fichier
En ce qui concerne, ta question je ne suis pas sûr de tout comprendre?? Que cherches tu exactement?
Si tu veux obtenir la même chose que pour moi mais avec les colonnes B et C en moins pas de soucis de code, celui-ci ne tient pas compte des références de colonnes mais juste celles qui sont remplies ou pas... du coup pour ton fichier, il suffit de supprimer les colonnes qui ne t'intéressent pas et lancer la macro de mon fichier!!
En espérant ayant répondu à ta problématique!!
Bonne soirée
Bonjour samsam
Merci pour les informations
je veux la meme resultats quoi toi mais sans suprimer les colonnes qui m'interesse pas
c'est a dire je veux preciser les colonnes ou je veux travailler dans le code
merci ^_^
Bonjour,
Salut samsam07
@ Supzak,
Tu crées un nouveau sujet avec une question pertinente et tu joins un fichier pertinent.
Avec le résultat escompté
Cdlt.