XL 2010 Macro qui ne fonctionne pas avec une MFC

Myst

XLDnaute Occasionnel
Bonsoir le forum
J'ai un petit problème avec mon fichier, actuellement tout fonctionne sauf la relation entre les macro et les MFC Je m'explique, dans les cellules de la colonne D en fonction du texte saisie celui-ci change de couleur par l'action d'une MFC, ensuite les macros devraient prendre le relais mais là ça ne fonctionne pas
Il faut que je donne la couleur manuellement au texte pour que la macro la prenne en comptes
Comment pourrai je faire ?
merci
 

Pièces jointes

  • Myst V1.xlsm
    135.8 KB · Affichages: 64

Myst

XLDnaute Occasionnel
Re
Malheureusement je crois que je perd mon temps et plus grave je vous fais perdre le votre
Je vais rester sur mon fichier de base avec les 52 userform car a ce rythme là je n'aurais toujours pas compris dans 6 mois
Un grand merci du temps que vous m'avez consacré
Amicalement, Myst
 

Dranreb

XLDnaute Barbatruc
Vous devriez quand même essayer en replaçant tous les Cells(L, C) par Plage(L', C) dans l'UFm Machine en remplaçant tous les L par des L primes obtenus en retranchant au L initial le numéro de ligne de départ dans la feuille de la 1 ère ligne de la première semaine. Une fois au point ça marchera forcément pour toutes les semaines avec les même numéros de lignes internes à n'importe quelle semaine.
Si vous préfériez vous pourriez aussi travailler avec des Plage(1, 1).Offset(L, C)
ou même transmettre à la méthode Afficher juste la cellule du coin haut gauche, la récupérer sous le nom CelHG plutôt que Plage, et faire des CelHG.Offset(L, C)
L et C étant bien sur toujours des expressions (ou constantes ou variables) représentant des nombre de lignes et de colonnes par rapport à la cellule coin haut gauche de départ de la semaine.
 
Dernière édition:

Myst

XLDnaute Occasionnel
BonjourDranreb
Je ne comprend rien, je ne vois aucun L a remplacer
La ligne "If Intersect(Me.Columns("A"), Target) Is Nothing Then Exit Sub " n'empêche pas la procédure de réagir seulement à la sélection d'une plage fusionnée de semaine dans la colonne A et de plus j'ai une erreur sur "Me.Columns" :mad:
 

Myst

XLDnaute Occasionnel
Re
Erreur, erreur et encore erreur, ça ne prend pas les ( ' )

Private Sub CommandButton1_Click()
Dim I As Long
For I = 1 To 7
If Not Me.Controls("CheckBox" & I).Value Then
Plage(2', 7 + I).Font.ColorIndex = xlAutomatic
Plage(2', 7 + I).Interior.ColorIndex = 1
Else
Plage(2', 7 + I).Font.ColorIndex = 2
End If
Next
 

Dranreb

XLDnaute Barbatruc
Non, faut pas mettre d'apostrophes derrière les numéro de lignes relatifs.

Et la If Intersect(Me.Columns("A"), Target) Is Nothing Then Exit Sub
c'est au début de la Worksheet_SelectionChange dans le module de la feuille qu'il faut le mettre, pas dans l'UserForm.
 
Dernière édition:

Myst

XLDnaute Occasionnel
Bonsoir Dranreb, le forum
J'ai réussi a mettre en application vos conseils sur la sélection des semaines de la colonne A seulement, en faite il a fallut que je ferme le fichier pour que les codes s'activent, je ne sais pas pourquoi ? bref, actuellement il me reste la gestion des différentes semaines et là j'ai pas tout compris, un petit coup de pouce sans être trop technique pourrait m'aider a continuer
Ci-dessous la situation actuelle
merçi

VB:
Private Sub CommandButton1_Click()
    Dim I As Long
     For I = 1 To 7
         If Not Me.Controls("CheckBox" & I).Value Then
         Plage(1, 1).Offset(2, 7).Font.ColorIndex = xlAutomatic
         Plage(1, 1).Offset(2, 7).Interior.ColorIndex = 1
         Else
         Plage(1, 1).Offset(2, 7).Font.ColorIndex = 2
         End If
     Next
    Dim c As Control
For Each c In Me.Controls
Select Case TypeName(c)
Case "CheckBox"
c.Value = False
End Select
Next c
'fermer l'userform
Me.Hide
LastLigne = 23
LastColonne = 15
'mise à jour de la couleur de police selon la colonne D
For I = 3 To LastLigne
      CouleurPolice = Range("D" & I).Font.ColorIndex
Range("E" & I).Resize(1, LastColonne - 4).Interior.ColorIndex = CouleurPolice
Next I
'mise à jour de la couleur de cellule (gris) selon le contenu de la ligne 2
For j = 5 To LastColonne
      If Plage(1, 1).Offset(2, 7).Font.ColorIndex = xlAutomatic Then
          Plage(1, 1).Offset(3, 7).Resize(LastLigne - 2, 1).Interior.ColorIndex = 16 'gris
     End If
      'mise à jour en rouge des cellules vides  et police "blanc" en ligne 2
     If Plage(1, 1).Offset(2, 7).Font.ColorIndex = 2 Then 'couleur blanc
         For k = 3 To LastLigne
              If Plage(1, 1).Offset(3, 7) = "" Then Plage(1, 1).Offset(3, 7).Interior.ColorIndex = 3 'couleur Rouge
         Next k
      End If
Next j
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Normalement si j'ai bien compris c'est partout qu'il faut utiliser Plage à la place de Range ou Cells.
Si I est bien le numéro de ligne relatif c'est
VB:
CouleurPolice = Plage.Cells(I, "D").Font.ColorIndex
Plage.Cells(I, "E").Resize(, LastColonne - 4).Interior.ColorIndex = CouleurPolice
ou bien
VB:
CouleurPolice = Plage(I, 4).Font.ColorIndex
Plage(I, 5).Resize(, LastColonne - 4).Interior.ColorIndex = CouleurPolice

Avez vous bien écrit la méthode Afficher dans l'UserForm pour lui transmettre la plage de la semaine à traiter ?

À part ça Plage(1, 1).Offset(2, 7) c'est un peu idiot (mais je sais que c'est moi qui en avais parlé, je ne sais plus trop pourquoi), c'est la même chose que Plage(3, 8)

Moi j'utilise toujours des noms de variables commençant par L pour les lignes et C pour les colonnes.
 

Myst

XLDnaute Occasionnel
Bonjour Dranreb, le forum
Je n'arrive pas a finir les sélections, a chaque fois je suis décallé d'un ligne, j'ai retourné le probléme dans tous les sens mais rien a faire, un petit coup de pouce
merci
VB:
Private Sub CommandButton1_Click()
     Dim I As Long
     For I = 1 To 7
         If Not Me.Controls("CheckBox" & I).Value Then
             Plage.Cells(1, 7 + I).Font.ColorIndex = xlAutomatic
             Plage.Cells(1, 7 + I).Interior.ColorIndex = 1
         Else
             Plage.Cells(1, 7 + I).Font.ColorIndex = 2
         End If
     Next
    Dim c As Control
For Each c In Me.Controls
Select Case TypeName(c)
Case "CheckBox"
c.Value = False
End Select
Next c
'fermer l'userform
Me.Hide
LastLigne = 22
LastColonne = 16
'mise à jour de la couleur de police selon la colonne D
For I = 2 To LastLigne
CouleurPolice = Plage.Cells(I, "D").Font.ColorIndex
Plage.Cells(I, "E").Resize(, LastColonne - 4).Interior.ColorIndex = CouleurPolice
Next I
'mise à jour de la couleur de cellule (gris) selon le contenu de la ligne 2
For j = 5 To LastColonne
      If Plage.Cells(4, j).Font.ColorIndex = xlAutomatic Then
          Plage.Cells(3, j).Resize(LastLigne - 2, 1).Interior.ColorIndex = 16 'gris
        End If
     ' mise à jour en rouge des cellules vides  et police "blanc" en ligne 2
      If Plage.Cells(I, "E").Font.ColorIndex = 2 Then 'couleur blanc
         For k = 3 To LastLigne
              If Plage.Cells(k, j) = "" Then Plage.Cells(k, j).Interior.ColorIndex = 3 'couleur Rouge
         Next k
      End If
Next j
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Avant d'aller à la douche, une suggestion en passant
Utiliser un module de classe pour le click sur les commandbutton
1) Insérer module de classe
Le renommer ButtonEvents
Y coller le code VBA suivant
VB:
Public WithEvents cmdButton As MSForms.CommandButton
Private Sub cmdButton_Click()
' Cette macro est juste un exemple pour identifier l'adresse des tableaux pour chaque semaine
Dim X$
X = cmdButton.TopLeftCell.Offset(1, 2).Resize(21, 13).Address
MsgBox X ' pour test
LastLigne = Split(X, "$")(UBound(Split(X, "$"))) * 1
MsgBox LastLigne
End Sub
Dans le code de la feuille contenant les CommandButton
VB:
Dim arrEvents As Collection
Private Sub Worksheet_Activate()
Dim objButtonEvents As ButtonEvents
Dim shp As Shape
Set arrEvents = New Collection
For Each shpCursor In Me.Shapes
    If shpCursor.Type = msoOLEControlObject Then
        If TypeOf shpCursor.OLEFormat.Object.Object Is MSForms.CommandButton Then
            Set objButtonEvents = New ButtonEvents
            Set objButtonEvents.cmdButton = shpCursor.OLEFormat.Object.Object
            arrEvents.Add objButtonEvents
        End If
    End If
Next
End Sub
Ainsi quand on clique sur un CommandButton, on a la bonne plage de cellules
Exemple si on clique sur le premier bouton, s'affiche alors :
D3:p23
Et puis 23 (qui correspond bien à la dernière ligne du premier tableau)

Le souci, c'est que si tu suis cette piste, il faudra remanier le code de ton projet.
Et comme le dit Dranreb, on pourrait se contenter d'un seul Userform.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Après la douche, une petitte correction
Dans un module standard, mettre cette ligne
Public LastLigne As Long
Juste pour tester, dans un userform, un CommandButton avec ce code
VB:
Private Sub CommandButton1_Click()
MsgBox LastLigne
Me.Hide
End Sub
Quand on clique sur un bouton, dans la feuille, l'userform s'affiche et quand on clique sur le CommanButton de l'userform on récupère bien LastLigne.
 

Myst

XLDnaute Occasionnel
Bonsoir Staple1600, Dranreb
Merci pour les propositions mais n'ayant pas pu aller au bout d'une solution a un seul userform au lieu de 52 je vais définitivement laisser tomber :( et continuer avec mon fichier de base moins aboutis mais opérationnel
Plus de 40 heures sur le problème me semble suffisant :mad:
Dommage, encore merci du temps que vous m'avez consacré:)
Myst
 

Myst

XLDnaute Occasionnel
Re
Ça veut dire quoi, pour vous c'est désespéré ?
Je ne suis pas programmeur de métier monsieur et je fais ce que je peux, peut être pas assez a vos yeux mais pour moi ce n'est qu'un passe temps
Désolé de ne pas avoir été a la hauteur de vos explications
Amicalement? Myst
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87