Aide sur code

Bonjour à tous

De retour depuis un bon moment d'absence mais toujours fier d'être parmi vous. Voilà il y a quelque temps j'ai créé rapidement le fichier en PJ pour mon travail, mais voilà quelques améliorations sont à faire et je viens donc chercher de l'aide auprès de vous.

Dans ThisWorbook du classeur il y une macro qui permet de calculer automatiquement la 1ère colonne au Change de la colonne (Date à revoir).

J'aimerai le même principe pour chaque feuille mais à l'activation de chaque feuille afin d'avoir la mise à jour de la 1ère colonne quand on ouvre une feuille voulu. Comment peut on faire ?

Merci à vous

Cdlt

Bonsoir,

après deux essais pas de fichier utilisables...

@ voir donc sinon je pense il n'y aura pas de réponse...

@ bientôt

LouReeD

Bonjour LouReeD

désolé je ne comprends pas pourquoi, certainement une erreur de ma part.

voici un nouvel essai.

Cdlt

Bonsoir,

essayez de mettre le code voulu dans "thisworkbook" avec la sub suivante :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

End Sub

Elle permet de "lancer" un code à chaque activation de feuille quel qu'elle soit.

Il faudra peut-être ajouter une gestion d'erreur afin de ne pas créer de bug si c'est une feuille sur laquelle il ne faut pas faire tourner le code...

@ bientôt

LouReeD


L'erreur à l'ouverture du fichier vient du fait que c'est un fichier Excel 2007 ou plus avec des macros mais vous avez mis une extension .xlsX hors il faut un .xlsM

@ bientôt

LouReeD

Salut LouReed !

Je crois que Pompaero (salut !) n'y est pour rien. Depuis quelques temps déjà la bascule d'extension .xlsm en .xlsx arrive quasi systématiquement avec CJoint. Il faut remodifier l'extension pour qu'il s'ouvre...

Cordialement.

Salut LouReeD et MFerrand

Merci à vous

Je confirme, mon classeur est bien en xlsM, bien vu MFerrand pour la bascule avec CJoint, à surveiller alors.

LouReeD, j'ai bien tenté mon code déjà existant avec ta proposition mais ça bug sur le Target

If Not Intersect(Sh.Columns(Chr(64 + k) & ":" & Chr(65 + k)), Target) Is Nothing Then

Voici mon code :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim k%, n%, r As Range
    Select Case Sh.Name
        Case "Visite médicale", "SPPA"
            k = 11
        Case "Badge", "Formation"
            k = 10
        Case "Vide1"
            k = 16
        Case "Permis civil", "Sureté"
            k = 12
        Case Else
            Exit Sub
    End Select
    If Not Intersect(Sh.Columns(Chr(64 + k) & ":" & Chr(65 + k)), Target) Is Nothing Then
        For Each r In Target.Rows
            n = r.Row
            If n < 3 Then Exit Sub
            With Sh
                If .Cells(n, k + 1).Value <> "" Then
                    .Cells(n, 2).Value = "ok"
                ElseIf .Cells(n, k).Value <> "" Then
                    If .Cells(n, k).Value < Date Then
                        .Cells(n, 2).Value = 0
                    Else
                        .Cells(n, 2).Value = DateDiff("d", Date, .Cells(n, k).Value)
                    End If
                End If
            End With
        Next r
    End If
End Sub

Encore merci

Cdlt

Bonjour,

Target n'est pas renvoyé pour cet évènement ! N'existe pas ! Et à l'activation il n'y a pas eu de changement dans la feuille, donc... !

En somme ce qu'il faut faire c'est une modification du code VBA afin qu'il fonctionne sans avoir besoin de la dernière cellule activée...

@ bientôt

LouReeD

Dites moi Maréchal vous avez dépassé les 6000 messages !!!

Ca se faite non ?

Vivement que je passe en rouge moi aussi !!!! mais malheureusement j'écris moins de messages !!! rdi2:

Réaction de Pompaero à attendre... S'il transfère sa procédure sur une Activate, c'est qu'il estime qu'une mise à jour est à faire à l'activation, donc il pointe directement les colonnes qui l'intéressent... Sur une procédure Change, il intervenait selon le changement... On ne peut décider à sa place !

LouReed : mon dernier passage du soir (nuit !), je balaie les sujets sans réponse... mais quand un certain LouReed m'a précédé ! je suis sa trace avant de fermer, et je dis bonjour ou bonsoir à l'occasion !

J'ai noté que j'avais passé 6000 Je vais ralentir un peu ! De toute façon j'ai un ralentissement involontaire programmé (par mon fournisseur d'accès), j'ai toutes chances de ne plus avoir de connexion en rentrant chez moi mardi prochain et devoir galérer un peu pour la récupérer, sans compter un nouvel ordi à mettre en service, ce qui va m'occuper un peu.

Bonne nuit.

Bonsoir à tous,

A la vue de la réponse de Pompaero, il me semble que l'événement qui répond au besoin est le Workbook_SheetChange :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

Sans doute ! Sauf que sa demande initiale indiquait qu'il disposait déjà de la procédure Change et voulait exécuter son code également à l'activation...

