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 :

Automatisation d'une fonction [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut Automatisation d'une fonction
    Bonjour,

    Étant débutant en VBA, je me permets de venir vers vous au sujet d'un problème que je rencontre.

    J'extrait chaque jours différentes lignes qui ressemblent à cela, ces lignes sont différentes chaque jours :

    0.18M of {KFW 2.625 16/08/2019 Corp allq <go>} / -0.56 YtM
    0.345M of {KFW 0.875 18/03/2019 Corp allq <go>} / -0.643 YtM
    0.21M of {KFW 1.125 15/01/2020 Corp allq <go>} / -0.531 YtM
    Mon problème est le suivant, je souhaiterais créer une macro me permettant de conserver ces lignes mais modifier le format de la date en anglais.

    Que je puisse, à l'aide d'un bouton click, obtenir ceci :

    0.18M of {KFW 2.625 08/16/2019 Corp allq <go>} / -0.56 YtM
    0.345M of {KFW 0.875 03/18/2019 Corp allq <go>} / -0.643 YtM
    0.21M of {KFW 1.125 01/15/2020 Corp allq <go>} / -0.531 YtM
    Un ami m'a donc donné ce code mais je n'arrive pas à l'automatiser :

    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
    Function ModifChaineDate_ENFormat(strToModif As String, strRepere As String, dteLen As Integer, dteFormat As String) As String
     
        ''
        '
        '
        'Modifie la date dans la chaine de caractère et retourner la chaine
     
        Dim OldCh As String, NewCh As String
        Dim startD, endD, lenCh, dte
     
        OldCh = strToModif
        lenCh = Len(strToModif)
     
        startD = InStr(1, OldCh, strRepere, vbTextCompare) - dteLen - 1 'Moins 1 pour l'espace
        endD = InStr(1, OldCh, strRepere, vbTextCompare) - 2
        dte = Mid(OldCh, startD, dteLen)
        dte = VBA.Format(dte, dteFormat)
     
        NewCh = Left(OldCh, startD - 1) & dte & Right(OldCh, lenCh - endD)
     
     
        ModifChaineDate_ENFormat = NewCh
     
    End Function
    Cependant, je n'arrive pas à automatiser cette macro.
    Il faudrait que les données que j'extrait en colonne W apparaissent automatiquement en colonne X avec le bon format de date ?
    J'ai de multiple ligne, l'idéal serait que la macro tourne jusqu'à que la prochaine ligne soit vide.

    J'espère que quelqu'un pourra m'aider...

    Je vous remercie, à bientôt

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Une piste, exécuter la Sub "Test" :
    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
    29
    30
    31
     
    Sub Test()
     
        Dim Tbl(1 To 3) As String
        Dim i As Integer
     
        Tbl(1) = "0.18M of {KFW 2.625 16/08/2019 Corp allq <go>} / -0.56 YtM"
        Tbl(2) = "0.345M of {KFW 0.875 18/03/2019 Corp allq <go>} / -0.643 YtM"
        Tbl(3) = "0.21M of {KFW 1.125 15/01/2020 Corp allq <go>} / -0.531 YtM"
     
        For i = 1 To 3: MsgBox Inverser(Tbl(i)): Next i
     
    End Sub
     
    Function Inverser(Chaine As String) As String
     
        Dim T
        Dim A As String
        Dim B As String
        Dim C As String
     
        T = Split(Chaine, "/")
        A = Format(Right(T(0), 2), "00")
        B = Format(T(1), "00")
        C = Left(T(2), 4)
     
        T = Split(Chaine, CDate(B & "/" & A & "/" & C))
     
        Inverser = T(0) & B & "/" & A & "/" & C & T(1)
     
    End Function

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Snooz, Bonjour le Forum,

    Salut THEZE, ravi de te retrouver.

    Une piste plus "triviale"
    Utiliser la méthode de chaîne de caractèreEn fonction de la position trouvée du caractère délimiteur de date "/",
    - calculer la date au bon format
    - reconstituer la chaîne de caractères.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Hello Marcel !

    Heureux de te lire (mais je suis aussi tes différents messages d'intervention !)
    Une piste plus "triviale"
    Utiliser la méthode de chaîne de caractère
    effectivement avec Instr() et InstrRev() mais aussi avec bien d'autres façons de faire

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut Theze,

    J'attends un peu pour livrer le code. Le temps que notre ami Snooz se manifeste.
    Mais rien de bien compliqué.

    A plus Theze

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour vos réponses et désolé pour le retard.. La grippe m'a eu

    J'ai essayé avec cela :

    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
    Function ModifChaineDate_ENFormat(strToModif As String, strRepere As String, dteLen As Integer, dteFormat As String) As String
     
                                        ''
                                        '
                                        '
                                        '
                                        'Modifie la date dans la chaine de caractère et retourner la chaine
     
                                        Dim OldCh As String, NewCh As String
                                        Dim startD, endD, lenCh, dte
     
                                        OldCh = strToModif
                                        lenCh = Len(strToModif)
     
                                        startD = InStr(1, OldCh, strRepere, vbTextCompare) - dteLen - 1 'Moins 1 pour l'espace
                                        endD = InStr(1, OldCh, strRepere, vbTextCompare) - 2
                                        dte = Mid(OldCh, startD, dteLen)
                                        dte = VBA.Format(dte, dteFormat)
     
                                        NewCh = Left(OldCh, startD - 1) & dte & Right(OldCh, lenCh - endD)
     
     
                                        ModifChaineDate_ENFormat = NewCh
     
    End Function
    Qui semble fonctionner avec une procédure test, seulement je n'arrive pas à l'automatiser...

    Je recupère les données dans la colonne W sous cette forme :

    0.18M of {KFW 2.625 16/08/2019 Corp allq <go>} / -0.56 YtM

    Et souhaiterais récupérer le résultat en colonne X.

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Essaies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function ModifChaineDate_ENFormat(strToModif As String) As String
    ' Modifie la date dans la chaine de caractère et retourner la chaine
    Dim T, D
      T = Split(strToModif, " ")
      D = Split(T(4), "/")
      T(4) = D(1) & "/" & D(0) & "/" & D(2)
      ModifChaineDate_ENFormat = Join(T, " ")
    End Function

  8. #8
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Patrice,

    Certes ton code est rigoureux.
    Au demeurant, les données à modifier comportant des espaces, il faut être sûr que le tableau Split soit bien alimenté.
    Autrement dit, que le nombre d'espace (au moins jusqu'à la date) soit le même pour toutes les cellules.
    Dans ce cas, la première occurrence à utiliser serait à une place ultérieure.

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour Marcel,

    Citation Envoyé par MarcelG Voir le message
    ... Dans ce cas, la première occurrence ...
    Effectivement, si l'exemple n'est pas bon, mais c'est aussi le cas avec Instr si l'élément cherché ...

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    si le format des chaines est constants alors simplement un petit split, un replace

    dans un module standard tu colle ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Function dateInversee(ByVal cel As Range)
       Dim dat As String
       If InStr(cel.Value, " Corp ") > 0 Then
            dat = Right(Split(cel.Value, " Corp")(0), 10)
            dateInversee = Replace(cel.Value, dat, Format(dat, "mm/dd/yyyy"))
        Else
            dateInversee = ""
        End If
    End Function
    et dans les cellules de destination tu met
    cette simple formule
    exemple en H1 pour modifier la cellule A1 tu met :
    =dateInversee(A1)
    bien sur la fonction est utilisable par vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox dateInversee([A1])
    End Sub
    demo
    Nom : Capture.JPG
