XL 2019 besoin d'aide

GuyBalla

XLDnaute Nouveau
Bonjour tout d'abord à toute l'équipe!!
Je suis novice en programmation VBA, et j'éprouve quelques difficultés dont je n'ai pas encore pu trouver de réponses satisfaisantes malgré toutes mes recherches sur le net (Youtube et moteur de recherche google). Je sais que c'est possible de trouver de multiples solutions à certaines difficultés car je me suis rendu compte du potentiel de cette outil qu'est VBA et aussi de l'expertise de tous ceux qui ont de l'expérience dans le domaine.
Alors, je suis parvenu à mettre en place un classeur à partir duquel je crée des onglets (campagne_N+1) qui copie les données de l'onglet précédent (campagne_N), en y insérant des variables relatives à année N+1.
Le but est de gérer le suivi de réception de certains documents en fonction de la dernière année de campagne définie. Il arrive cependant que des documents devant être déposés durant les campagnes précédentes le sont avec plusieurs années de retard.
Ce que Je souhaite, c'est de pouvoir mettre à jour une information qui est dans la feuille de campagne la plus récente de façon à ce qu'automatiquement la même information soit actualisée dans toutes les feuilles où elle existe. Mettre à jour une donnée qui a les mêmes références (numéro de ligne et nom_variable) mais que l'on retrouve sur plusieurs feuilles.

Merci d'avance.
 
Solution
Voici la macro modifiée et commentée :

VB:
'Macro "évènementielle" se déclenche quand une cellule est modifiée sur
'n'importe quelle feuille
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  '"Sh" désigne la feuille modifiée et "Target" la cellule ou la plage de cellules modifiées
  'déclaration des variables
  Dim Lig As Variant, Col As Variant, Ws As Worksheet, Res As Variant
  's'il s'agit d'une feuille "Campagne"
  If Left(Sh.Name, 8) = "Campagne" Then
    'si une cellule est modifiée (par commodité, c'est le cas général
    'sinon, on peut toujours faire autrement
    If Target.Count > 1 Then Exit Sub
      'Si les cellules des colonnes "B", "N", "W", "AF" et "AP:AW" sont concernées
      If...

danielco

XLDnaute Accro
Voila. J'ai supposé que, sur "Campagne_2018 tu ne pouvais modifier que la colonne R. A mettre dans le module ThisWorkbook.

VB:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim Lig As Variant, Col As Variant, Ws As Worksheet
  If Left(Sh.Name, 8) = "Campagne" Then
    If Target.Count > 1 Then Exit Sub
    If Target.Column = 18 Then
      Application.EnableEvents = False
      For Each Ws In Sheets
        With Ws
          If Left(Ws.Name, 8) = "Campagne" And Ws.Name <> Sh.Name Then
            Lig = Application.Match(Cells(Target.Row, 1), .[A:A], 0)
            Col = Application.Match(Cells(1, Target.Column), .[1:1], 0)
            If IsNumeric(ligne) And IsNumeric(Col) Then
              .Cells(Lig, Col) = Target.Value
            End If
          End If
        End With
      Next Ws
      Application.EnableEvents = True
    End If
  End If
End Sub

Teste.

Daniel
 

Pièces jointes

  • Réception DSF année 2018.xlsm
    124.1 KB · Affichages: 4

GuyBalla

XLDnaute Nouveau
Bonsoir!!
Désolé, c'est seulement maintenant que je me connecte.
Je viens de tester... ça marche mais dans le pas dans le bon sens. Je m'explique, il faudrait que les modifications apportées sur la campagne la plus récente (peu importe la colonne) soient introduites ou transférées automatiquement dans toutes les colonnes correspondantes des campagnes précédentes.
ex. les modifications apportées sur les colonnes ("B", "N", "W", "AF" et "AP:AW") de la campagne 2019 se retrouvent sur les colonnes ("B", "O", "X", "AE" et "AP:AW") de la campagne 2018.
Les Modifications sur la campagne 2020 se répercutant sur la campagne 2019 et sur la campagne 2018 uniquement pour les variables concernées.
Ce serait très sympa si vous pouviez expliquer certaines lignes de code :) pour notre apprentissage (tel que If Target.Count > 1 Then Exit Sub).
Merci pour aide!!
 

danielco

XLDnaute Accro
Voici la macro modifiée et commentée :

