Synchronisation de plusieurs feuilles d'un classeur pour registre d'actions

Bonjour le forum,

J'essaye de mettre en place un registre d'actions associé à des fiches de risques (FDR). Dans l'idée le registre d'actions dans l'onglet "Actions register" vient "scanner" (à travers le bouton "Actualiser registre") les autres onglets, qui correspondent à des FDR, pour venir extraire les actions listées dans chaque onglets. Dans chaque FDR (une par onglet) le plan d'action se trouve toujours à partir de la ligne 79 vers le bas (en fonctions du nombre d'actions) et des colonnes A à Q. Le scanning permettrait donc de mettre à jour les actions en fonctions des modifications dans chaque FDR (ajout ou suppression d'actions). Pour chaque actions extraites des FDR il y a dans l'onglet "Action register" le code, le titre, le pilote ainsi que la criticité de la FDR à laquelle elle appartient. Ces informations se retrouvent toutes aux mêmes endroit dans chaque FDR.

J'ai tenté quelques manips mais c'est sans espoir de ma part. C'est pour cela que je vous sollicite afin de recueillir vos propositions. En PJ vous trouverez le fichier vierge si vous voulez tenter vos chances.

Merci en avance et bonne journée.

.

Bonjour Merimon,

Intéressant comme FDR

Voici le fichier avec un code qui devrait bien se comporter (à tester)

A+

Bonjour BrunoM45,

Merci beaucoup pour ta proposition, elle marche très bien! J'ai seulement quelques remarques, je me demande comment va réagir la macro si j'ajoute 50 FDR (ce qui va être le cas), est ce que elle va mettre très longtemps à tout scanner? Deuxième remarque, si je supprime une action dans une FDR, est il possible qu'elle soit supprimer également du registre? Je suppose qu'il faudrait un scan supplémentaire qui compare les actions du registre à celle des FDR mais j'ai peur que sa alourdisse la macro et le temps d'attente en cas de fichier avec beaucoup de FDR. Qu'en penses tu?

Merci infiniment!

Bonsoir,

Je me demande comment va réagir la macro si j'ajoute 50 FDR (ce qui va être le cas), est ce que elle va mettre très longtemps à tout scanner?

Franchement, je ne sais pas, mais il y a toujours moyen d'optimiser le code
Déjà fait pour les valeurs des 16 colonnes de la FDR à mettre à jour

Deuxième remarque, si je supprime une action dans une FDR, est il possible qu'elle soit supprimer également du registre?

Bonne remarque, je suis passé à côté

Le code à été modifié dans ce sens, une boucle ce n'est jamais long

A+

Bonjour Bruno M45,

Je te remercie à nouveau pour ton aide. J'ai pu tester ton fichier ces dernières semaines et il marche très bien. Je l'ai mit à l'épreuve avec 80 onglets à scanner et il tarde une petite minute à terminer. J'ai retravailler un peu ton code pour satisfaire quelques besoins spécifiques comme tu pourras t'en apercevoir.

Cependant un nouveau besoin c'est présenté, similaire au premier et j'ai donc essayer de recycler la macro pour le registre des actions afin d'établir cette fois ci un registre des fiches de risques et non pas des actions dans ces dernières. J'ai créé le module3 dans lequel j'ai tenté quelque chose mais je suis loin du résultat voulu :( Serais tu si aimable de m'aider à nouveau ?

Dans l'onglet "REGISTRE RISQUE TEST" j'ai précisé ligne 2 où faut il récupérer l'information dans chaque FDR (onglet). Le code associé est déjà dans la macro module 3. Par contre une nouvelle condition se présente: lorsque l'onglet s’appelle "FDR NIxx" OK pour scanner, si l'onglet contient le mot "globale" OK pour scanner, si l'onglet contient le mot "item" ne pas scanner.

En bonus :) il serait génial d'avoir un lien ou bouton sur chaque FDR tu registre qui mène à l'onglet de la FDR concernée. Et n'hesite pas à optimiser le code si tu vois une atrocité :)

Merci en avance! Bonne fin de journée.

Bonjour Merinom,

Pour le module 3, voici un code possible à tester