Affichages : 174
Taille : 198,2 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    et si !!!! le format n'est pas constant alors on sort l'artillerie lourde

    toujours pareil dans un module standard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function dateInversee2(ByVal mavar As String)
        Dim matchs
        With CreateObject("VBScript.RegExp"):
            .Global = True: .IgnoreCase = True: .Pattern = "(\d+)\/(\d+)\/(\d+)"
            Set matchs = .Execute(mavar)
            If matchs.Count > 0 Then dateInversee2 = Replace(mavar, matchs(0), Format(matchs(0), "mm/dd/yyyy")) Else dateInversee2 = "Nofound Date!!"
        End With
    End Function
    la formule c'est la meme chose
    =dateInversee2(A1)
    et toujours utilisable par VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        MsgBox dateInversee2([A1])
    End Sub
    DEMO
    Nom : Capture.JPG
Affichages : 176
Taille : 172,1 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Automatiser une fonction dans plusieurs dossier
    Par Baptiste_G dans le forum MATLAB
    Réponses: 8
    Dernier message: 21/11/2012, 22h27
  2. [WD-2010] Automatisation d'une fonction
    Par Betadine dans le forum VBA Word
    Réponses: 0
    Dernier message: 10/09/2011, 09h57
  3. Automatiser une fonction en php
    Par Gwendolyne dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 06/06/2008, 20h05
  4. [Tableaux] pb automatisation dans une fonction
    Par lorenbarre dans le forum Langage
    Réponses: 5
    Dernier message: 07/06/2007, 11h35
  5. Réponses: 6
    Dernier message: 18/04/2007, 11h47

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