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 :

VBA pour remplacer . par une ,


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2017
    Messages : 65
    Par défaut VBA pour remplacer . par une ,
    Bonjour,

    Je cherche dans une liste de données dont voici la capture
    Nom : Capture.JPG
Affichages : 1051
Taille : 56,7 Ko

    à remplacer dans un premier temps les points de la colonne C en virgule. Je suis passé par un enregistreur de macro mais quand j’exécute celui la j'ai le format suivant 29.60659 => 2 960 659 au lieu d'avoir 29,60659 comme si l'enregistreur considérait que la virgule est une séparation pour les milliers/millions. Quel code puis-je utiliser pour ne pas avoir ce problème.

    Deuxième manip à faire dans la colonne B pour avoir un affichage en heure sous la forme hh:mm:ss en supprimant le .000

    Dernière manip a faire pour la colonne A, dans un premier temps avec l'enregistreur je remplace les points par des / et la y'a pas de soucis. Le problème c'est qu'un espace vide est intercalé à chaque fois et donc Excel ne me considère pas les cellules comme étant bien définies pour que ça soit une date. Pareil j'ai fait avec l'enregistreur mais la ça me décaler le jour avec les mois --"

    Voilà le résultat en passant par l'enregistreur sur les colonnes A et C :
    Nom : Capture2.JPG
