Créer un système de gestion dynamique de plages de données, Excel VBA
Voici une explication détaillée et un code en VBA pour créer un système de gestion dynamique de plages de données, ainsi qu’un suivi des changements apportés à cette plage.
Objectif :
Créer une plage de données dynamique qui se met à jour automatiquement à chaque ajout ou suppression de données et suivre les modifications apportées à cette plage.
Étape 1 : Définir la Plage Dynamique
Pour créer une plage dynamique, vous pouvez utiliser VBA pour définir la plage en fonction de la taille des données. Cela peut être fait en utilisant la fonction OFFSET et les fonctions COUNTA ou COUNT pour ajuster dynamiquement la taille de la plage.
Code pour Créer une Plage Dynamique :
Sub CreateDynamicRange() Dim ws As Worksheet Dim rangeName As String Dim dynamicRange As String Dim lastRow As Long Dim lastCol As Long ' Définir la feuille de calcul sur laquelle travailler Set ws = ThisWorkbook.Sheets("Sheet1") ' Définir le nom de la plage dynamique rangeName = "DynamicDataRange" ' Trouver la dernière ligne et la dernière colonne contenant des données lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ' Définir la plage dynamique en utilisant OFFSET et COUNTA dynamicRange = "OFFSET(" & ws.Name & "!$A$1, 0, 0, " & lastRow & ", " & lastCol & ")" ' Créer la plage dynamique nommée ThisWorkbook.Names.Add Name:=rangeName, RefersTo:=dynamicRange MsgBox "Plage dynamique '" & rangeName & "' créée avec succès !" End Sub
Explication du Code :
1. Configuration de la Feuille (ws) :
- Le code commence par définir la feuille de calcul (ws) sur laquelle la plage dynamique sera créée. Remplacez « Sheet1 » par le nom de votre feuille.
2. Variables de Plage :
- rangeName est le nom que vous souhaitez attribuer à votre plage dynamique. Dans cet exemple, il est défini sur « DynamicDataRange ».
- dynamicRange va stocker la formule qui définit la plage dynamique en utilisant la fonction OFFSET.
3. Trouver la Dernière Ligne et la Dernière Colonne :
- lastRow trouve la dernière ligne contenant des données dans la colonne « A » (vous pouvez ajuster cette colonne en fonction de l’endroit où vos données commencent). Le code utilise xlUp pour trouver la dernière ligne remplie de bas en haut.
- lastCol trouve la dernière colonne utilisée dans la première ligne à l’aide de xlToLeft.
4. Définition de la Plage Dynamique :
- La plage dynamique est créée à l’aide de la fonction OFFSET. Cette formule va ajuster la taille de la plage en fonction des données réelles.
- OFFSET($A$1, 0, 0, lastRow, lastCol) signifie qu’on commence à la cellule A1 et qu’on étend la plage pour couvrir toutes les données, de l’angle supérieur gauche à l’angle inférieur droit.
5. Création de la Plage Dynamique :
- ThisWorkbook.Names.Add est utilisé pour créer la plage nommée. Elle utilise la formule de dynamicRange pour définir la plage dynamiquement.
6. Message de Confirmation :
- Une fois la plage créée, le code affiche une boîte de message confirmant la création de la plage dynamique.
Étape 2 : Suivre les Modifications de la Plage Dynamique (Optionnel)
Pour suivre les modifications apportées à la plage dynamique, vous pouvez utiliser l’événement Workbook_SheetChange. Cet événement se déclenche chaque fois qu’un changement est effectué dans la feuille, vous permettant ainsi d’enregistrer ou de gérer les modifications.
Code pour Suivre les Modifications :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim dynamicRange As Range Dim logSheet As Worksheet Dim lastRow As Long ' Vérifier que nous travaillons sur la bonne feuille et plage If Sh.Name = "Sheet1" Then ' Définir la plage dynamique Set dynamicRange = ThisWorkbook.Sheets("Sheet1").Range("DynamicDataRange") ' Vérifier si le changement a eu lieu dans la plage dynamique If Not Intersect(Target, dynamicRange) Is Nothing Then ' Enregistrer le changement dans une feuille de log (LogSheet) Set logSheet = ThisWorkbook.Sheets("LogSheet") ' Trouver la prochaine ligne vide dans la feuille de log lastRow = logSheet.Cells(logSheet.Rows.Count, "A").End(xlUp).Row + 1 ' Enregistrer les détails du changement logSheet.Cells(lastRow, 1).Value = Now logSheet.Cells(lastRow, 2).Value = "Cellule modifiée : " & Target.Address logSheet.Cells(lastRow, 3).Value = "Nouvelle valeur : " & Target.Value End If End If End Sub
Explication du Code de Suivi des Modifications :
1. Événement Déclencheur :
- Workbook_SheetChange est un événement intégré qui se déclenche chaque fois qu’un changement est effectué dans une feuille.
2. Vérification de la Feuille et de la Plage :
- Le code s’assure que le changement se produit dans la bonne feuille (ici, « Sheet1 »).
3. Vérification du Changement dans la Plage Dynamique :
- Il vérifie si le changement a eu lieu dans la plage dynamique (DynamicDataRange).
4. Enregistrement du Changement :
- Si un changement est détecté, les détails sont enregistrés dans une feuille de log (LogSheet).
- Le log inclut l’heure du changement, l’adresse de la cellule modifiée, et la nouvelle valeur de la cellule.
Étape 3 : Créer la Feuille de Log
Pour que le suivi fonctionne, vous devez créer une feuille de calcul nommée « LogSheet » qui contiendra les logs. La feuille de log enregistrera l’heure, l’adresse de la cellule modifiée, et la nouvelle valeur de la cellule.
Avec ces étapes, vous pouvez créer une plage dynamique en VBA et suivre les changements qui y sont apportés pour un meilleur contrôle et suivi des données. Ce système est flexible et peut être adapté pour gérer différentes situations de données.