'Macro pour le registre des FDR
Sub ScanFDR2()
  Dim ShtRR As Worksheet, Sht As Worksheet
  Dim Col As Long, dCol As Long, dLig As Long, Lig As Long, LigRR As Long, LigSup As Long
  Dim sNumAction As String, sCel As String
  ' Pour essayer de gagner du temps
  ' Désactiver le calcul auto et les évènements
  Application.Calculation = xlCalculationManual
  Application.EnableEvents = False  
  ' Définir la feuille sur laquelle importer les données
  Set ShtRR = ThisWorkbook.Sheets("REGISTRE RISQUE TEST")
  ' Pour chaque feuille du classeur
  For Each Sht In ThisWorkbook.Sheets
    ' Vérifier s'il sagit d'une FDR
    If InStr(1, Sht.Name, "FDR") = 0 Then GoTo SuiteSht
    ' Vérifier si le nom de la feuille contient "Item"
    If InStr(1, Sht.Name, "item", vbTextCompare) > 1 Then GoTo SuiteSht
    ' Dernière ligne remplie de la colonne B de la feuille à traiter
    ' Cette contient uniquement : FDR-X
    dLig = Sht.Range("B" & Rows.Count).End(xlUp).Row
    '
    ' 1) Commencer par supprimer les lignes qui doivent l'être
    ' En parcourant les lignes à partir de la fin
    For LigSup = ShtRR.Range("A" & Rows.Count).End(xlUp).Row To 4 Step -1
      ' Si la ligne est celle de la FDR sur laquelle on va travailler
      ' et que l'action n'existe pas
      If ShtRR.Range("A" & LigSup) = Sht.Name And _
        WorksheetFunction.CountIf(Sht.Range("B80:B" & dLig), ShtRR.Range("J" & LigSup)) = 0 Then
          ShtRR.Rows(LigSup).Delete
      End If
    Next LigSup
    '
    ' 2) On continue par mettre à jours les lignes
    ' Pour chaque ligne
    For Lig = 80 To dLig
      ' Faire la mise à jour
      sNumAction = Sht.Range("B" & Lig)
      LigRR = LigFindNA(ShtRR, sNumAction)
      ' Si aucune ligne trouvée
      If LigRR = 0 Then
        ' Créer une nouvelle ligne
        LigRR = ShtRR.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
        ShtRR.Rows("4:4").Copy Destination:=ShtRR.Range("A" & LigRR)
        Application.CutCopyMode = False
        ShtRR.Rows(LigRR).ClearContents
      End If
      ' Nombre de colonnes à remplir
      dCol = ShtRR.Cells(4, Columns.Count).End(xlToLeft).Column
      ' Remplir la ligne
      For Col = 1 To dCol
        ' Récupérer la cellule à remplir en fonction de la colonne
        sCel = ShtRR.Cells(2, Col)
        ' Si aucune référence ou dernier caractère pas numérique = pas une référence, on passe à la suite
        If sCel = "" Or Not IsNumeric(Right(sCel, 1)) Then GoTo SuiteCol
        ' Si ce n'est pas une colonne "Criticité"
        If InStr(1, ShtRR.Cells(4, Col), "Criticité", vbTextCompare) = 0 Then
          ShtRR.Cells(LigRR, Col).Value = Sht.Range(sCel).Value
        Else
          ShtRR.Cells(LigRR, Col).Interior.Color = Sht.Range(sCel).DisplayFormat.Interior.Color
        End If
        ' Si colonne "Famille" => Inscrire la formule du lien hypertexte
        If InStr(1, ShtRR.Cells(4, Col), "Famille", vbTextCompare) > 0 Then
          With ShtRR.Cells(LigRR, Col)
            .NumberFormat = "General"
            .FormulaLocal = "=LIEN_HYPERTEXTE(""[" & ThisWorkbook.Name & "]'" & Sht.Name & "'!$C$6"";" & Chr(34) & Sht.Range("B" & Lig) & Chr(34) & ")"
            ' Remettre la bonne Police
            With .Font
              .Name = "Calibri"
              .Size = 10
            End With
          End With
        End If
SuiteCol:
      Next Col
    Next Lig
SuiteSht:
 Next Sht
  ' Réactiver le calcul auto et les évènements
  Application.Calculation = xlCalculationAutomatic
  Application.EnableEvents = True
  ' Effacer les variables objet
  Set Sht = Nothing: Set ShtRR = Nothing
End Sub

' Fonction pour trouver la ligne du numéro d'action
Function LigFindNA(ShtS As Worksheet, sNumAct As String)
  Dim CelF As Range
  ' Rechercher la valeur
  Set CelF = ShtS.Range("J:J").Find(What:=sNumAct, LookIn:=xlValues, LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
  If Not CelF Is Nothing Then
    LigFindNA = CelF.Row
  Else
    LigFindNA = 0
  End If
End Function

A+

Edit : code modifié 03/06 15h25

Bonjour BrunoM45,

Merci à nouveau pour ton aide! J'ai testé ton code mais j'ai l’erreur suivante lors de l’exécution du code: "Erreur d’exécution 1004: La méthode 'Range de l'objet '_Worksheet' a échoué" et il me renvoi à la ligne "ShtRR.Cells(LigRR, Col).Value = Sht.Range(sCel).Value"

Saurais tu quel est le problème? Merci infiniment!

Bonjour,

Si vous faites des blagues aussi

Dans la ligne 2, vous avez du texte au lieu de référence, il faut donc ajouter un test

Si aucune référence ou dernier caractère pas numérique = pas une référence, on passe à la suite
If sCel = "" Or Not IsNumeric(Right(sCel, 1)) Then GoTo SuiteCol

Pour le lien hypertexte, il faut remplacer par

.FormulaLocal = "=LIEN_HYPERTEXTE(""[" & ThisWorkbook.Name & "]'" & Sht.Name & "'!$C$6"";" & Chr(34) & Sht.Range("B" & Lig) & Chr(34) & ")"

De plus en colonne P, vous avez "C[ESPACE]49" au lieu de "C49", renseignez correctement vos références de cellule

A+

Bonjour BrunoM45,

Excuse moi des mes étourderies... merci pour ta réponse. J'ai finalement eu le temps de tester ton nouveau code et il s’exécute bien. Cependant j'ai l'impression que dans le Registre des risques (onglet "REGISTRE RISQUE TEST"), il y a une ligne pour chaque action (NI-XX-1/2/3...) de la fiche de risque "scannée" alors qu'ici l'idée est d'avoir une seule ligne par fiche de risque (donc par onglet qui répond aux tests énoncés dans mon message précédant).

Le lien hypertexte marche très bien mais par contre est-il possible de l'avoir dans la colonne D (numéro de la FDR) au lieu de J ("Famille", qui est obtenu de la cellule D8 de la FDR scannée) ?

A nouveau, merci infiniment pour consacrer du temps à mes sollicitations!

Très bonne journée à toi.

Rechercher des sujets similaires à "synchronisation feuilles classeur registre actions"