Macro de Remplacement/Tri non fonctionnelle
Bonjour,
Après plusieurs recherches et beaucoup de tests, me voici avec une demande un peu particulière, enfin, un problème un peu particulier...
Je dispose d'une colonne avec une multitude de cellules qui sont remplies de la façon suivante : "jj-mm-aaaa hh:mm:ss CEST"
Je dois me séparer de " CEST" dans toutes les cellules.
Puis changer le format "jj-mm-aaaa hh:mm:ss" en "jj/mm/aaaa hh:mm:ss".
Et enfin les trier du plus récent au plus ancien.
Cependant, tout ce passe bien quand je fais ces étapes à la main, mais comme je dois répéter cette action très fréquemment, j'ai décidé d'enregistrer une macro qui aurait pour objectif d'automatiser cette tâche.
Et il se trouve que la macro fait absolument tout de travers..
Les fichiers attachés sont l'exemple concret du problème :
En 1 : la liste que je possède de base. ->
En 2 : la liste traitée après les actions que je fais à la main. ->
En 3 : la liste traitée par la macro qui fait exactement la même chose que ce que je fais à la main, et dans le même ordre. ->
Évidemment, voici le code de la macro :
Sub Exemple()
'
' Exemple Macro
'
'
Columns("A:A").Select
selection.NumberFormat = "dd/mm/yyyy hh:mm:ss"
selection.replace What:="~ CEST", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
With selection
.HorizontalAlignment = xlCenter
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Columns("A:A").EntireColumn.AutoFit
End SubMerci pour votre lecture,
Cordialement.
EDIT : Planté dans l'upload de "2.xls", c'est corrigé.
Bonjour
En utilisant une colonne supplémentaire
Sub Exemple()
With Range("B1:B" & Range("A" & Rows.Count).End(xlUp).Row)
.Clear
.NumberFormat = "dd/mm/yyyy hh:mm:ss"
.FormulaLocal = "=DATE(STXT(A1;7;4)*1; STXT(A1;4;2) *1; GAUCHE(A1;2) *1) + TEMPSVAL(STXT(A1;11;9))"
.Value = .Value
.Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
.Copy Range("A1")
.Clear
End With
End SubBonjour,
Ça fonctionne à merveille, merci beaucoup !
EDIT : Oups, j'ai oublié de préciser que le tri descendant que j'effectue, il faudrait qu'il soit "étendu" vu qu'il n'y à pas que cette colonne dans le classeur où j'effectue ces opérations, et je dois avouer que la syntaxe vba dans laquelle je viens tout juste d'arriver me perturbe un peu..
Cordialement.
Bonjour
J'ai fait avec les infos que tu as fourni
Et toujours sans filet
Sub Exemple()
Dim NbLg As Long
NbLg = Range("A" & Rows.Count).End(xlUp).Row
' Colonne à choisir
With Range("Z1:Z" & NbLg)
.Clear
.NumberFormat = "dd/mm/yyyy hh:mm:ss"
.FormulaLocal = "=DATE(STXT(A1;7;4)*1; STXT(A1;4;2) *1; GAUCHE(A1;2) *1) + TEMPSVAL(STXT(A1;11;9))"
.Value = .Value
.Copy Range("A1")
.Clear
End With
' Zone de tri à définir
Range("A1:H" & NbLg).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End SubBonjour,
Désolé pour le temps de réponse, et aussi pour les informations manquantes, j'aurai dû préciser que je souhaitais faire un tri étendu dans mon premier post.
Voici le code de ma macro actuellement :
Sub Macro()
'
Range("A:A,E:H,J:AD").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("D:D").ColumnWidth = 25
Columns("D:D").EntireColumn.AutoFit
Columns("C:C").EntireColumn.AutoFit
Selection.ColumnWidth = 35
Range("A:A,E:H,J:AD").EntireColumn.AutoFit
'
Columns("B:B").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
With Range("B1:B" & Range("A" & Rows.Count).End(xlUp).Row)
.Clear
.NumberFormat = "dd/mm/yyyy hh:mm:ss"
.FormulaLocal = "=DATE(STXT(A1;7;4)*1; STXT(A1;4;2) *1; GAUCHE(A1;2) *1) + TEMPSVAL(STXT(A1;11;9))"
.Value = .Value
.Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
.Copy Range("A1")
.Clear
End With
Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
End SubJ'ai 4 colonnes, j'en ajoute une pour le traitement des dates que je supprime juste après, et j'aimerai que toutes les lignes soient triés du plus récent au plus ancien en fonction de la colonne des dates fraichement crée en A.
J'essaie de modifier le code afin que la colonne A soit triée du plus récent au plus ancien avec les colonnes B C et D, mais en vain.
Cordialement.
Bonjour
Ton fichier aurait plus simple
Sub Exemple()
Dim NbLg As Long
NbLg = Range("A" & Rows.Count).End(xlUp).Row
Range("A:A,E:H,J:AD").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("D:D").ColumnWidth = 25
Columns("D:D").EntireColumn.AutoFit
Columns("C:C").EntireColumn.AutoFit
Selection.ColumnWidth = 35
Range("A:A,E:H,J:AD").EntireColumn.AutoFit
Columns("A").Insert
With Range("A1:A" & NbLg)
.NumberFormat = "dd/mm/yyyy hh:mm:ss"
.FormulaLocal = "=DATE(STXT(B1;7;4)*1; STXT(B1;4;2) *1; GAUCHE(B1;2) *1) + TEMPSVAL(STXT(B1;11;9))"
.Value = .Value
.Copy Range("B1")
End With
Columns("A").Delete
Range("A1:D" & NbLg).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End SubMerci beaucoup, ça fonctionne à merveille !
Le VBA n'est pas vraiment évident, surtout au début, mais je commence à comprendre comment ça marche.
J'ai encore un petit soucis, j'aimerai utiliser l'auto remplissage dans une macro, mais je n'arrive pas à en faire une macro générique..
Je m'explique :
Quand je fais un auto remplissage en enregistrant une macro, il l'enregistre de la façon suivante :
Selection.AutoFill Destination:=Range("D2:D1242")
Range("D2:D1242").SelectCependant, ce n'est pas générique puisque je peux très bien avoir des fichiers plus grands, ou plus petits lors d'utilisations ultérieures.
Je cherche donc un moyen de faire un Selection.AutoFill avec la range de la colonne précédente, à savoir C2 jusqu'à la fin, mais pas moyen de trouver une syntaxe qui compile.
Je te remercie pour ton aide et ta patience en tout cas !
Bonjour
A tester
Sub test()
Range("D2") = "Hello"
Range("D2").AutoFill Destination:=Range("D2:D" & Range("C" & Rows.Count).End(xlUp).Row)
End Sub