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 :

Création d'une fonction via VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    DATAMINER
    Inscrit en
    Novembre 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DATAMINER
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 147
    Points : 77
    Points
    77
    Par défaut Création d'une fonction via VBA
    Bonjour,

    Je suis en train d’essayé de mettre une formule en VBA qui me permet de calcule combien d’année passée entre la date d’aujourd’hui et une date fixé et la date fixé ce trouve toujours dans la dernier colonne remplis.
    La formule et la suite : (Date d’aujourd’hui()-date indique dans la dernier colonne remplis/30/12) et j’aime mettre le résultats dans la dernier colonne vide
    Quelqu’un peut m’aide à mettre cette fonction sur VBA.

    merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, un exemple plus large, à toi de l'adapter à ton contexte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function DiffDateAMJ(DateDebut As Date, DateFin As Date) As String
    Dim NbAns As Long, NbMois As Long, NbJours As Long
    Dim Tmp As Date
        Tmp = DateSerial(Year(DateFin), Month(DateDebut), Day(DateDebut))
        NbAns = Year(DateFin) - Year(DateDebut) + (Tmp > DateFin)
        NbMois = Month(DateFin) - Month(DateDebut) - (12 * (Tmp > DateFin))
        NbJours = Day(DateFin) - Day(DateDebut)    ' + 1
        If NbJours < 0 Then
            NbMois = NbMois - 1
            NbJours = Day(DateSerial(Year(DateFin), Month(DateFin), 0)) + NbJours
        End If
        DiffDateAMJ = NbAns & "a " & NbMois & "m " & NbJours & "j"
    End Function
    Images attachées Images attachées  

  3. #3
    Membre régulier
    Homme Profil pro
    DATAMINER
    Inscrit en
    Novembre 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DATAMINER
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    j'ai bien aimé ton code surtout résultats final avec combien de jour du mois et année merci bcq je vais essaye de l'adapté avec mon code déjà réalisé sur le fichier par ce que j'ai des conditions a respecte de me mettre les resultats dans la dernier colonne vide après application du 1er code qui mette les résultats aussi sur la dernier colonne vide

  4. #4
    Membre régulier
    Homme Profil pro
    DATAMINER
    Inscrit en
    Novembre 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DATAMINER
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    ouh je suis desole les amis j'ai passe tout la matinée a cherche sur des forums pour adapté le code mais vraiment j'arrive pas je suis vraiment novice

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par a.ouguerzam Voir le message
    Bonjour,

    Je suis en train d’essayé de mettre une formule en VBA qui me permet de calcule combien d’année passée entre la date d’aujourd’hui et une date fixé et la date fixé ce trouve toujours dans la dernier colonne remplis.
    La formule et la suite : (Date d’aujourd’hui()-date indique dans la dernier colonne remplis/30/12) et j’aime mettre le résultats dans la dernier colonne vide
    Quelqu’un peut m’aide à mettre cette fonction sur VBA.

    merci d'avance pour votre aide.
    Tu peux enlever toutes les lignes qui contiennent .Select. Car elles ne servent à rien d'autre qu'à vérifier que le code est bon.

    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 AujourdhuiMoinsLaDate()
     
    Set f = ActiveSheet 'ou Worksheets("Feuil1")
    f.Select
    dernligne = f.Cells(Rows.Count, 1).End(xlUp).Row
     
    Set rg = f.Cells.Find(what:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
     If Not rg Is Nothing Then
      dernColonne = rg.Column
     Else
      MsgBox "Il y a un probleme"
      Exit Sub
     End If
     
    Set r = f.Range(f.Cells(1, dernColonne + 1), f.Cells(dernligne, dernColonne + 1))
    r.Select
    r.NumberFormat = "General"
     
    Set premier = r.Cells(1, 1)
    premier.Select
    Set ref = premier.Offset(, -1)
    ref.Select
    addr = ref.Address(RowAbsolute:=False, columnabsolute:=False)
    premier.FormulaLocal = "=AUJOURDHUI()-" & addr
    premier.AutoFill Destination:=r, Type:=xlFillDefault
    r.Select
    r.FormulaLocal = r.Value 'Remplace les formules par les valeurs
    End Sub
    Cordialement

    Docmarti.

  6. #6
    Membre régulier
    Homme Profil pro
    DATAMINER
    Inscrit en
    Novembre 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DATAMINER
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    ca marche très bien il me donne combien de jour je peux rajouter a la fonction une petite modification pour avoir combien d'année

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    premier.FormulaLocal = "=AUJOURDHUI()-" & addr / 30 /12
    C'est possible ?

  7. #7
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Ca a l'air possible en divisant les jours par 365,25 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    formule = "AUJOURDHUI()-" & addr
    formule = "=ent((" & formule & ")/365,25)"
    premier.FormulaLocal = formule
    La division en VBA par 365.25 n'est pas une solution parfaite. En fait, sur 8000 dates consécutives sur lesquelles est exécuté cette division, il y a 12 résultats inexacts avec une erreur de 1.

    Mais on peut se servir de la fonction de feuille DateDif dans Excel qui ne produit pas d'erreurs.

    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
    32
    33
    34
    35
    Sub AujourdhuiMoinsLaDate()
     
    Set f = ActiveSheet 'ou Worksheets("Feuil1")
    f.Select
    dernligne = f.Cells(Rows.Count, 1).End(xlUp).Row
     
    Set rg = f.Cells.Find(what:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
     If Not rg Is Nothing Then
      dernColonne = rg.Column
     Else
      MsgBox "Il y a un probleme"
      Exit Sub
     End If
     
    Set r = f.Range(f.Cells(1, dernColonne + 1), f.Cells(dernligne, dernColonne + 1))
    r.Select
    r.NumberFormat = "General"
    Set premier = r.Cells(1, 1)
    premier.Select
    Set ref2 = premier.Offset(, -1)
    ref2.Select
    addr2 = ref2.Address(RowAbsolute:=False, columnabsolute:=False)
    Set ref1 = ref2.Offset(, -1)
    ref1.Select
    addr1 = ref1.Address(RowAbsolute:=False, columnabsolute:=False)
     
    'Formule à générer   =DATEDIF(H4;I4;"y")
    formule = "=DATEDIF(" & addr1 & ";" & addr2 & ";" & """y""" & ")"
     
    premier.FormulaLocal = formule
    premier.AutoFill Destination:=r, Type:=xlFillDefault
    r.Select
     Stop
    r.FormulaLocal = r.Value 'Remplace les formules par les valeurs
    End Sub
    Cordialement

    Docmarti.

  8. #8
    Membre régulier
    Homme Profil pro
    DATAMINER
    Inscrit en
    Novembre 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DATAMINER
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    j'ai un message d'erreur d'exécution '1004' sur la ligne ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ref1 = ref2.Offset(, -1)
    mais avec le code ci dessous ça marche très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    formule = "AUJOURDHUI()-" & addr
    formule = "=ent((" & formule & ")/365,25)"
    premier.FormulaLocal = formule

  9. #9
    Membre régulier
    Homme Profil pro
    DATAMINER
    Inscrit en
    Novembre 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DATAMINER
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    salut les amis le code ça marche avec la combinaison ci dessous merci bcq de votre aide :

    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
    Sub AujourdhuiMoinsLaDate()
     
    Set f = ActiveSheet 'ou Worksheets("Feuil1")
    f.Select
    dernligne = f.Cells(Rows.Count, 1).End(xlUp).Row
     
    Set rg = f.Cells.Find(what:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
     If Not rg Is Nothing Then
      dernColonne = rg.Column
     Else
      MsgBox "Il y a un probleme"
      Exit Sub
     End If
     
    Set r = f.Range(f.Cells(1, dernColonne + 1), f.Cells(dernligne, dernColonne + 1))
    r.Select
    r.NumberFormat = "General"
     
    Set premier = r.Cells(1, 1)
    premier.Select
    Set ref = premier.Offset(, -1)
    ref.Select
    addr = ref.Address(RowAbsolute:=False, columnabsolute:=False)
    formule = "AUJOURDHUI()-" & addr
    formule = "=ent((" & formule & ")/30/12)"
    premier.FormulaLocal = formule
    premier.AutoFill Destination:=r, Type:=xlFillDefault
    r.Select
    r.FormulaLocal = r.Value 'Remplace les formules par les valeurs
    End Sub

  10. #10
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par a.ouguerzam Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set premier = r.Cells(1, 1)
    premier.Select
    Set ref = premier.Offset(, -1)
    ref.Select
    addr = ref.Address(RowAbsolute:=False, columnabsolute:=False)
    formule = "AUJOURDHUI()-" & addr
    formule = "=ent((" & formule & ")/30/12)"
    premier.FormulaLocal = formule
    premier.AutoFill Destination:=r, Type:=xlFillDefault
    Diviser par /30/12 revient à diviser par 360.
    Ce serait mieux de diviser par 365.25

    Si tu veux utiliser la fonction DateDif sur la feuille pour comparer les dates avec AUJOURDHUI(), voici :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Sub tt()
     
    Set f = ActiveSheet 'ou Worksheets("Feuil1")
     
    With f.Cells
     
     Set rg = .Find(what:="*", After:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
     If Not rg Is Nothing Then
      derniereColonne = rg.Column
     Else
      MsgBox "Il y a un probleme"
      Exit Sub
     End If
     
    End With
     
    dern = f.Cells(Rows.Count, 1).End(xlUp).Row
     
    Set r = f.Range("A1:A" & dern)
     
    For i = 1 To dern
     Set c = f.Cells(i, 1)
     
     If Trim(c.Value) = "" Then
     Else
      t = Split(c.Value, "/")
      If UBound(t) = 2 Then
       converti = t(1) & "/" & t(0) & "/" & t(2)
       Set dest = f.Cells(c.Row, derniereColonne + 1)
       dest.NumberFormat = "m/d/yyyy"
       dest.FormulaLocal = converti
       d = TypeName(dest.Value)
       If premier = "" Then
        premier = d
       Else
        If d <> premier Then
         dest.Select
         MsgBox "Probleme potentiel ici. Types de donnees differents"
        End If
       End If
      End If
     End If
    Next
    Call AujourdhuiMoinsLaDate(f)
    End Sub
     
    Sub AujourdhuiMoinsLaDate(f)
     
    dernligne = f.Cells(Rows.Count, 1).End(xlUp).Row
     
    Set rg = f.Cells.Find(what:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
     If Not rg Is Nothing Then
      dernColonne = rg.Column
     Else
      MsgBox "Il y a un probleme"
      Exit Sub
     End If
     
    Set r = f.Range(f.Cells(1, dernColonne + 1), f.Cells(dernligne, dernColonne + 1))
    r.NumberFormat = "General"
    Set premier = r.Cells(1, 1)
     
    Set ref2 = premier.Offset(, 1)
    ref2.FormulaLocal = "=AUJOURDHUI()"
    addr2 = ref2.Address(RowAbsolute:=True, columnabsolute:=True)
     
    Set ref1 = premier.Offset(, -1)
    addr1 = ref1.Address(RowAbsolute:=False, columnabsolute:=False)
     
    formule = "=DATEDIF(" & addr1 & ";" & addr2 & ";" & """y""" & ")"
    premier.FormulaLocal = formule
    premier.AutoFill Destination:=r, Type:=xlFillDefault
     
     Stop
    r.FormulaLocal = r.Value 'Remplace les formules par les valeurs
    ref2.Formula = ""
    End Sub
    Cordialement

    Docmarti.

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

Discussions similaires

  1. Problème pour insérer une formule dans un code VBA
    Par ti_mouton dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/07/2015, 18h02
  2. [XL-2010] Ajouter une valeur dans du code vba
    Par Marc31 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/06/2015, 09h40
  3. [XL-2007] Ajouter une formule par code
    Par Nanais19 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/11/2011, 09h29
  4. comment ajouter une condition if dans code VBA
    Par misig dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/12/2007, 00h03
  5. [VBA-E] Ajouter une reference par le code
    Par mustang-ffw02 dans le forum Installation, Déploiement et Sécurité
    Réponses: 12
    Dernier message: 21/11/2006, 19h28

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