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 :

Formule récursive dans une cellule [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    544
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 544
    Par défaut Formule récursive dans une cellule
    Bonjour,
    J'ai dans une colonne des champs dates en toutes lettres avec nom du jour, exemple "Jeudi 24 janvier 2019" que j'aimerais mettre sous la forme 24.01.2019. L'enregistreur de macro ne fonctionne pas car la procédure Format de cellule> Date>14.03.2012 (sous Excel 2016) elle-même est sans effet. La commande Ctrl+1 qu'on trouve dans l'aide Microsoft est sans effet non plus.
    J'ai copié d'une ancienne discussion le code suivant (adapté à mon cas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Formule = "= TEXT(" & madate & "();" & "jj/mm/aaaa"  
    ActiveCell.FormulaR1C1Local = Formule
    (madate renvoie le contenu de la cellule) ce qui donne pour la procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub formater_les_dates()
    L_tir = 1
    C_tir = 1
    Dim Formule As String
    ligne_tireurs = 20
    ThisWorkbook.Worksheets("tireurs").Select
    For L_tir = 1 To ligne_tireurs
    madate = Cells(L_tir, C_tir).Value
    Formule = "= TEXT(" & madate & "();" & "jj/mm/aaaa"
    ActiveCell.FormulaR1C1Local = Formule
    Next
    End Sub
    J'ai testé aussi sans Local et sans FormulaR1C1: même échec.
    Est-ce parce que la formule a pour argument le contenu de la cellule elle-même ? Des erreurs de guillemets ?
    Quelle mouche pique mon Excel 2016 ? Comment faire cette transformation des dates ?
    Merci d'avance pour toute piste.
    Cordialement
    Touche_a_tout

  2. #2
    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
    bonjour
    voici une toute pettite fonction perso vite fait comme ca
    fonctionne seulement a la condition que les mois soient correctement orthographiés et en minuscule attention aux accents!!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Function shortdate(cel)
        shortdate = DateValue(LCase(Replace(cel, Split(cel, " ")(0), "")))
    End Function
    '
    Sub test()
        MsgBox shortdate("Jeudi 24 janvier 2019")
    End Sub
    exemple de formule de base dans une cellule
    =shortdate(A1)
    EDIT:

    UN PEU PLUS DE SOUPLESSE AVEC CETTE VERSION
    Avec cette version ci dessous ,les mois en majuscule ou sans accents sont acceptés
    il y a la gestion d'erreur sans blocage pour le cas ou le texte ne soit vraiment pas valide pour datevalue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Function shortdate(cel)
       cel = LCase(cel)
       cel = Replace(Replace(Replace(cel, "decembre", "décembre"), "aout", "août"), "fevrier", "février")
        shortdate = "non reconnue!!"
        On Error Resume Next
        shortdate = DateValue(LCase(Replace(cel, Split(cel, " ")(0), "")))
    End Function
    par contre formate bien tes cellules au format de date voulu car on obtien le numero de serie de la date dans les cellules
    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

  3. #3
    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 j'en remet une couche
    celle si accepte plusieurs orthographe et (avec ou sans le jour en lettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function shortdate(cel)
        cel = LCase(cel)
        cel = Replace(Replace(Replace(cel, "decembre", "décembre"), "aout", "août"), "fevrier", "février")
        If UBound(Split(cel, " ")) = 3 Then cel = Replace(cel, Split(cel, " ")(0), "")
        shortdate = "non reconnue!!"
        On Error Resume Next
            shortdate = DateValue(cel)
    End Function
    demo
    Nom : Capture.JPG
Affichages : 722
Taille : 82,9 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

  4. #4
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    544
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 544
    Par défaut Formule récursive dans une celllle
    Bonjour Patrick,
    Je trouve assez rigolo, en tant que futur membre du club inscrit pourtant depuis 12 ans et auteur de plus de 300 messages, d'être conseillé par un "débutant" dont j'ai déjà eu l'occasion de constater les vastes capacités. J'ai interrogé Pierre Fauconnier sur mon changement brusque de statut mais il n'a pas pu me l'expliquer. je vois qu'il t'est arrivé le même gag !
    J'ai tourniqué pas mal autour de ta première proposition (mes mois sont ok) mais la conclusion est que l'opération ne peut pas être récursive: il faut envoyer le résultat dans une autre cellule, celle d'à côté par exemple. C'est bon à savoir (à moins que quelqu'un sorte une solution du chapeau). Ca donne ceci:
    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
     
    Public Function shortdate(cel)
        shortdate = DateValue(LCase(Replace(cel, Split(cel, " ")(0), "")))
    End Function
    '
    Sub test()
        MsgBox shortdate("Jeudi 24 janvier 2019")
    End Sub
    Sub formater_les_dates()
    L_tir = 1
    C_tir = 1
    ligne_tireurs = 20
    ThisWorkbook.Worksheets("tireurs").Select
    For L_tir = 1 To ligne_tireurs
    Cells(L_tir, C_tir + 1) = shortdate(Cells(L_tir, C_tir).Value)
    Next
    End Sub
    Dans la colonne voisine j'ai obtenu ceci, qui me satisfait tout à fait:
    24.07.2018
    27.07.2018
    31.07.2018
    Encore merci de m'avoir dépanné.
    Cordialement
    touche_a_tout

  5. #5
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    544
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 544
    Par défaut Formule récursive dans une celllle
    re, Patrick,
    Pas vu ton post No 3 quand j'ai répondu. Grande souplesse, mais c'est trop pour mes besoins. Merci tout de même et tu pourrais en faire un article, bien meilleur que ce que F1 trouve chez Microsoft. Si tu te sens l'esprit pédagogique...
    Bien à toi
    touche_a_tout

  6. #6
    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
    mais la conclusion est que l'opération ne peut pas être récursive: il faut envoyer le résultat dans une autre cellule, celle d'à côté par exemple
    ce n'est pas la recursivité que tu cherche mais bien le formatage dynamique d'apres ce que je comprends
    utilise alors l'evenement change tout simplement et tu n'auras pas besoins de cellule intermediaire
    je pense avoir compris que c'est cela que tu veux
    le tout collé dans le module du sheets concerné .
    exemple en colonne "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
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column = 1 And Target.Cells.Count = 1 Then
            If Not IsDate(Target.Value) And Target Like "*[0-9]*" And Target.Value <> "" Then
                 Target.Value = shortdate(Target.Value)
            End If
        End If
    End Sub
    '
    Public Function shortdate(cel)
        cel = LCase(cel)
        cel = Replace(Replace(Replace(cel, "decembre", "décembre"), "aout", "août"), "fevrier", "février")
        shortdate = "non reconnue!!"
        On Error Resume Next
        shortdate = DateValue(LCase(Replace(cel, Split(cel, " ")(0), "")))
    End Function
    '
    'test d'insertion par vba
    Sub test_par_VBA()
    Cells(10, 1).Value = "vendredi 25 janvier 2019"
    End Sub
    voila tu tape ou entre par vba par exemple "vendredi 25 janvier 2019" puis que tu tape enter ca te met ta date au format "dd/mm/yyyy"
    demo
    Nom : demo2.gif
Affichages : 691
Taille : 189,3 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

  7. #7
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    544
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 544
    Par défaut Formule récursive dans une celllle
    Bonsoir Patrick,
    Je conserve ta première proposition (ton post No 2) qui me convient tout à fait.
    Merci de ton aide. Pour moi, on peut considérer la discussion comme résolue.
    Bine à toi. Et encore merci.
    touche_a_tout

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

Discussions similaires

  1. mettre une formule excel dans une cellule
    Par spoyet dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/02/2012, 15h11
  2. mettre une formule excel dans une cellule
    Par spoyet dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/02/2012, 09h52
  3. Réponses: 2
    Dernier message: 30/03/2010, 10h39
  4. [XL-2003] Variable = formule contenu dans une cellule
    Par Pa2pseudo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/05/2009, 21h29
  5. Inserer une formule (Longue) dans une cellule via VBA
    Par alex830001 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/01/2009, 12h28

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