1
votes

Remplacer le reformatage de la cellule Excel VBA

J'ai un grand nombre de feuilles Excel avec une colonne de date sous la forme "jj-mm-aaaa". J'ai besoin de trier les lignes par date dans cette colonne de date. Manuellement, si je sélectionne la colonne et remplace tout "-" par "/", Excel formate automatiquement les cellules de date de "Général" à un format numérique "Date" afin qu'elles puissent être facilement triées. Plus précisément, il s'agit du "* jj / mm / aaaa" puisque je suis en Australie.

Cependant, lorsque j'ai enregistré la macro, cela ressemble à ceci:

For x = 13 To 134
Cells(x, 4) = "X" & Cells(x, 4)
Next x

Range("D13:D134").Replace What:="-", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

For x = 13 To 134
Range("D" + CStr(x)) = Right(Range("D" + CStr(x)), Len(Range("D" + CStr(x))) - 1)
Next x

Quand je lance la macro:

  • Si la date a un jour 12 ou moins, il retourne les champs jour et mois et change le format des nombres en Date

  • Sinon, il laisse le format numérique comme général.

Avant:  BEFORE Après:  APRÈS J'ai essayé de définir ReplaceFormat avec:

Worksheets("Worksheet").Range("A1").NumberFormat = "d/mm/yyyy"
Application.ReplaceFormat.NumberFormat = "d/mm/yyyy"

Range("D13:D134").Replace What:="-", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True

Maintenant, toutes les cellules ont un format numérique de date mais ne peuvent toujours pas être triées en ordre croissant (seule l'option AZ est disponible) et il y a toujours le même problème avec l'échange des champs de date et de mois sur certaines cellules.

J'ai même essayé d'ajouter un X au début de la cellule pour qu'elle reste un format général lors du remplacement. Puis retirez le X après. Même résultat.

Range("D13:D134").Replace What:="-", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False


0 commentaires

3 Réponses :


0
votes

VBA n'est pas nécessaire pour cela! Vous pouvez fixer les dates en 2 étapes à l'aide de la fonctionnalité Excel.

Vous devez d'abord délimiter les données:

  1. Mettez vos dates en surbrillance
  2. Accédez à l'onglet "Données" -> Cliquez sur "Texte dans les colonnes" dans la section Outils de données
  3. Dans la fenêtre contextuelle, sélectionnez "Délimité", puis cliquez sur Suivant
  4. Sous "Délimiteurs", désélectionnez "Tabulation" et sélectionnez "Autre". Tapez - dans la case puis cliquez sur Suivant
  5. Choisissez une cellule de destination à côté de vos données afin qu'elle ne soit pas écrasée. Cliquez sur Terminer

Deuxièmement, utilisez les données délimitées pour créer des dates Excel appropriées Vous pouvez utiliser la formule suivante pour obtenir une date à partir de vos données délimitées: = DATE ([cellule avec année], [cellule avec mois], [cellule avec jour])


1 commentaires

Merci mais je voulais utiliser VBA pour automatiser le processus car j'ai environ 3000 feuilles. Je vois encore comment j'aurais pu utiliser cette réponse pour m'y amener, mais quelqu'un d'autre l'a parfaitement résolue.



0
votes

Un problème de date
Sub DateProblem()

    Const cStrSheet As String = "Sheet1"
    Const cStrRange As String = "D13:D134"
    Const cStrCell As String = "E13"

    Dim vntS As Variant
    Dim vntT As Variant
    Dim i As Long

    vntS = Worksheets(cStrSheet).Range(cStrRange)
    ReDim vntT(1 To UBound(vntS), 1 To 1) As Date

    For i = 1 To UBound(vntS)
        vntT(i, 1) = DateSerial( _
                Right(vntS(i, 1), 4), _
                Mid(vntS(i, 1), 4, 2), _
                Left(vntS(i, 1), 2))
    Next

    With Worksheets(cStrSheet).Range(cStrCell)
        .Resize(UBound(vntT), UBound(vntT, 2)) = vntT
    End With

End Sub


0 commentaires

2
votes

Cela fonctionne-t-il pour vous?

On Error Resume Next
For x = 13 To 134
    If Range("D" & x) <> "" Then
        Range("D" & x) = CDate(Range("D" & x).Value)
    End If
Next x
On Error GoTo 0


0 commentaires