Critère supplémentaire

sten83

XLDnaute Occasionnel
Bonjour à tous, j'ai une macro qui analyse une cellule en fonction du resultat elle ouvre ou n'ouvre pas la feuille.
Je souhaiterai ajouter un autre critère dans le cas ou une autre cellule contiendrai des données.
Voici le code de ma macro.

Private Sub CmdJanvier_Click()
If shtjanvier.Range("AB1") = "" Then
MsgBox "Vous devez d'abord entrer les informations" & Chr(13) _
& "de votre établissement!", vbInformation + vbOKOnly, "Information!"
ufDonnesParc.Show
Else

Me.Hide
shtjanvier.Activate
End If
End Sub

Ce que j'aimerai c'est ajouter un If dans le cas ou la cellule C39 contiendrait des données, si oui un usf "Mot de Passe" s'ouvrirait car seul une catégorie de personnel ne sera autorisé à modifier les données de la feuille.
Merci de votre aide.
 

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

hello

comme tu as su le faire pour la cellule AB1, il te suffit de refaire un test pour la cellule C39
if shtjanvier.range("C39")<>"" then
MotdePasse.show
end if

maintenant. il faut savoir à quel moment tu fais ce test..
si AB1 est vide.. est ce que tu vas quand meme tester C39 ?
 

sten83

XLDnaute Occasionnel
Re : Critère supplémentaire

En fait le test sur la cellule C39 ne doit ce faire qu'en fin de chaque mois.
Ex: le 31 janvier test pour savoir si la cellule et vide ou non, le 28 ou 29 février en fonction des années bissextiles test sur la cellule, et ainsi de suite pour tous les mois de l'année.
Je précise 1 feuille = 1 mois.
Ceci me permettra de mettre un mot de passe pour pouvoir ouvrir ces feuilles uniquement par une personne agrée car ce sont des données sensibles qui vont alimentées mes feuilles, tant que les mois ne sont pas complet, les feuilles peuvent êtres modifier mais quand celles-ci arrive au dernier jour, seul un responsable pourra ouvrir cette feuille via un mot de passe.
J'espère que mes explications sont clair.
Au besoin je fournirai le classeur.
 

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

Hello

sans classeur exemple (pas de data confidentielle, juste de quoi se représenter la structure et emplacement des data), pas facile effectivement: mais teste ceci

Code:
Sub testfinmois()

MsgBox ("aujourd'hui, nous sommes le " & Date)

'si entre aujourdhui (Date) et demain (Dte+1) il y a un changement de mois, c'est qu'aujourd'hui est le dernier jour du mois
If Month(Date + 1) <> Month(Date) Then
    If shtjanvier.Range("C39") <> "" Then MotdePasse.Show
End If
    
End Sub
 

sten83

XLDnaute Occasionnel
Re : Critère supplémentaire

Merci pour ce code mais ou dois-je placer la macro?, je joint le fichier, la macro devra se trouver sur les boutons du menu janvier, février, mars ect.... car elle doit vérifier pour chaque mois que la cellule C39 ou C38 pour les mois a 30 jours si il y a des données ou pas, par contre pour le mois de février je ne sais pas comment faire vue les année bisextiles.
Tu peux regarder mon code si tu vois des inchérences n'hésite pas a m'en faire part.
Encore merci de ton aide.
 

Pièces jointes

  • NOUVEAU_GSM.zip
    281.1 KB · Affichages: 14
  • NOUVEAU_GSM.zip
    281.1 KB · Affichages: 12

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

Hello

pour l'instant. je n'ai pas encore regardé grand chose dans le code.. juste le userform activate. et déjà. la.. il me semble qu'il y a un souci..

