IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Recalculer une feuille Excel après une modif de style


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut Recalculer une feuille Excel après une modif de style
    Bonjour à toutes et à tous

    D'abord, pour toutes les mauvaises langues qui seraient tentées de penser :
    "Tiens, il nous rend visite parce qu'il a besoin de qque chose ...."
    je leur répondrais que ...

    ben oui..., j'ai une question pour les kings of Excel que vous êtes

    Content de vous retrouver

    Plus sérieusement :

    J'ai une bête fonction personnalisée, affectée dans une cellule, qui compte - dans une plage définie - le nombre de cellules d'une certaine couleur de fond
    Si une donnée est modifiée dans cette plage, pas de soucis, le calcul se fait bien

    La ou ca va beaucoup moins bien, c'est lorsque l'utilisateur modifie manuellement la couleur de fond d'une cellule
    Les formules ne sont pas recalculées

    Ais-je raté qque chose ?

    pour info, ma super fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Function fBackColor(r As Range, Optional l_Color As Long = xlColorIndexNone) As Long
    Dim i_row As Integer, i_col As Integer
        For i_row = 1 To r.Rows.Count
            For i_col = 1 To r.Columns.Count
                If r.Cells(i_row, i_col).Interior.ColorIndex = l_Color Then _
                    fBackColor = fBackColor + 1
            Next i_col
        Next i_row
    End Function
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  2. #2
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Citation Envoyé par ouskel'n'or
    Même si tu fais F9 ?
    Pareil, pas de recalcul

    imagine-toi bien que j'ai essayé tout ce qui pouvait me passer par la tête
    et rien à faire, ce d'excel ne veut pas recalculer si on ne lui modifie pas une valeur dans la feuille
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  3. #3
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    Et si ta fonction lisait d'abord la couleur de fond de la cellule ou de la plage de cellules en quesiton, histoire de vérifier si les valeurs sont les bonnes?

    Sais pas si ça t'aideras. Je lance l'idée en l'air, comme ça.

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Effectivement sans modification de valeur, il n'y aura pas recalcul
    mais tu peux toujours biaiser si ne s'agit que de forcer le recalcul
    en affectant arbitrairement à une cellule ayant une dépendance sa propre valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Feuil1!D11]=[Feuil1!D11]
    par contre détecter la modification de couleur sera une autre paire de manche.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    tu peux tester cette macro pour intercepter l'evenement "changement de couleur" dans les celules


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
    Dim x As Integer
    Dim Cell As String
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
    If Range(Cell).Interior.ColorIndex <> x Then ActiveSheet.Calculate
    x = Target.Interior.ColorIndex
    Cell = Target.Address
    End Sub

    cordialement
    michel

  6. #6
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Citation Envoyé par DarkVader
    par contre détecter la modification de couleur sera une autre paire de manche.
    C'est bien là que le bas blesse !!!

    >>SilkyRoad : l'évenement SelectionChange se déclanche AVANT que la couleur ne soit modifiée

    >>ouskel'n'or : j'aime pas trop l'idée du timer

    Merci quand même à tous, le sujet reste ouvert, si vous avez des idées ...
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour Thierry

    as tu testé la procedure ?
    en fait dans l'exemple ,l'evenement SelectionChange permet de recuperer dans des variables , la couleur et les coordonnéees de la cellule sélectionnée
    lors de la selection suivante , la procedure verifie si l'ancienne selection a été entre temps modifiée


    ci joint une autre version

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Option Explicit
    Dim x As Integer
    Dim Cell As String
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
     
    If Cell = "" Then
    x = Target.Interior.ColorIndex
    Cell = Target.Address
    Exit Sub
    End If
     
    If Range(Cell).Interior.ColorIndex <> x Then ActiveSheet.Calculate
    x = Target.Interior.ColorIndex
    Cell = Target.Address
    End Sub

    bon week end
    michel

  8. #8
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Merci, Michel

    le soucis, c'est que Application.calculate a autant d'effet que F9, cad comme un cataplasme sur une jambe de bois !!!!!
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  9. #9
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par Thierry AIM
    Merci, Michel

    le soucis, c'est que Application.calculate a autant d'effet que F9, cad comme un cataplasme sur une jambe de bois !!!!!

    Citation Envoyé par DarkVader
    Effectivement sans modification de valeur, il n'y aura pas recalcul
    mais tu peux toujours biaiser si ne s'agit que de forcer le recalcul
    en affectant arbitrairement à une cellule ayant une dépendance sa propre valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Feuil1!D11]=[Feuil1!D11]
    par contre détecter la modification de couleur sera une autre paire de manche.
    A quoi il sert que DV il se décarcasse !



    Pour la détection de changement de style,regarder du coté de la création d'un évènement spécifique
    (hook sur la fenêtre de dialogue Format de cellule
    ou plus simlement timer surveillant l'ouverture de cette fenêtre
    titre => Format de cellule
    classeName=> bosa_sdm_XL9).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Bonjour,

    je planchais recemment sur le meme probleme :
    une fonction VBA qui donne la couleur d'une cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function kellecouleur(cel as Range)
         kellecouleur = cel.cells(1).Interior.ColorIndex
    End function
    Je l'utilise comme une fonction Excel dans la feuille.
    Et je voulais que cela se raffraichisse quand l'utilisateur change la couleur.
    Probleme : le changement de couleur n'est pas considéré comme un changement de la valeur de la cellule, donc l'evenement Worksheet_Change ne se declenche pas...

    J'ai cherche et je suis tombe sur ce poste, voila pq j'y reponds, meme s'il date d'il y a 1 an et demi deja...

    Tout d'abord je reponds a :
    Citation Envoyé par ThierryAIM
    le soucis, c'est que Application.calculate a autant d'effet que F9, cad comme un cataplasme sur une jambe de bois !!!!!
    Et bien Application.CalculateFull fonctionne.

    Ensuite, voici ma methode qui fonctionne sous Excel2000, sur le changement de couleur (il faudra l'adapter pour les autres changements de format).
    Dans le module de ThisWorkBook (afin de declencher l'evt sur toutes les feuilles du classeur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
        Call Workbook_SheetSelectionChange(Sh, Selection)
    End Sub
     
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        On Error Resume Next
        ' Attention, faire appel a Dependents fait une boucle avec SelectionChange(Target=Dependent)
        Dim td As Range, addr, colind, colind2, Target2 As Range, cel As Range
        Set td = Target.Dependents
        addr = Target.Address(True, True, xlA1, True)
        If Err.Number = 0 Then
            Do While addr = Selection.Address(True, True, xlA1, True)
                ' Couleur de la 1ere cellule
                colind = Target.Cells(1).Interior.ColorIndex
                colind2 = colind
                Set Target2 = Target
                If Target.Cells.Count > 1 Then
                    ' Recherche une autre cellule dans la plage de couleur differente
                    For Each cel In Target.Cells
                        If colind <> cel.Interior.ColorIndex Then
                            colind2 = cel.Interior.ColorIndex
                            Set Target2 = cel
                            Exit For
                        End If
                    Next cel
                End If
                Do While colind = Target.Cells(1).Interior.ColorIndex And _
                         colind2 = Target2.Cells(1).Interior.ColorIndex And _
                         addr = Selection.Address(True, True, xlA1, True)
                    DoEvents
                Loop
                Set Target2 = Nothing
                'Application.CalculateFull : serait un peut trop lourd s'il y a bcp de formules
                For Each cel In td.Cells
                    ' cel.Calculate ne fonctionne pas car cela revient a faire
                    ' le [F9] manuellement qui ne fonctionne pas
                    ' mais Application.CalculateFull fonctionnerait
                    cel.FormulaLocal = cel.FormulaLocal
                Next cel
                Set cel = Nothing
                DoEvents
            Loop
        Else
            Err.Clear
        End If
        Set td = Nothing
    End Sub
    Comme precisé dans le code, j'ai eu un petit probleme avec le Target.Dependents, car si Target a bien des dependants, il appelle a cet endroit-la la fonction SelectionChange pour Target:=dependant (qui lui n'a pas forcement de dependant et genere alors une erreur) -> c'est pq j'ai du ruse avec le Err.Number=0, mais je ne comprends pas vraiment pq Excel fait cela (je suppose qu'il va chercher les cellules dependantes comme s'il voulait afficher les fleches).

    Voila, j'espere que cela fonctionnera egalement chez vous sans bug...
    PS. desole, je n'ai pas mis trop de commentaires dans le code, j'espere que ca sera clair quand meme...

Discussions similaires

  1. Sélection d'une feuille excel avec une listbox
    Par felibelle dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/07/2022, 17h27
  2. Réponses: 7
    Dernier message: 11/07/2017, 16h31
  3. [XL-2007] copier une feuille excel d'une instance excel à une autre
    Par marcelisa2 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/03/2012, 23h44
  4. Appeler une feuille excel grace à une Listbox
    Par eltess dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/12/2005, 23h37
  5. Réponses: 5
    Dernier message: 05/07/2005, 20h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo