IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Modification d'une chaine en date en gardant le même format


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 3
    Par défaut Modification d'une chaine en date en gardant le même format
    Bonjour à tous,

    J'ai un classeur contenant des dates, dont certaines étaient inconnus au moment de la saisie initial et se trouve sous le format "(XX/02/2017)" par exemple, avec deux "X" à la place du jour. J'ai donc écris une macro permettant de supprimer les parenthèses, et de changer les "X" en jours (XX ou 0X changé en 01, 1X changé en 15 et 2X changé en 30) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    For i = 2 To 10561
        test = ThisWorkbook.Sheets("PLA-PLANNING").Cells(i, 8)
        x = InStr(1, test, "(", 1)
        y = InStr(1, test, ")", 1)
     
        If Left(test, 3) = "(1X" Then
            test = Replace(test, "1X", "15")
        End If
        If Left(test, 3) = "(2X" Then
            test = Replace(test, "2X", "30")
        End If
        If Left(test, 3) = "(0X" Then
            test = Replace(test, "0X", "01")
        End If
        If Left(test, 3) = "(XX" Then
            test = Replace(test, "XX", "01")
        End If
     
        If x <> 0 Then
            test = Replace(test, "(", "")
            test = Replace(test, ")", "")
        End If
     
        ThisWorkbook.Sheets("PLA-PLANNING").Cells(i, 8) = test
     
    Next i
    Aucun beug, elle fonctionne comme je veux à une exception près : lors de la réécriture dans la cellule, si le jour a été remplacé par "01", il est interverti avec le mois. Concrètement, une date à la base "(XX/02/2017)" ou "(0X/02/2017)" sera remplacé par 02/01/2017, au lieu de 01/02/2017 sans que je comprenne pourquoi ... Savez vous comment éviter ça ?

    Merci d'avance pour votre aide !

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Bbibus, bonjour le forum,

    Peut-être comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Sub Macro1()
    Dim D As Long
     
    For I = 2 To 10561
        test = ThisWorkbook.Sheets("PLA-PLANNING").Cells(I, 8)
        x = InStr(1, test, "(", 1)
        y = InStr(1, test, ")", 1)
        If Left(test, 3) = "(1X" Then
            test = Replace(test, "1X", "15")
        End If
        If Left(test, 3) = "(2X" Then
            test = Replace(test, "2X", "30")
        End If
        If Left(test, 3) = "(0X" Then
            test = Replace(test, "0X", "01")
        End If
        If Left(test, 3) = "(XX" Then
            test = Replace(test, "XX", "01")
        End If
        If x <> 0 Then
            test = Replace(test, "(", "")
            test = Replace(test, ")", "")
        End If
        D = DateSerial(Year(test), Month(test), Day(test))
        ThisWorkbook.Sheets("PLA-PLANNING").Cells(I, 8).NumberFormat = "dd/mm/yyy"
        ThisWorkbook.Sheets("PLA-PLANNING").Cells(I, 8) = D
    Next I
    End Sub

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Si (et seulement si) j'ai bien compris ce que veut faire ton code, voici comment je l'écrirais, entre autres manières possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Dim test As String, x As Integer, k As Long
    With ThisWorkbook.Sheets("PLA-PLANNING")
      For k = 2 To 10561
         test = .Cells(k, 8).Text
         x = InStr(1, test, "(", 1)
         If InStr(1, test, "(", 1) > 0 Then
           Select Case Left(test, 3)
             Case "(1X": Mid(test, 1, 3) = "(15"
             Case "(2X": Mid(test, 1, 3) = "(30"
             Case "(0X": Mid(test, 1, 3) = "(01"
             Case "(XX": Mid(test, 1, 3) = "(01"
           End Select
           test = Replace(test, ")", "")
           test = Replace(test, "(", "")
           .Cells(k, 8).Value = CDate(test)
         End If
      Next
    observe bien la propriété text est utilisée à la lecture (pour éviter toute ambiguïté si formule) et la propriété Value à l'écriture

    EDIT : attends, là : Tu remplaces par "(01" dans deux cas -->> tu peux donc mettre les 2 sur une seule ligne
    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Case "(0X": Mid(test, 1, 3) = "(01"
     Case "(XX": Mid(test, 1, 3) = "(01"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Case "(0X", "(XX": Mid(test, 1, 3) = "(01"

Discussions similaires

  1. conversion d'une chaine en date
    Par monphp dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/05/2007, 10h29
  2. convertir une chaine en date dans ma page asp
    Par shirya dans le forum ASP.NET
    Réponses: 8
    Dernier message: 15/03/2007, 21h07
  3. convertir une chaine en date
    Par imane_bennouna dans le forum Langage
    Réponses: 13
    Dernier message: 22/09/2006, 19h58
  4. [vb.net]Formater une chaine en date
    Par Dnx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/10/2005, 12h40
  5. Réponses: 1
    Dernier message: 08/03/2004, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo