Cases activées et désactivées

Bonjour à tous,

Je viens vers vos lumières pour m'éclairer dans ma problématique.

8essai-absence.xlsx (32.27 Ko)

1/ Je dois créer des cases, sur la plages e6:f19 où si je coche e6, f6 est obligatoirement décochée, et vice-versa.

Toujours dans la même problématique, si f6 est cochée, il doit y avoir une justification : donc une des cases de la plage i6:y6 devra être cochée. Il serait appréciable que si aucune case de cette dernière plage n'est cochée, je ne puisse pas passer à la ligne suivante.

2/ les totaux doivent s'implémenter en ligne 49.

3/ Je souhaiterais un bouton d'enregistrement qui permettrait d'envoyer par mail un fichier spécifique avec mention de mon service (en case a1 par exemple), associé à une date et une heure précise d'appui sur ledit bouton d'enregistrement.

Exemple : je clique sur "enregistrer" et le destinataire reçoit le tableau avec Compta_201120_1637.

J'espère avoir été limpide et je vous remercie déjà de vos réponses qui m'ont toujours été précieuses.

PY

Bonsoir

1/ Je dois créer des cases, sur la plages e6:f19 où si je coche e6, f6 est obligatoirement décochée, et vice-versa.

- Clique droite sur votre onglet EFFECTIF
- Choisissez "Visualiser le code"
- Coller le code ci-dessous
- Enregistrer votre fichier au format XLSM

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("E6:F19")) Is Nothing And Range("C" & Target.Row) <> "" Then
   Select Case Target.Column
    Case Is = 5
        With Target
            .ClearContents
            .FormulaR1C1 = "R"
            .Font.Name = "Wingdings 2"
            .Font.Size = 14
            With .Offset(0, 1)
                .ClearContents
                .FormulaR1C1 = "o"
                .Font.Name = "Wingdings"
                .Font.Size = 14
            End With
        End With

    Case Is = 6
        With Target
            .ClearContents
            .FormulaR1C1 = "R"
            .Font.Name = "Wingdings 2"
            .Font.Size = 14
            With .Offset(0, -1)
                .ClearContents
                .FormulaR1C1 = "o"
                .Font.Name = "Wingdings"
                .Font.Size = 14
            End With
        End With
    End Select

End If
End Sub

2/ les totaux doivent s'implémenter en ligne 49.

Vous pouvez mettre cette formule en E49 --> =NB.SI(E6:E48;"R") puis tirer à droite pour F49

NB: j'ai modifié la ligne 3 du code dans mon post précédent

@ Dan, merci pour ce début de réponse. Il me manque :

Toujours dans la même problématique, si f6 est cochée, il doit y avoir une justification : donc une des cases de la plage i6:y6 devra être cochée. Il serait appréciable que si aucune case de cette dernière plage n'est cochée, je ne puisse pas passer à la ligne suivante.

Pour le 2/, je pensais bien à nbval. J'aurai vraiment pu me débrouiller seul sur celui-là !

Je prends de votre temps, certainement. Je bloque aussi sur le 3/.

Merci malgré tout pour cette réponse qui me met sur la voie.

4essai-absence.xlsx (32.27 Ko)

Par souci de lisibilité, j'ai remplacé le Wingdings par du Times New Roman (les "R" par des "1" et les "o" par des "0").

Dois-je partir du même postulat pour créer une macro sur le même modèle avec 17 sous-macro pratiquement identiques ?

Si f6 est "1", l'une des cases de i6 à y6 doit être égale à "1". On ne peut passer à f7 tant que l'une des cases (i6:y6) n'est pas égale à "1"...

En corrélation, si e6 = "1", il faudrait "clearer" la plage (i6:y6).

Je sais être un débutant !!!

Par souci de lisibilité, j'ai remplacé le Wingdings par du Times New Roman (les "R" par des "1" et les "o" par des "0").

Pas de soucis. C'est vous qui aviez demandé des cases à cocher.

Il n'y a plus aucun code dans le fichier ... Pourquoi le poster vous en xlsx ?

Dois-je partir du même postulat pour créer une macro sur le même modèle avec 17 sous-macro pratiquement identiques ?

??? pourquoi. Une seule macro suffira

Désolé, une erreur ! En fait, j'ai 2 ordi et celui où je suis a encore Excel 2007. Je cafouille un peu dans les versions.

Ce fichier devrait être plus "lisible"...

7essai-absence.xlsm (37.97 Ko)

@ Dan :

Quand je parlais de postulat, je voulais dire : est-ce que je dois prendre la même architecture Case is = 9 (pour la colonne I) ?

Si c'est le cas, la macro me parait extrêmement longues à taper (17 cases possibles donc 16 cases à décocher si une est sur 1, à multiplier aussi par 6 lignes à chaque fois, soit 1632 lignes de codes !)

Help...

Bonjour

Votre fichier en retour pour test

Pour ce qui concerne l'envoi pas mail,
- que devez-vous envoyer dans cette feuille ?
- est-ce que cette feuille compote des formules ?
- quelle est la messagerie que vous utilisez ?
- Dans quel répertoire est sauvegardé le fichier ?

N'oubliez pas que vous avez des options dans excel qui vous permettent de mettre un fichier à disposition (exporter, partager, etc...) Le tout est de voir comment vous êtes organisé avec la compta.

Petit conseil, évitez les cellules fusionnées quand cela est possible. Avec VBA cela provoque toujours des soucis. J'ai défusionné la date et "Situation..". Cela donne le même résultat dans votre fichier

Bonjour,

Merci pour ce travail qui correspond en partie.

J'ai rentré la ligne 6 en exemple avec ce qu'il faudrait éviter. En l'occurrence, de i6 à y6, une seule case peut être remplie avec la valeur 1. Je veux absolument éviter les doublons.

Pour l'envoi du fichier, c'est une copie de ce tableau en format excel, sachant que le service centralisateur récupère le même tableau de la part des autres services. Dans mon exemple, je suis Compta (en cellule a1...). Je pensais utiliser "concatener", sauf que la date change automatiquement en e2 ( =aujourd'hui() ). Donc si je clique sur ce bouton (à créer), j'aurai voulu que ce tableau soit renvoyé tel quel, avec le nom de mon service et la date du jour d'envoi. Ainsi, le fichier du 20 est différent de celui du 21, etc...

Bonjour…

Petites remarques :

Il est toujours difficile de donner une réponse précise dans un grand processus morcelé*.

Excel aime bien le Tableau (structuré) et nous le rend bien !

Voilà ci-joint une autre proposition, avec de petites retouches, sur les demandes de gestion des cas(es), en supprimant les dernières colonnes inutiles pour le problème posé.

La plus intéressante est de se dire que lorsqu'on a le choix entre 2 options, il suffit de n'en traiter qu'une. J'ai donc supprimé la colonne "Absence".

Avec cela, la plage d'étude étant initialisée en un Tableau nommé TB ici,

Dim L As Byte 'ne pas confondre la ligne de la feuille  avec la ligne du tableau
Private Sub Worksheet_SelectionChange(ByVal R As Range)
    If R.CountLarge > 1 Then Exit Sub    'traitement réduit à 1 cellule
    'option de la présence
    If Not Intersect(R, [TB].Columns(5)) Is Nothing Then
        If R(1, -1) <> "" Then R = IIf(R = "", "x", ""): R(1, 2).Select
    End If
    'option du motif (plus compliqué avec plus de 2 choix)
    If Not Intersect(R, [TB[[MALADIE]:[AUTORISATION SPECIALE]]]) Is Nothing Then
        L = R.Row - [TB].Row + 1         'ne pas confondre la ligne de la feuille  avec celle du tableau
        If [TB].Item(L, 5) = "x" Then    'selon la présence ou pas
            If R = "" Then
                [TB].Item(L, 8).Resize(1, 12) = "": R = "x"    '12 cas ici
            Else
               R = ""
            End If
            [TB].Item(L, 7).Select       'pour l'effet bascule
        End If
    End If
End Sub

* sans avoir l'évènementielle de changement du contenu d'une cellule. Si elle est développée, il faudra ajouter au tout début, Application.EnableEvents=0 et à la fin, Application.EnableEvents = 1 ! J'ai fait l'impasse sur le Prénom.

Nota : avec un tel tableau, il est plus intéressant de placer les décomptes au-dessus plutôt qu'au-dessous pour les gérer avec d'éventuelles filtrations.

J'ai rentré la ligne 6 en exemple avec ce qu'il faudrait éviter. En l'occurrence, de i6 à y6, une seule case peut être remplie avec la valeur 1. Je veux absolument éviter les doublons

Vous n'en aviez pas parlé. Mais vous pouvez ajouter ce code en dessous de l'autre.

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("I6:y19")) Is Nothing And Range("C" & Target.Row) <> "" Then
    If WorksheetFunction.CountA(Range("I" & Target.Row & ":Y" & Target.Row)) > 1 Then
        MsgBox "Vous ne pouvez pas avoir plus d'une absence mentionnée"
        Application.Undo: Exit Sub
    End If
End If
End Sub

C'est juste une idée mais on pourrait faire en sorte que si vous mettez un chiffre 1 en colonne E, la plage I à Y de la ligne soit automatiquement effacée. Si cela vous intéresse rajoutez cette ligne dans le code Private Sub Worksheet_SelectionChange(ByVal Target As Range) juste en dessous de la ligne Case is = 5

Range("I" & Target.Row & ":Y" & Target.Row).ClearContents

Cela évite de conserver une donnée entre I et Y, si vous mettez un chiffre 1 en colonne E alors qu'il y avait un chiffre 1 en colonne F (cas d'erreur d'encodage ou changement suite à modification).

pt 3 : Pour l'envoi par mail, j'ai besoin des infos dont je vous ai parlé dans mon post précédent

Cordialement

Rechercher des sujets similaires à "cases activees desactivees"