VB:
'Macro "évènementielle" se déclenche quand une cellule est modifiée sur
'n'importe quelle feuille
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  '"Sh" désigne la feuille modifiée et "Target" la cellule ou la plage de cellules modifiées
  'déclaration des variables
  Dim Lig As Variant, Col As Variant, Ws As Worksheet, Res As Variant
  's'il s'agit d'une feuille "Campagne"
  If Left(Sh.Name, 8) = "Campagne" Then
    'si une cellule est modifiée (par commodité, c'est le cas général
    'sinon, on peut toujours faire autrement
    If Target.Count > 1 Then Exit Sub
      'Si les cellules des colonnes "B", "N", "W", "AF" et "AP:AW" sont concernées
      If Target.Column = 2 Or Target.Column = 14 Or Target.Column = 23 Or _
        Target.Column = 31 Or (Target.Column >= 42 And Target.Column <= 49) Then
        'Boucle sur toutes les feuilles
        For Each Ws In Sheets
          'recherche du plus grand millésime des feuilles Campagne
          If Right(Ws.Name, 4) > Res And Left(Ws.Name, 8) = "Campagne" Then Res = Right(Ws.Name, 4)
        Next Ws
        'si la feuille modifiée correspond à ce millésime
        If Right(Sh.Name, 4) = Res Then
          'désactive les macros évènementielles
          Application.EnableEvents = False
          'boucle sur toutes les feuilles
          For Each Ws In Sheets
            With Ws
              's'il s'agit d'une feuille différente de celle modifiée
              If Left(.Name, 8) = "Campagne" And .Name <> Sh.Name Then
                'recherche de la ligne correspondante à la cellule modifiée (avec EQUIV)
                Lig = Application.Match(Cells(Target.Row, 1), .[A:A], 0)
                'recherche de la colonne correspondante à la cellule modifiée (avec EQUIV)
                Col = Application.Match(Cells(1, Target.Column), .[1:1], 0)
                'si on a trouvé correspondante sur la feuille cible
                If IsNumeric(ligne) And IsNumeric(Col) Then
                  'modification de la cellule cible
                  .Cells(Lig, Col) = Target.Value
                End If
              End If
            End With
          Next Ws
          'réactive les macros évènementielles
          Application.EnableEvents = True
        End If
    End If
  End If
End Sub

Teste. Si tu as des questions, n'hésite pas

Daniel
 

GuyBalla

XLDnaute Nouveau
Bonjour Daniel!!
Ok, je viens de tester la macro et elle fonctionne bien!!!
j'y ai apporté une petite modification pour que toutes les colonnes soient concernées (ligne 5 et 6 de la macro), à savoir "If Target.Column >= 1 And Target.Column <= 49 then ...."
Et là tout marchait à merveille, mais lorsque j'ai inséré une ligne (un enregistrement) dans la campagne la plus récente j'ai eu ce message de Microsoft Visual Basic: "Erreur d'exécution '13'.... Incompatibilité de type". Le débogage pointe sur cette ligne de code :
.Cells(Lig, Col) = Target.Value
Je crois que c'est probablement dernier souci à régler sur la macro.
Merci encore car je suis proche du but à atteindre.
 

GuyBalla

XLDnaute Nouveau
VB:
'Macro "évènementielle" se déclenche quand une cellule est modifiée sur
'n'importe quelle feuille
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  '"Sh" désigne la feuille modifiée et "Target" la cellule ou la plage de cellules modifiées
  'déclaration des variables
  Dim Lig As Variant, Col As Variant, Ws As Worksheet, Res As Variant
  's'il s'agit d'une feuille "Campagne"
  If Left(Sh.Name, 8) = "Campagne" Then
    'si une cellule est modifiée (par commodité, c'est le cas général
    'sinon, on peut toujours faire autrement
    If Target.Count > 1 Then Exit Sub
    
    On Error Resume Next
      'Si les cellules des colonnes "B", "N", "W", "AF" et "AP:AW" sont concernées
     ' If Target.Column = 2 Or Target.Column = 14 Or Target.Column = 23 Or '_
      '  Target.Column = 31 Or (Target.Column >= 42 And Target.Column <= 49) Then
        If Target.Column >= 1 And Target.Column <= 49 Then
        
        'Boucle sur toutes les feuilles
        For Each Ws In Sheets
          'recherche du plus grand millésime des feuilles Campagne
          If Right(Ws.Name, 4) > Res And Left(Ws.Name, 8) = "Campagne" Then Res = Right(Ws.Name, 4)
        Next Ws
        'si la feuille modifiée correspond à ce millésime
        If Right(Sh.Name, 4) = Res Then
          'désactive les macros évènementielles
          Application.EnableEvents = False
          'boucle sur toutes les feuilles
          For Each Ws In Sheets
            With Ws
              's'il s'agit d'une feuille différente de celle modifiée
              If Left(.Name, 8) = "Campagne" And .Name <> Sh.Name Then
                'recherche de la ligne correspondante à la cellule modifiée (avec EQUIV)
                Lig = Application.Match(Cells(Target.Row, 1), .[A:A], 0)
                'recherche de la colonne correspondante à la cellule modifiée (avec EQUIV)
                Col = Application.Match(Cells(1, Target.Column), .[1:1], 0)
                'si on a trouvé correspondante sur la feuille cible
                If IsNumeric(ligne) And IsNumeric(Col) Then
                  'modification de la cellule cible
                  .Cells(Lig, Col) = Target.Value
                End If
              End If
            End With
          Next Ws
          'réactive les macros évènementielles
          Application.EnableEvents = True
        End If
    End If
  End If
End Sub
Bonjour Danielco!
Merci infiniment car grâce à vous je suis parvenu à résoudre cet épineux problème!
S'agissant du message d'"Erreur d'exécution '13'.... Incompatibilité de type", j'ai compris pourquoi il s'affichait et du coup la résolution est devenue évidente. Il m'a simplement suffi d'introduire "On Error Resume Next". je poste la macro modifiée pour ceux que cela pourrait éventuellement intéresser.
Merci
 

Discussions similaires

Réponses
6
Affichages
446
Réponses
2
Affichages
281
Réponses
1
Affichages
274

Statistiques des forums

Discussions
315 091
Messages
2 116 117
Membres
112 665
dernier inscrit
JPHD