Dans ThisWorbook du classeur il y une macro qui permet de calculer automatiquement la 1ère colonne au Change de la colonne (Date à revoir).

J'aimerai le même principe pour chaque feuille mais à l'activation de chaque feuille

Donc, dans ce cas, il faut associer les deux :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
   Call Workbook_SheetChange(Sh, ActiveCell)
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' Code...
End Sub

Si c'est uniquement à l'activation, il faut alors remplacer Target par ActiveCell dans l'évènement Workbook_SheetActivate.

Bonjour Benead

Merci d'être arrêté sur mon post.

Je viens de tester ta proposition, les feuilles s'activent bien sans bug mais la 1ère colonne (B) des feuilles activés de se met pas à jour automatiquement.

Il faut toujours sélectionner une cellule de la Date à revoir et faire entrée pour que cela ce mette à jour.

Cdlt

La citation du post initial que j'ai déjà reproduite se poursuivait ainsi :

afin d'avoir la mise à jour de la 1ère colonne quand on ouvre une feuille voulu.

Ce qui devrait donc conduire à :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim k%, n%, r As Range
    Select Case Sh.Name
        Case "Visite médicale", "SPPA"
            k = 11
        Case "Badge", "Formation"
            k = 10
        Case "Vide1"
            k = 16
        Case "Permis civil", "Sureté"
            k = 12
        Case Else
            Exit Sub
    End Select
    For Each r In Sh.ListObjects(1).DataBodyRange.Rows
        n = r.Row
        If n < 3 Then Exit Sub
        With Sh
            If .Cells(n, k + 1).Value <> "" Then
                .Cells(n, 2).Value = "ok"
            ElseIf .Cells(n, k).Value <> "" Then
                If .Cells(n, k).Value < Date Then
                    .Cells(n, 2).Value = 0
                Else
                    .Cells(n, 2).Value = DateDiff("d", Date, .Cells(n, k).Value)
                End If
            End If
        End With
    Next r
End Sub

pour limiter la modif au minimum... Car la position de la cellule active à l'activation d'une feuille n'a aucune inicdence sur le besoin éventuel de mise à jour, lequel ne se justifie que par un éventuel changement de la date du jour, concernant alors la totalité du tableau.

A Pompaero de vérifier que cela correspond à son besoin et que c'est bien ce qu'il souhaite faire.

Ensuite, il pourrait être judicieux d'optimiser l'écriture (éviter les répétitions dans 2 procédures accomplissant une action semblable en limitant les évènementielles aux tests, en faisant appel à une fonction renvoyant k (en fonction du nom de feuille, 0 si la procédure n'a pas lieu d'être lancée), puis en lançant s'il y a lieu une procédure commune en lui passant un objet Range définissant les lignes sur lesquelles intervenir...

Cordialement.

Tant que j'y suis... !

Function ColDate(wsn As String)
    Select Case wsn
        Case "Visite médicale", "SPPA"
            ColDate = 11
        Case "Badge", "Formation"
            ColDate = 10
        Case "Vide1"
            ColDate = 16
        Case "Permis civil", "Sureté"
            ColDate = 12
        Case Else
            ColDate = 0
    End Select
End Function

Sub MiseAJour(k As Integer, pl As Range)
    Dim r As Range, n%
    For Each r In pl.Rows
        n = r.Row
        If n < 3 Then Exit Sub
        With pl.Worksheet
            If .Cells(n, k + 1).Value <> "" Then
                .Cells(n, 2).Value = "ok"
            ElseIf .Cells(n, k).Value <> "" Then
                If .Cells(n, k).Value < Date Then
                    .Cells(n, 2).Value = 0
                Else
                    .Cells(n, 2).Value = DateDiff("d", Date, .Cells(n, k).Value)
                End If
            End If
        End With
    Next r
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim k%
    k = ColDate(Sh.Name)
    If k = 0 Then Exit Sub
    MiseAJour k, Sh.ListObjects(1).DataBodyRange
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim k%
    k = ColDate(Sh.Name)
    If k = 0 Then Exit Sub
    If Not Intersect(Sh.Columns(Chr(64 + k) & ":" & Chr(65 + k)), Target) Is Nothing Then _
     MiseAJour k, Target
End Sub

Bonjour MFerrand

Merci pour tes propositions qui fonctionne très bien, c'est exactement ce que je souhaitais.

Un petit soucis tout de même quand j'active une feuille, (ex Formation) la présentation du titre de la feuille Accueil reste visible sur la feuille activé en B1 à E2, ce qui masque des boutons, à quoi serai ce du ? stp.

Cdlt

Rémanence de l'affichage ?

Essaie de placer un Application.ScreenUpdating = True dans l'activation pour voir si cela élimine ce problème.

Je viens de tester Application.ScreenUpdating = True , désolé cela ne change rien.

Désolé aussi !

Essaie une instruction :

SendKeys "{F5}"

à la fin de la proc. Activate. Cela rafraîchit l'affichage...

Rien non plus !!!

l'instruction m'affiche les titre de la feuille dans une fenêtre !! pourquoi F5 ?

C'est quand même bizarre qu'il y a que ces 2 objets qui ne s'affiche pas sur chaque feuille, le pire c'est qu'ils fonctionne

Rechercher des sujets similaires à "aide code"