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. ->

151.zip (51.31 Ko)

En 2 : la liste traitée après les actions que je fais à la main. ->

82.zip (50.01 Ko)

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. ->

103.zip (51.79 Ko)

É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 Sub

Merci 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 Sub

Bonjour,

Ç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 Sub

Bonjour,

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 Sub

J'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 Sub

Merci 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").Select

Cependant, 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
Rechercher des sujets similaires à "macro remplacement tri fonctionnelle"