Affichages : 992
Taille : 66,0 Ko




    EDIT : j'ai trouvé le premier problème il suffit de changer dans l'enregistreur la "," par un "." très bizarre d'ailleurs ... et via l'enregistreur de remplacer ".000" par "" marche aussi donc ça va ! Restes la dernière partie avec le changement de date pour l'espace....
    Images attachées Images attachées  

  2. #2
    Membre averti Avatar de Roiser
    Homme Profil pro
    Etudiant - MIAGE
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Etudiant - MIAGE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Par défaut
    Salut ,

    Je ne sais pas comment tu parcours ta plage mais voici pour transformer ta colonne A en date ( a toi de l'insérer dans ton code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim DateAC() As String
    DateAc = Split(TaCellule, ".")
    TaCellule = DateSerial(Val(DateAc(2)), Val(DateAc(1)), Val(DateAc(0)))
    En espérant que ça t'aide !

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Exemple pour la plage A2:A1000 de la feuille nommée Feuil1 du classeur où se trouve le code VBA
    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
    Sub Text2Date()
     Dim rngData As Range
     Dim Elem As Long, tblData(), SplitDate() As String
     Set rngData = ThisWorkbook.Worksheets("Feuil1").Range("A2:A1000")
     tblData = rngData.Value
     For Elem = 1 To UBound(tblData)
       SplitDate = Split(tblData(Elem, 1), ".")
       If UBound(SplitDate) <> 3 Then MsgBox "Problème" & vbCrLf & "Sortie de procédure": Exit For
       tblData(Elem, 1) = DateSerial(SplitDate(2), SplitDate(1), SplitDate(0))
     Next
     With rngData
     .Value = tblData
     .NumberFormat = "dd/mm/yyyy"
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2017
    Messages : 65
    Par défaut
    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
    Sub Text2Date()
     Dim rngData As Range
     Dim Elem As Long, tblData(), SplitDate() As String
     Set rngData = ThisWorkbook.Worksheets("Données brutes").Range("H5:H10000")
     tblData = rngData.Value
     For Elem = 1 To UBound(tblData)
       SplitDate = Split(tblData(Elem, 1), ".")
       If UBound(SplitDate) <> 3 Then MsgBox "Problème" & vbCrLf & "Sortie de procédure": Exit For
       tblData(Elem, 1) = DateSerial(SplitDate(2), SplitDate(1), SplitDate(0))
     Next
     With rngData
     .Value = tblData
     .NumberFormat = "dd/mm/yyyy"
     End With
    End Sub
    J'ai adapté pour ma plage de données, par contre quand j’exécute la macro y'a marqué problème sortie procédure (?)

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai adapté pour ma plage de données, par contre quand j’exécute la macro y'a marqué problème sortie procédure (?)
    C'est le message que j'ai prévu pour éviter des catastrophes.
    Cela signifie que la chaîne de caractères n'a pas été divisée en 3 parties. Il est possible que le séparateur ne soit pas un point.
    Si c'est le cas (par exemple le séparateur est une virgule) alors il faut modifier l'instruction ci-dessous en modifiant le 2ème argument de la fonction Split en lui mettant la virgule au lieu du point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SplitDate = Split(tblData(Elem, 1), ".")
    Autre possibilité la chaîne de caractères aurait plus de deux points de séparation comme par exemple .02.07.2017 ce qui donnerait quatre parties.

    [EDIT]
    Je viens de constater que la fin de cette ligne doit être Exit Sub au lieu de Exit For mais cela ne change rien au problème précité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If UBound(SplitDate) <> 3 Then MsgBox "Problème" & vbCrLf & "Sortie de procédure": Exit Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2017
    Messages : 65
    Par défaut
    Même en mettant une virgule à la place du point j'ai le même message :/
    J'ai changer le Exit For.

    Tu as une autre idée du coup ?

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu as une autre idée du coup ?
    Non
    Il faut analyser la nature de la cellule contenant la date. Est-ce réellement une chaîne de caractères ?
    Tu dois analyser ces cellules pour savoir quelles propriétés elles ont. Voir du coté des fonction d'information ESTTEXTE, ESTNUM
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2017
    Messages : 65
    Par défaut
    La fonction ESTTEXTE renvoie vrai pour la cellule ou y'a la date et la fonction ESTNUM renvoie faux.

    Ce que je comprend pas c'est que quand je fais manuellement remplacer les . par des / puis remplacer l'espace par sans espace ça marche. Et si je fais exactement la même manip via un enregistrement ça m'inverse le 02 et le 07

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction ESTTEXTE renvoie vrai pour la cellule ou y'a la date et la fonction ESTNUM renvoie faux
    As-tu contrôler l'ensemble des cellules de la colonne ?
    La procédure que j'ai écrite doit fonctionner si la cellule contient bien un texte que les données de la date (jour, mois et année) sont bien séparées par le signe de séparation indiqué dans le deuxième argument de la fonction Split (point ou virgule ou autres) ET qu'il y a bien deux séparateurs (pas trois, ni un).
    Et bien entendu la cellule de la première ligne jusqu'à la dernière doit répondre aux mêmes critères mais je suppose que je ne dois pas le préciser.

    Ce que je comprend pas c'est que quand je fais manuellement remplacer les . par des / puis remplacer l'espace par sans espace ça marche. Et si je fais exactement la même manip via un enregistrement ça m'inverse le 02 et le 07
    VBA travaille avec les normes anglaise (américaine) alors que manuellement tu travailles selon ton profil donc il y a inversion des mois et jours avec VBA

    Alors s'il y a des espaces en plus, il faudrait ajouter la fonction Trim à chaque élément de la table soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tblData(Elem, 1) = DateSerial(Trim(SplitDate(2)), Trim(SplitDate(1)), trim(SplitDate(0)))
    [EDIT]
    Bon, erreur de ma part ce n'est pas 3 mais 2 (0 à 2) pour le contrôle de Ubound(SplitDate) (ligne 8). Procédure testée
    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
    Sub Text2Date()
     Dim rngData As Range
     Dim Elem As Long, tblData(), SplitDate() As String
     Set rngData = ThisWorkbook.Worksheets("feuil6").Range("A2:A23")
     tblData = rngData.Value
     For Elem = 1 To UBound(tblData)
       SplitDate = Split(tblData(Elem, 1), ",")
       If UBound(SplitDate) <> 2 Then MsgBox "Problème" & vbCrLf & "Sortie de procédure": Exit Sub
       tblData(Elem, 1) = DateSerial(Trim(SplitDate(2)), Trim(SplitDate(1)), Trim(SplitDate(0)))
     Next
     With rngData
     .Value = tblData
     .NumberFormat = "dd/mm/yyyy"
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2017
    Messages : 65
    Par défaut
    Même soucis que précédemment erreur sortie de procédure. Sachant que j'ai tester sur seulement 10 cellules et que les données sont toutes extraites via le même logiciel et du même enregistrement du coup elles sont toutes identiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Macro8()
    Columns("H:H").Select
        Selection.Replace What:=":", Replacement:="/", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    End Sub
    Si j'utilise ce code pour une date initialement 26:07:2017 y'a pas de soucis, j'ai l'impression que le soucis vient de si jamais les deux premiers chiffres sont inférieurs aux aux suivant ... ça peut peut-être nous donner une idée pour contourner le problème ?

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    autre proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
        Dim datas, lig, dat As Date
        datas = [A2:A10].Value
        For lig = 1 To UBound(datas)
            On Error GoTo suite
            datas(lig, 1) = DateValue(Replace(datas(lig, 1), ".", "/"))
    suite:
            On Error GoTo -1
        Next lig
        [A2:A10].Resize(UBound(datas, 1)).Value = datas
    End Sub
    eric

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2017
    Messages : 65
    Par défaut
    Héhé et bien ça marche !!!! TOP !

    Est-ce que je peux juste avoir une petite explication de quelle ligne fait quoi et pourquoi ça marche ?

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    le plus important est DateValue :
    Si l'argument date est une chaîne composée uniquement de nombres séparés par des séparateurs de dates valides, la fonction DateValue associe ces valeurs au mois, au jour et à l'année selon le format Date courte que vous avez défini pour votre système. DateValue reconnaît également les dates non ambiguës contenant des noms de mois sous forme complète ou abrégée. Par exemple, DateValue reconnaît non seulement 30/12/1991 et 30/12/91, mais aussi 30 décembre 1991 et 30-déc-1991.
    avec un traitement d'erreur pour passer les données non convertibles (chaine vide par exemple)

    Le reste n'est là que pour lire/écrire les données en une seule fois (tableau datas en mémoire) plutôt que cellule par cellule qui est plus lent.
    eric

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Pour les dates, j'utilise le menu Données > Convertir
    Nul besoin de boucler

    Tu peux tester comme ceci (et utiliser l'enregistreur pour le code)
    * Sélectionne ta plage
    * Vas dans le menu Données > Convertir
    * Clique 2 fois Suivant
    * Dans la boîte à côté de Date, choisis le format actuel des dates avec points
    Dans ton cas, j'imagine que c'est 2 juillet, alors choisis JMA (jour-mois-année)
    * Clique Terminer

    Attention toutefois de ne pas répéter cette action une fois les dates converties... ça pourrait reconvertir les dates...
    On peut toujours vérifier s'il y a des points avant de faire la conversion.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 10/03/2014, 20h40
  2. Probléme pour remplacer = dans une variable
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 18
    Dernier message: 05/06/2007, 14h37
  3. extraire une chaine et remplacer par une autre
    Par D.Mounir dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/06/2007, 21h04
  4. Police remplacée par une autre
    Par unreal2me dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 03/02/2007, 00h50
  5. Réponses: 7
    Dernier message: 21/09/2006, 15h06

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