Appel fonction

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour tous
j'arrive pas à retrouver comment on appelle une fonction d'un module VBA d'une cellule Excel
ex : Nbre en A1 et B1 et le calcul / résultat en C1via la fonction VBA ?
Donc que met-on en C1 pour l'opération se fasse ?
Merci bien
 

vgendron

XLDnaute Barbatruc
Re : Appel fonction

alors. déjà..je pense que, dans ta déclaration de fonction, il faut lui dire que tu l'appelles avec des dates
Function entre_dates(debut As Date, fin As Date) As Date

ensuite.. ta fonction renvoie une date..
sauf qu'à la fin tu fais une concaténation avec une date ET du texte

NbM = Str$(NM) & " mois et"

forcément. ca ne va pas fonctionner..

et une remarque (parce qu'en fait, je n'ai pas compris ce que faisait ta fonction) essaie d'organiser ton code avec des indentations (décalages) pour mieux identifier les blocs if then else..

Code:
Function entre_dates(debut As Date, fin As Date) As Date
If Not IsNull(debut) And Not IsNull(fin) Then
    AN = Val(Format(debut, "yyyy"))
    MN = Val(Format(debut, "mm"))
    JN = Val(Format(debut, "dd"))

    AA = Val(Format(fin, "yyyy"))
    MA = Val(Format(fin, "mm"))
    JA = Val(Format(fin, "dd"))

    NJMP = "01/" & MA & "/" & AA
    NJMP = DateValue(NJMP) - 1
    NJMP = Val(Format(NJMP, "dd"))

    If JN > JA Then
        JA = JA + NJMP
        MA = MA - 1
    End If

    If MN > MA Then
        MA = MA + 12
        AA = AA - 1
    End If

    NA = AA - AN
    NM = MA - MN
    NJ = JA - JN

    If NA = 0 Then
        NbAn = ""
    ElseIf NA = 1 Then
        NbAn = Str$(NA) & " an"
    Else
        If NM <> 0 Then
            If NJ <> 0 Then
                NbAn = Str$(NA) & " ans"
            Else
            NbAn = Str$(NA) & " ans et"
        End If
    Else
        NbAn = Str$(NA) & " ans et"
    End If
    If NM = 0 And NJ = 0 Then
        NbAn = Str$(NA) & " ans"
    End If
End If

If NJ = 0 Then
    nbj = ""
ElseIf NJ = 1 Then
    nbj = Str$(NJ) & " jour"
Else
    nbj = Str$(NJ) & " jours"
End If

If NM = 0 Then
    NbM = ""
Else
    If NJ <> 0 Then
        NbM = Str$(NM) & " mois et"
    Else
        NbM = Str$(NM) & " mois"
    End If
End If

entre_dates = NbAn & NbM & nbj
Else
    entre_dates = ""
End If
End Function

du coup. en déclarant ta fonction comme ceci (avec un retour String)
Function entre_dates(debut As Date, fin As Date) As String
 

Dranreb

XLDnaute Barbatruc
Re : Appel fonction

Bonjour.

J'utilise personnellement cette fonction que j'ai écrite il y a très longtemps :
VB:
Function DuréeEnClair(ByVal D As Double) As String
Dim Z As String, M As Double, U As String, N As Long, NDét
Z = ""
M = 365.2425:  U = "an" & IIf(D >= 730.485, "s", ""):    GoSub 2
M = 30.436875: U = "mois":                               GoSub 2
M = 7:         U = "sem":                                GoSub 2
M = 1:         U = "j.":                                 GoSub 2
M = 1 / 24:    U = "h.":                                 GoSub 2
M = 1 / 1440:  U = "min":                                GoSub 2
1 DuréeEnClair = Mid$(Z, 2)
Exit Function
2 N = Int(D / M)
If N > 0 Then
   Z = Z & " " & N & " " & U
   D = D - M * N
   End If
If Len(Z) = 0 Then NDét = 0 Else NDét = NDét + 1
If NDét >= 2 Then GoTo 1
Return
End Function
En F3 :
Code:
=DuréeEnClair(MAINTENANT()-DateHeureFic)
Edit: et que je viens de corriger car j'ai vu qu'elle avait un Exit Function inutile en trop.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Appel fonction

Si je mets ma fonction dans votre classeur,
Code:
=DuréeEnClair(B1-A1)
affiche "6 mois 3 sem"
On pourrait sûrement la remanier pour qu'elle mette des ", " entre chaque élément sauf entre les 2 derniers où elle mettrait " et ".

En la modifiant ainsi :
VB:
Function DuréeEnClair(ByVal D As Double) As String
Dim Z As String, M As Double, U As String, N As Long, NDét&
Z = ""
M = 365.2425:  U = "an" & IIf(D >= 730.485, "s", ""):    GoSub 2
M = 30.436875: U = "mois":                               GoSub 2
M = 7:         U = "semaine" & IIf(D >= 14, "s", ""):    GoSub 2
M = 1:         U = "jour" & IIf(D >= 2, "s", ""):        GoSub 2
M = 1 / 24:    U = "heure" & IIf(D > 2 / 24, "s", ""):   GoSub 2
M = 1 / 1440:  U = "min.":                               GoSub 2
1 DuréeEnClair = Mid$(Z, 5)
Exit Function
2 N = Int(D / M)
If N > 0 Then
   Z = Z & " et " & N & " " & U
   D = D - M * N
   End If