dans ton code
Code:
Private Sub UserForm_Activate()
If shtjanvier.Range("AB1") = "" Then
    With Me
        .CmdFevrier.Enabled = False
        .CmdMars.Enabled = False
        .CmdAvril.Enabled = False
        .CmdMai.Enabled = False
        .CmdJuin.Enabled = False
        .CmdJuillet.Enabled = False
        .CmdAout.Enabled = False
        .CmdSeptembre.Enabled = False
        .CmdOctobre.Enabled = False
        .CmdNovembre.Enabled = False
        .CmdDecembre.Enabled = False

If shtjanvier.Range("AB1") > 0 Then
    With Me
        .CmdFevrier.Enabled = True
        .CmdMars.Enabled = False
        .CmdAvril.Enabled = False
        .CmdMai.Enabled = False
        .CmdJuin.Enabled = False
        .CmdJuillet.Enabled = False
        .CmdAout.Enabled = False
        .CmdSeptembre.Enabled = False
        .CmdOctobre.Enabled = False
        .CmdNovembre.Enabled = False
        .CmdDecembre.Enabled = False
    End With
End If
        End With
            End If
End Sub
le second if (range("AB1")>0 ne sera jamais testé... car tel qu'il est écrit.. il est imbriqué dans le if (range("AB1")=""

utilise l'indentation de tes lignes de code pour gagner en clarté
c'est ce que j'ai fait dans ton code ci dessus.. et la. tout de suite. tu vois que les derniers End With et End if ne sont pas à leur place.. ca donnerait donc plutot:
Code:
Private Sub UserForm_Activate()
If shtjanvier.Range("AB1") = "" Then
    With Me
        .CmdFevrier.Enabled = False
        .CmdMars.Enabled = False
        .CmdAvril.Enabled = False
        .CmdMai.Enabled = False
        .CmdJuin.Enabled = False
        .CmdJuillet.Enabled = False
        .CmdAout.Enabled = False
        .CmdSeptembre.Enabled = False
        .CmdOctobre.Enabled = False
        .CmdNovembre.Enabled = False
        .CmdDecembre.Enabled = False
    End With
End If

If shtjanvier.Range("AB1") > 0 Then
    With Me
        .CmdFevrier.Enabled = True
        .CmdMars.Enabled = False
        .CmdAvril.Enabled = False
        .CmdMai.Enabled = False
        .CmdJuin.Enabled = False
        .CmdJuillet.Enabled = False
        .CmdAout.Enabled = False
        .CmdSeptembre.Enabled = False
        .CmdOctobre.Enabled = False
        .CmdNovembre.Enabled = False
        .CmdDecembre.Enabled = False
    End With
End If
End Sub
 

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

toujours pour ce code
à l'ouverture du USF, tu vas toujours tester la cellulle AB1 de la feuille Janvier? quelque soit le jour de l'année?

si cette cellule ne contient rien, aucune feuille n'est accessbile car tous les boutons sont désactivés.. j'imagine que tu n'as pas d'autre choix que de sortir..
dans ce cas.. autant signaler par un message que l'utilisateur ne peut rien faire. et fermer directement?

si celle cellule contient une valeur positive (>0) (pourquoi positive.. puisque je vois que tu as mis un "R"
tu n'actives QUE les feuilles Janvier et Février..

et les autres.. elles seront actives quand?


le besoin n'est il pas:
aujourd'hui nous sommes le 16 sept: --> j'autorise toutes les feuilles de Janvier à Septembre SI et seulement si elles sont incomplètes
 

sten83

XLDnaute Occasionnel
Re : Critère supplémentaire

En fait si je fait un test sur la cellule AB1 c'est pour savoir si les informations de l'établissement sont bien là.
Dans la deuxième partie du code c'est juste que pour les autres mois je n'ai pas mis True.
Les autres boutons seront actif une fois la cellule AB1 de janvier renseigner.
Dans le cas contraire un usf s'ouvre pour enregistrer les coordonnées de l'établissement.
 

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

j'ai modifié la sub TestFinMois en fonction

Code:
Function TestFinMois() As Boolean
'retourne vrai si on est en fin de mois. et si la feuille de Janvier contient quelque chose en C39
TestFinMois = (Month(Date + 1) <> Month(Date)) And (shtjanvier.Range("(C39") <> "")
End Function

et dans le code du bouton de janvier, on fait appel à cette fonction
Code:
Private Sub CmdJanvier_Click()
'si la fonction TestFinMois retourne Vrai, il faut alors ouvrir le formulaire de mot de passe
'et si le mot de passe est erroné, la sortie du programme sera exécutée sinon, la suite peut se faire
If TestFinMois Then
    ufMotDePasse.Show
ElseIf shtjanvier.Range("AB1") = "" Then
    MsgBox "Vous devez d'abord entrer les informations" & Chr(13) _
    & "de votre établissement!", vbInformation + vbOKOnly, "Information!"
    ufDonnesParc.Show
Else
    Me.Hide
    shtjanvier.Activate
End If
    
End Sub


j'en profite pour te faire une proposition pour l'activation du formulaire menu
Code:
Private Sub UserForm_Activate()
MoisEnCours = Month(Date)

'si il y a quelque chose en AB1 de la feuille Janvier, alors, on autorise tous les mois jusqu'au mois en cours
If shtjanvier.Range("AB1") <> "" Then
    With Me
        .CmdJanvier.Enabled = True And 1 <= MoisEnCours
        .CmdFevrier.Enabled = True And 2 <= MoisEnCours
        .CmdMars.Enabled = True And 3 <= MoisEnCours
        .CmdAvril.Enabled = True And 4 <= MoisEnCours
        .CmdMai.Enabled = True And 5 <= MoisEnCours
        .CmdJuin.Enabled = True And 6 <= MoisEnCours
        .CmdJuillet.Enabled = True And 7 <= MoisEnCours
        .CmdAout.Enabled = True And 8 <= MoisEnCours
        .CmdSeptembre.Enabled = True And 9 <= MoisEnCours
        .CmdOctobre.Enabled = True And 10 <= MoisEnCours
        .CmdNovembre.Enabled = True And 11 <= MoisEnCours
        .CmdDecembre.Enabled = True And 12 <= MoisEnCours
    End With
End If

'si il n'y a rien en AB1 de Janvier, on autorise uniquement le bouton de Janvier pour aller remplir..
If shtjanvier.Range("AB1") = "" Then
    With Me
        .CmdJanvier.Enabled = True
        .CmdFevrier.Enabled = False
        .CmdMars.Enabled = False
        .CmdAvril.Enabled = False
        .CmdMai.Enabled = False
        .CmdJuin.Enabled = False
        .CmdJuillet.Enabled = False
        .CmdAout.Enabled = False
        .CmdSeptembre.Enabled = False
        .CmdOctobre.Enabled = False
        .CmdNovembre.Enabled = False
        .CmdDecembre.Enabled = False
    End With
End If
End Sub
 

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

J'ai également noté un problème dans tes agenda
avec ton code actuel. le 16 Septembre 2015 est un dimanche.. or. on est mercredi.
le problème vient au moment tu mets la date dans la feuille de janvier à partir du USF : ufDonneesParc
en A9, tu mets la valeur du textbox date du 1er jour..
or.. avec ton format personalisé, ca se transforme en 01 janvier 1900 !!, meme si l'affichage te met bien 01 janvier

avec la modif ci dessous, tu récupères le bon jour

Code:
Private Sub CmdValideInfoParc_Click()
For Each ctrl In Me.Controls
     If TypeName(ctrl) = "TextBox" Then
         If ctrl = "" Then
            MsgBox "Il reste des champs vides! ", vbCritical + vbOKOnly, "Avertissement"
            ctrl.SetFocus
            Exit Sub
         End If
      End If
Next ctrl
For Each cbo In Me.Controls
    If TypeName(cbo) = "ComboBox" Then
        If cbo = "" Then
            MsgBox "Vous devez entrer l'année! ", vbCritical + vbOKOnly, "Avertissement"
            cbo.SetFocus
            Exit Sub
        End If
    End If
Next cbo


With shtjanvier
    .Range("AB1") = txtParc.Value
    .Range("AB2") = txtCodeParc.Value
    .Range("AB3") = txtDirection.Value
    .Range("B58") = txtResponsable.Value
    .Range("F8") = txtPayant1.Value
    .Range("H8") = txtPayant2.Value
    .Range("J8") = txtPayant3.Value
    .Range("M7") = txtNpayant1.Value
    .Range("O7") = txtNpayant2.Value
    .Range("Q7") = txtNpayant3.Value
    .Range("S7") = txtNpayant4.Value
    .Range("U7") = txtNpayant5.Value
    .Range("W7") = txtNpayant6.Value
    .Range("Y7") = txtNpayant7.Value
    .Range("F4") = CboAnnee.Value
    .Range("A9") = DateSerial(CboAnnee.Value, 1, txtDate.Value)
End With
Unload Me

End Sub

ensuite.. pourquoi toutes les feuilles ne commencent elle pas au 1er du mois?: est ce normal et attendu?
 
Dernière édition:

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

du coup, je te propose les formules suivantes
*Pour les premiers de chaque mois
--feuille Janvier A9: date rentrée par ton formulaire (ce devient inutile de demander le 1er jour du mois..suffit de l'imposer. sauf evidemment si tu souhaites pouvoir imposer un début de calendrier à un autre jour.. le 15 de chaque mois par exemple

-- cellules A9 des feuilles Février mars.... décembre
=FIN.MOIS(JANVIER!A9;0)+1 (pour fevrier)
=FIN.MOIS(FEVRIER!A9;0)+1 (pour mars.. etc etc)

pour compléter la colonne A (A10-->A39) de toutes les feuilles
=SIERREUR(SI(MOIS(A9+1)<>MOIS(A9);"";A9+1);"")


autre formule pour la cellule A9: quelque soit la feuille
=FIN.MOIS(INDIRECT(INDEX(ListeMois;EQUIV(A4;ListeMois;0)-1) &"!A9");0)+1

avec ListeMois une zone nommée contenant les 12 mois écris en toutes lettres
 

Pièces jointes

  • NOUVEAU_GSM.xlsm
    343.2 KB · Affichages: 31
Dernière édition:

sten83

XLDnaute Occasionnel
Re : Critère supplémentaire

Effectivement c'est mieux ainsi, par contre avec le code que tu as mis sur le shtjanvier afin de rechercher si la cellule C39 et vide ou non , ce code doit fonctionner pour tous les autres mois, car chaque feuille rempli jusqu’à la fin du mois concerné ne doit pouvoir s'ouvrir qu'avec un mort de passe connu seulement par l'administrateur afin d'éviter la modification des données entrés pour le mois
Comment procéder pour arriver à ce résultat.
En tout cas merci pour ton investissement dans mon projet.
 

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

Hello

ci jointe une nouvelle version du fichier

ce code doit fonctionner pour tous les autres mois,

plutot que de recopier le meme code de controle pour chaque bouton, je l'ai déporté dans une macro "Controle" qu'on appelle avec le nom de la feuille qui correspond au bouton cliqué
 

Pièces jointes

  • NOUVEAU_GSM Rev2.xlsm
    339.9 KB · Affichages: 21

vgendron

XLDnaute Barbatruc
Re : Critère supplémentaire

dans l'exemple que je viens de te fournir, j'ai lancé la macro
et je demande à ouvrir Janvier
le msgbox me dit que je dois avoir les droits d'admin (puisque le controle a identifié la feuille complète - valeur présente le dernier jour)
donc. je saisi le code admin.. et la.. j'arrive sur la feuille Liste.. sans pouvoir sortir du USF autrement qu'en sélectionnant un bouton..

pourquoi aller sur cette feuille Liste sur laquelle on ne peut rien faire?
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz