MFC / VBA

lio

XLDnaute Occasionnel
Bonjour le forum,

Sur un planning, j'ai placé un format conditionnel pour colorer les samedis, dimanches et jous fériés.

Grâce à un Usf je place des couleurs qui correspondent aux C.Annuel, WE Travaillé... avec une méthode que Robert a présenté sur la compile 'Calendrier et Planning 2005' dans la zone de téléchargement. (Super au passage).

J'ai légèrement modifié son code en plaçant sur les cellules en plus des couleurs, des lettres du type CA ou WE pour comptabiliser beaucoup plus facilement.

Maintenant, je souhaiterai faire une gestion d'erreur. Voici donc ma question:

Comment peut-on interdire la saisie de WE Travaillé lorsqu'on est pas le WE! et inversement.

Dans mon code, il y ceci dans un module:
Public Sub defcoul()
Dim Coul As Long
Coul = RGB(R, G, B)
With Selection
.Interior.Color = Coul 'attribue la couleur de remplissage Coul à la sélection
.Font.Color = Coul 'attribue la couleur de poloce Coul à la sélection
End With
ActiveCell.Select
End Sub

puis ceci dans mon USF:
Private Sub CmdBlack_Click() 'bouton 'WE Travaille'
R = 0: G = 0: B = 0
Selection.Value = 'WE'
Selection.Font.Bold = True
Selection.Font.Size = 4
Variable.defcoul
End Sub

etc...

Comme ma MFC est en gris pour les samedi et dimanche, je pensais mettre un code du type:
Private Sub CmdBlack_Click()
If Selection.ColorIndex=15 then Exit Sub
R = 0: G = 0: B = 0
Selection.Value = 'WE'
Selection.Font.Bold = True
Selection.Font.Size = 4
Variable.defcoul
End Sub

Mais ça ne fonctionne pas !

Si quelqu'un à une solution ?

Merci et bonne soirée.
 

Charly2

Nous a quittés en 2006
Repose en paix
Bonsoir lio, bonsoir à toutes et à tous :)

lio, si tu utilises une mise en forme conditionnelle, il faut savoir que le test sur les couleurs ne fonctionnera pas. Dès lors, il faut que tu testes la condition elle-même ; par exemple pour les samedi et dimanche :

If WeekDay(TaCelluleContenantLaDate, 2) > 5 Then
  ' Ton code
End If

A+
 

lio

XLDnaute Occasionnel
Bonjour Charly2, le forum,

Merci Charly pour ta réponse. Mon problème c'est que mes dates sont sur cette plage C5 à BL5. Je débute en VBA et je ne sais pas trop comment faire...

J'aurai eu tendance à faire des variables pour définir 'maligne' ( n°5)et mes colonnes 'x'( 62 au total).

et ensuite écrire un code du style:
Dim x As Integer
Dim maligne As Variant

x=3 to 65
maligne= .Range (.cells(5,x)

If WeekDay(maligne, 2) > 5 Then Exit Sub
' Le code
End Sub

Je n'est pas encore testé mais je suis sûr que je vais prendre un 'vent'. C'est les joies du VBA, non !

Merci pour les explications que tu pourrais m'apporter.

Salutations. Lio.

PS: Juste pour info, j'ai repris la trame du Planning de Marc du 78. Je sais que tu l'avais aidé.

Message édité par: lio, à: 20/01/2006 09:30
 

Charly2

Nous a quittés en 2006
Repose en paix
Bonjour lio :)

Effectivement, avec ton bout de code, VBA risque de faire la tête. C'est qu'il est très à cheval sur la syntaxe et puis très susceptible aussi. ;)

Maintenant, ce que tu as écrit est très intéressant car si tu as pris exemple sur le planning de Marc, tu dois avoir l'utilitaire MFC multiples de Didier_mDF. Et si c'est bien le cas, tu peux effectivement tester tes couleurs :)

Par contre, pour t'aider, il serait souhaitable que tu joignes un fichier, épuré de données confidentielles, avec ton code et quelques expications complémentaires.

A+
 

lio

XLDnaute Occasionnel
Re Charly,

Merci pour la réponse. Je vais alors te joindre le fichier allégé. Pour l'info, je n'ai pas gardé la mise en forme conditionnelle de MDFriend. En fait, j'ai fait un mix avec le fichier 'version commune du planning de Marc du 78' et un planning de Sir Robert.( plus ludique je pense).

A bientot. Lio.
 

lio

XLDnaute Occasionnel
Re,

Voici donc le fichier.

Merci. lio. [file name=PlanningV18.zip size=18772]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PlanningV18.zip[/file]
 

Pièces jointes

  • PlanningV18.zip
    18.3 KB · Affichages: 29

Charly2

Nous a quittés en 2006
Repose en paix
Bonsoir lio :)

Désolé de répondre aussi tard mais je n'ai pas eu trop de temps à moi cet AM :p

Je te joins ton fichier modifié pour répondre (à priori) à ta demande. Verifie-le bien car chez moi, il est anormalement lent, mais bon je n'ai quasiment rien en RAM et un disque presque saturé ;)

S'il est également lent chez toi, j'essaierai de voir ce que je peux faire pour le booster...

[file name=PlanningV19.zip size=21051]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PlanningV19.zip[/file]

A+
 

Pièces jointes

  • PlanningV19.zip
    20.6 KB · Affichages: 42

lio

XLDnaute Occasionnel
Re,

Bon voila, j'ai regardé le code de plus près et j'ai 3 questions:

1- Peut tu me décripter cette ligne de code:
WeekDay(Cells(5, ((.Column - 1) \\ 2) * 2 + 1), 2) > 5

2- J'ai introduit une Msg Box 'Saisie refusée' mais avec ta méthode ( traitement cellule par cellule), j'ai autant de Msg que de cellules sélectionnées qui apparaissent! ( bon ça c'est du détail et je vais faire des recherches).

3- J'ai testé avec Application.ScreenUpdating et le résultat est impressionnant ! J'ai regardé sur l'aide et elle dit que je peux plus suivre ma macro... En ce qui me concerne si je fait F8 (suivi pas à pas)aucun problème !
Mais avec une telle efficacité pourquoi toute les macros du forum ne contiennent pas ces 2 petites lignes...?

Enfin, je te remercie également pour m'avoir bonifié le code dans le module 'feuille'. ( futé comme un singe ce lionel :silly: )

En tout cas merci beaucoup, et bonne journée.
 

Charly2

Nous a quittés en 2006
Repose en paix
Re Lionel :)

Je réponds à tes questions :

1) Si tu as regardé dans l'aide la fonction WeekDay, tu as dû voir qu'elle renvoie une valeur de 1 à 7 :
Weekday(date, firstdayofweek) - Aide VBA.
Dans ce que j'ai écrit, j'ai choisi le lundi comme premier jour de la semaine (paramètre 2) : WeekDay(date, 2).

Voilà pour la fonction elle-même. Maintenant pour le paramètre date, je l'ai pris en ligne 5 de la cellule actuellement traitée : Cells(5, ((.Column - 1) | 2) * 2 + 1) -> remplacer | par antislash.

Je pense que cela ne pose pas de problème pour la ligne 5 (on y trouve la date du jour en cours de traitement), par contre, le calcul de la colonne est un peu moins évident. Tu pourras vérifier, sous vba que C5 = 01/01, que D5 est vide, E5 = 02/01, F5 est vide etc.
Il fallait donc que la cellule en cous de traitement donne la bonne colonne... La formule que j'ai choisie donne la colonne impair inférieure ou égale à la colonne de la cellule traitée !

Ex.1 : Si Cell est Cn (n étant une ligne quelconque), on a .Column - 1 = 2, puis 2 | 2 = 1, enfin 1 * 2 + 1 = 3 (soit la colonne C)

Ex.2 : Si Cell est Dn (n étant une ligne quelconque), on a .Column - 1 = 3, puis 3 | 2 = 1, enfin 1 * 2 + 1 = 3, donc également la colonne C !!!

X antislash Y correspond à la division entière (ou le quotient d'une division euclidienne).

2) Tu peux essayer (non testé) :

Private Sub CmdBlack_Click() 'bouton 'WE Travaille'
'
Dim B_TraitementPartiel As Boolean
Dim B_TraitementTotal As Boolean
'
  Application.ScreenUpdating = False
  R = 0: G = 0: B = 0

  B_TraitementPartiel = False
  B_TraitementTotal = True
  For Each Cell In Selection
    With Cell
      If .Column >= 3 Then
        If WeekDay(Cells(5, ((.Column - 1) \\ 2) * 2 + 1), 2) > 5 Then
          .Value = 'WE'
          .Font.Bold = True
          .Font.Size = 4
          Variable.defcoul
          B_TraitementPartiel = True
        Else
          B_TraitementTotal = False
        End If
      End If
    End With
  Next Cell
  ActiveCell.Select
  If Not B_TraitementTotal Then
    If B_TraitementPartiel Then
      ' MsgBox quelques cellules non modifiées
    Else
      ' MsgBox aucune cellule modifiée
    End If
  End If
  Application.ScreenUpdating = True
End Sub

3) Personnellement, j'utilise ces instructions systématiquement sauf pendant la phase de test ou quand l'écran n'est pas mis à jour par la macro.

A+ et merci de ton merci ;)
 

lio

XLDnaute Occasionnel
Salut Charly,

Un mot: MERCI

J'apprécie la qualité de tes interventions depuis tes débuts sur XLD. Bonne route vers ton 1000 ème posts.

Je viens de me commander cet aprem un livre 'VBA pour Excel 2000' de Stéphan Bullen pour combler mes lacunes en VBA et tenté d'être un peu plus autonome.

C'est grâce à des gens comme toi, que je me suis intéressé aux faces 'cachés' d'Excel et je suis toujours étonné des possibilités offertes par cet outil.

Cordialement. Lio.
 

lio

XLDnaute Occasionnel
Bonjour Charly,

J'ai testé de mettre le bout de code indiqué. Pour les congés annuel : aucun problème. Par contre pour les WE travaillés, si je fais une sélection multiple sur des WE et sur des jours ouvrés, j'ai un petit soucci. A savoir que les jours ouvrés se colorent... Alors je bataille, je recherche et je fouille mais je ne trouve pas.

Si tes lumières pouvaient encore m'éclairées ... :p

Merci.


PS: Ci-joint le fichier légèrement différent ... [file name=Testnegatif.zip size=33066]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Testnegatif.zip[/file]

Message édité par: lio, à: 22/01/2006 17:32
 

Pièces jointes

  • Testnegatif.zip
    32.3 KB · Affichages: 19

Charly2

Nous a quittés en 2006
Repose en paix
Bonsoir Lionel,

J'ai fait quelques modifications (très peu en fait) dans le code de l'USF et dans ton module 'Variable'.

Je pense que tu trouveras facilement ce qui a été modifié car j'ai mis des commentaires assez visibles ;)

[file name=Testnegatif_20060122190417.zip size=27075]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Testnegatif_20060122190417.zip[/file]

A+
 

Pièces jointes

  • Testnegatif_20060122190417.zip
    26.4 KB · Affichages: 25

Discussions similaires

Réponses
0
Affichages
175
  • Résolu(e)
Microsoft 365 Fond de couleur
Réponses
2
Affichages
739

Statistiques des forums

Discussions
312 429
Messages
2 088 351
Membres
103 824
dernier inscrit
frederic.marien@proximus.