If Len(Z) = 0 Then NDét = 0 Else NDét = NDét + 1
If NDét >= 2 Then GoTo 1
Return
End Function
elle affiche déjà "6 mois et 3 semaines".

Et elle met "6 mois et 21 jours" si on met en commentaire la ligne
'M = 7: U = "semaine" & IIf(D >= 14, "s", ""): GoSub 2
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Appel fonction

Slt Dran
Merci ,Oui ça marche , mais je pige pas ....et j'aime pas
Code:
M = 365.2425:  U = [COLOR=#800000]"an"[/COLOR] & IIf(D >= 730.485, [COLOR=#800000]"s"[/COLOR], [COLOR=#800000]""[/COLOR]):    [COLOR=#151B8D][B]GoSub[/B][/COLOR] 2
M = 30.436875: U = [COLOR=#800000]"mois"[/COLOR]:                               [COLOR=#151B8D][B]GoSub[/B][/COLOR] 2
M = 7:         U = [COLOR=#800000]"semaine"[/COLOR] & IIf(D >= 14, [COLOR=#800000]"s"[/COLOR], [COLOR=#800000]""[/COLOR]):    [COLOR=#151B8D][B]GoSub[/B][/COLOR] 2
M = 1:         U = [COLOR=#800000]"jour"[/COLOR] & IIf(D >= 2, [COLOR=#800000]"s"[/COLOR], [COLOR=#800000]""[/COLOR]):        [COLOR=#151B8D][B]GoSub[/B][/COLOR] 2
M = 1 / 24:    U = [COLOR=#800000]"heure"[/COLOR] & IIf(D > 2 / 24, [COLOR=#800000]"s"[/COLOR], [COLOR=#800000]""[/COLOR]):   [COLOR=#151B8D][B]GoSub[/B][/COLOR] 2
M = 1 / 1440:  U = [COLOR=#800000]"min."[/COLOR]:                               [COLOR=#151B8D][B]GoSub[/B][/COLOR] 2
D'ou ces chiffres biscornu sortent-ils ?? un matheux aime comprendre !!!
et le IIF , je sais plus ?
Si tu peux détailler , merci je prends car j'ai plein d'appli vba qui appellent des fonctions ou je comprends , et là pas ? chacun son truc !
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Appel fonction

Pour tester ma fonction je l'ai transformé en SUb , pour faire du "pas à pas "
CA MARCHE
donc maintenant comment l'adapter DIRECT dans Excel ??
Merci bien

je joins le nouveau fichier "bidouillé " pour ceux qui veulent tester, faut aller en VBA
 

Pièces jointes

  • test_date.xls
    43 KB · Affichages: 28
  • test_date.xls
    43 KB · Affichages: 38
  • test_date.xls
    43 KB · Affichages: 40

Dranreb

XLDnaute Barbatruc
Re : Appel fonction

je pige pas ....et j'aime pas
Parce que vous n'aimez pas ne piger, seulement, j'espère !?
D'ou ces chiffres biscornu sortent-ils ?? un matheux aime comprendre !!!
365,2425 c'est sensiblement le nombre de jours moyen d'une année.
30,436875 le nombre de jours moyen dans un mois (365,2425 / 12)
7: dans une semaine, 1 / 24: dans une heure, 1 /1440: dans une minute
et le IIF , je sais plus ?
IIf(Condition, ValeurSiVraie, ValeurSiFaux)
Remarquez, vous pouvez vous passer des IIf en l'écrivant comme ça :
VB:
Function DuréeEnClair(ByVal D As Double) As String
Dim Z As String, M As Double, U As String, N As Long, NDét&
Z = ""
M = 365.2425:  U = "an":      GoSub 2
M = 30.436875: U = "mois":    GoSub 2
M = 7:         U = "semaine": GoSub 2
M = 1:         U = "jour":    GoSub 2
M = 1 / 24:    U = "heure":   GoSub 2
M = 1 / 1440:  U = "min.":    GoSub 2
1 DuréeEnClair = Mid$(Z, 5)
Exit Function
2 N = Int(D / M)
If N > 0 Then
   If N > 1 Then If InStr("s.", Right$(U, 1)) = 0 Then U = U & "s"
   Z = Z & " et " & N & " " & U
   D = D - M * N
   End If
If Len(Z) = 0 Then NDét = 0 Else NDét = NDét + 1
If NDét >= 2 Then GoTo 1
Return
End Function
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
298
Réponses
3
Affichages
271
Réponses
6
Affichages
229

Statistiques des forums

Discussions
312 214
Messages
2 086 309
Membres
103 174
dernier inscrit
OBUTT