Code se redéclenche

Fermé
Vieuxray - Modifié par Vieuxray le 5/03/2014 à 11:10
 Vieuxray - 7 mars 2014 à 19:30
Bonjour a toutes et tous, Forum bonjour



Excel 2007 - VBA

Voila mon petit soucis, le code ci-dessous qui teste le premier de chaque mois fonctionne bien
il se trouve dans Userform Initialize() et le problème que je rencontre est qu'a chaque fois qu'Excel passe par Userform Initialize() où que l'USF est réinitialisé

Dans la cellule B17 de ma feuil1(Compte) j'ai inscrit 120 correspondant au nombre de mensualitées et donc doit se décompter au premier de chaque mois de -1

ce que je souhaite svp c'est le compteur B17 se décompte qu'une seule et unique fois par mois (au 01) et non pas a chaque fois qu'excel lit le code

Merci a vous pour votre temps ainsi que de votre aide

Bonne journée a tous

Cordialement Ray


'###### USERFORM INITIALISE
'*** CALCUL LE NOMBRE DE MENSUALITES RESTANTES (au départ 120)

If Month(Date) <> .Range("B16") Then 'Test date au premier de chaque mois
.Range("B16") = Date

If Val(Range("B17")) > 0 Then
.Range("B17") = .Range("B17") - 1 'Mensualitées restantes

If Range("B17") = 0 Then
.Range("B17") = "Fini" 'Mensualitées Fini
End If
End If
Label479.Caption = .Range("B17") 'Ecrit dans le Label479
A voir également:

6 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié par pilas31 le 6/03/2014 à 01:11
Bonsoir,

je propose de modifier le code de la façon suivante :
nb_mois = (Year(Date) - Year(.Range("B16"))) * 12 + Month(Date) - Month(.Range("B16"))
    If nb_mois <> 0 Then        'Test date au premier de chaque mois
        .Range("B16") = Date
        If Val(Range("B17")) > 0 Then
            .Range("B17") = .Range("B17") - nb_mois        'Mensualitées restantes
            If Range("B17") <= 0 Then
            .Range("B17") = "Fini"                            'Mensualitées Fini
            End If
        End If
    End If
    Label479.Caption = .Range("B17")

Ainsi le décompte ne s'effectue que si le nb_mois est différent de zéro c'est à dire quand le mois et/ou l'année sont différents.
En même temps j'en profite pour décompter du nombre de mois restants le nombre de mois écoulés. Ainsi si l'on n'ouvre pas le fichier de plusieurs mois (on ne sait jamais), le nombre d'échéances restantes sera toujours juste.

A tester

Cordialement,
1
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
7 mars 2014 à 10:38
Bonjour,
Voila, j'ai regroupé les deux tests sous un seul. Je pense que cela doit fonctionner :
With ws   'Ws = Sheets("Compte")
    nb_mois = (Year(Date) - Year(.Range("B16"))) * 12 + Month(Date) - Month(.Range("B16"))
    'DECALER ET RECOPIER D'UNE COLONNE ET LIGNES LE PREMIER JOUR DE CHAQUE MOIS AUTOMATIQUEMENT
    If nb_mois <> 0 Then 'Test nb de mois écoulés depuis le dernier calcul
        .Range("B24") = Date  'Date changement de colonne mensuel
        With .Cells(18, Month(Date) + 3).Resize(9, 1)
            .Copy .Offset(0, 1)
            .SpecialCells(xlCellTypeConstants, 23).ClearContents
        End With
        Label481.Caption = Format(.Range("B24"), "Dddd dd Mmm yyyy") 'Date MAJ via Label481
    'CALCUL LE NOMBRE DE MENSUALITES RESTANTES
        .Range("B16") = Date
        If Val(Range("B17")) > 0 Then
            .Range("B17") = .Range("B17") - nb_mois 'Mensualitées restantes
            If Range("B17") <= 0 Then
                .Range("B17") = "Fini" 'Fin des mensualitées
            End If
        End If
    End If
    Label479.Caption = .Range("B17")
End With

A tester
--
Cordialement,
1
Bonjour pilas31,

Merci beaucoup pour ta réponse ainsi que pour le code modifier, c'est très sympa.

En faisant l'essai ce matin je me suis apercu que j'avais omis de mettre un bout de code, erreur de ma part, mauvaise manip lors de la sélection du code, désolé.

Donc le soucis est toujours le mème et pour infos le code ci-dessous fonctionne a part le soucis énoncé au premier post.

Deux actions doivent s'éxécuter automatiquement le premier de chaque mois.

(1) Recopie des quelques lignes et déplacement vers la droite d'une colonne.
(2) Calcul le nombre des mensualitées restantes.

Comment svp faire en sorte que le bout de code ne s'éxécute qu'une seule fois au premier du mois, tout en tenant compte du commentaire de ta réponse.

Merci pour ton aide et encore désolé pour l'erreur commise, je te souhaite une agréable journée.

Cordialement Ray


'### DECALER ET RECOPIER D'UNE COLONNE ET LIGNES LE PREMIER JOUR DE CHAQUE MOIS AUTOMATIQUEMENT
With Ws 'Ws = Sheets("Compte")
If Month(Date) = .Range("B24") Then 'Test de la date
.Range("B24") = Date 'Date changement de colonne mensuel

With .Cells(18, Month(Date) + 3).Resize(9, 1)
.Copy .Offset(0, 1)
.SpecialCells(xlCellTypeConstants, 23).ClearContents
End With
End If

Label481.Caption = Format(.Range("B24"), "Dddd dd Mmm yyyy") 'Date MAJ via Label481

'*** CALCUL LE NOMBRE DE MENSUALITES RESTANTES
nb_mois = (Year(Date) - Year(.Range("B16"))) * 12 + Month(Date) - Month(.Range("B16"))
If nb_mois <> 0 Then 'Test date au 01 de chaque mois
.Range("B16") = Date

If Val(Range("B17")) > 0 Then
.Range("B17") = .Range("B17") - nb_mois 'Mensualitées restantes
If Range("B17") <= 0 Then
.Range("B17") = "Fini" 'Fin des mensualitées
End If
End If
'End If
Label479.Caption = .Range("B17")
0
Bonjour,

Si je peux me permettre, je pense que l'erreur vient de là:
If Month(Date) = .Range("B24") Then                'Test de la date
Il faut plutot ecrire
If Month(Date) <> Month(.Range("B24")) Then   'Test si changement de mois 
'alors action
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié par pilas31 le 6/03/2014 à 11:41
Bonjour,

Oui, Yoda a raison, il faut comparer le mois avec le mois.
Juste deux remarques.
Cela suppose que tu vas tous les mois régulièrement sur l 'UF car si tu sautes une année il se trompera (cela semble très improbable). Sinon il faut utiliser le nb_mois comme je l'ai fait dans le deuxième test.
Autre remarque les dates en B17 et B24 sont sans doute toujours les mêmes. Il faut peut-être simplifier, calculer nb_mois au début et tout regrouper avec le même test.
0
Salut pilas31

Salut Yoda

Merci a vous deux pour vos réponses, c'est cool

Alors j'ai essayer les deux codes la modif proposer par l'ami Yoda a l'air de fonctionner car lorsque Excel repasse dans "Userform Initialize()" je n'ai plus le code bout de code qui fonctionne, déja ça de gagner.

Pour les remarques
(1) j'ouvre mon fichier au moins deux fois tous les jours.
(2) Effectivement pour les dates en B17 et B24, je suis d'accord avec toi pour ta proposition de simplifier, calculer nb_mois au début et tout regrouper avec le même test.
j'avais séparer pour éviter de me planter lors du code.

Merci pour l'aide apporter, vu l'heure un bon app a vous.

Bonne après midi

Cdlt Ray
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut pilas31

J'ai fait des essais cette après midi pour simplifier le code, mais je n'arrive pas faire fonctionner le tout, il y a toujours quelque chose qui ne va pas.

je ne vois plus comment procéder, si tu veux bien, svp et que tu a un peu de temps pour me tout regrouper avec le même test.

Quand tu a le temps rien ne presse, je te remercie pour ton aide.

Bonne soirée a toi

Cdlt Ray
0
Bonsoir Pilas31,

Merci beaucoup pour la modification, j'ai essayer ça a l'air de fonctionner
SAUF que la date de mise a jour ne s'affiche pas dans le Label481

Label481.Caption = Format(.Range("B24"), "Dddd dd Mmm yyyy")

Et comment svp je peux tester si cela fonctionne
(en supposant que nous sommes aujourd'hui le 01 Avril 2014)
ce n'ai pas un poisson d'avril ihihih
histoire de voir si tous les changements marche bien

Sinon encore merci pour ton aide

je te souhaite une bonne soirée et un très bon W-end

Cordialement Ray
0