Automatisez la répartition de vos données dans Excel : grâce à une seule liste déroulante, chaque ligne se déplace immédiatement vers la feuille correspondant à son statut, sans action manuelle ni risque d’erreur. Découvrez pas à pas le code VBA, ses variantes et les bonnes pratiques.
Vue d’ensemble du problème
Dans de nombreux processus (gestion commerciale, suivi de production, support client…), il est courant de centraliser les nouvelles entrées dans une feuille Register. Dès qu’un intervenant précise l’état (Status) d’un enregistrement, il est judicieux de l’archiver automatiquement dans la feuille dédiée à cet état : Zone1, Zone2, Terminé, etc. L’enjeu est double :
- éviter les erreurs de copier‑coller ou de filtrage ;
- gagner un temps considérable sur des opérations répétitives.
La solution la plus directe consiste à déclencher une macro Worksheet_Change dès qu’une cellule de la colonne contenant la liste déroulante est modifiée.
Le code VBA complet
Collez le code ci‑dessous dans le module de feuille Register :
Private Sub Worksheet_Change(ByVal Target As Range)
Const COL_DEROUlante As Long = 9 'colonne I
Const PLAGE_A_DEPLACER As String = "A:M" 'colonnes à transférer
'Ignore toute modification hors de la colonne I ou collage multiple
If Target.Column <> COL_DEROUlante Or Target.CountLarge > 1 Then Exit Sub
On Error GoTo GestionErreur
Application.EnableEvents = False 'évite la récursion
Dim nomFeuille As String: nomFeuille = Trim(Target.Value)
If nomFeuille = "" Then GoTo Sortie 'aucun choix : on quitte
'Contrôle d’existence de la feuille cible
Dim wsDest As Worksheet
On Error Resume Next
Set wsDest = Me.Parent.Worksheets(nomFeuille)
On Error GoTo GestionErreur
If wsDest Is Nothing Then
MsgBox "La feuille '" & nomFeuille & "' n’existe pas.", vbExclamation
GoTo Sortie
End If
'Recherche de la première ligne vide
Dim derLigDest As Long
derLigDest = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row + 1
'Transfert des données
Dim rngSource As Range
Set rngSource = Intersect(Me.Rows(Target.Row), Me.Range(PLAGE_A_DEPLACER))
rngSource.Copy wsDest.Cells(derLigDest, "A")
rngSource.Delete Shift:=xlUp 'supprime la ligne d’origine
Sortie:
Application.EnableEvents = True
Exit Sub
GestionErreur:
Application.EnableEvents = True
MsgBox "Erreur : " & Err.Description, vbCritical
End Sub
Étapes d’installation pas à pas
- Ouvrez l’éditeur VBA (Alt + F11).
- Dans le volet « Explorateur de projets », double‑cliquez sur la feuille Register.
- Dans la première liste déroulante, choisissez Worksheet ; dans la seconde, sélectionnez Change.
- Collez le code entre les deux lignes générées automatiquement.
- Enregistrez votre classeur sous le format .xlsm pour conserver les macros.
Paramétrages rapides
Besoin | Que modifier ? |
---|---|
Liste déroulante dans une autre colonne (ex. G) | Const COL_DEROUlante = 7 |
Déplacer moins de colonnes (A → K) | PLAGE_A_DEPLACER = "A:K" |
Conserver la ligne source (copie uniquement) | Supprimez :rngSource.Delete Shift:=xlUp |
Éviter le clignotement d’écran | Encadrez le code principal avec :Application.ScreenUpdating = False/True |
Collage simultané de plusieurs cellules | Le test Target.CountLarge > 1 ignore l’opération pour éviter un comportement imprévisible. |
Comprendre la logique du script
1. Filtrage de l’événement
Le test initial garantit qu’aucune action n’est déclenchée lorsque :
- la modification ne concerne pas la colonne ciblée ;
- l’utilisateur colle plusieurs cellules simultanément (copie de bloc).
2. Désactivation des événements
Application.EnableEvents = False
empêche la macro de se rappeler elle‑même lorsque la ligne est supprimée, évitant ainsi une boucle infinie. Ne réactivez jamais votre classeur sans rétablir cette propriété à True
, sous peine de bloquer tous les autres événements.
3. Validation du nom de feuille
Un simple Trim
retire les espaces parasites tapés par l’utilisateur. Si la feuille n’existe pas, on informe l’usager par un Message Box clair et la procédure s’arrête.
4. Recherche de la première ligne vide
La macro utilise la colonne A comme colonne d’ancrage : quel que soit le nombre de colonnes, on descend jusqu’à la dernière cellule non vide, puis on ajoute 1. Cette méthode est robuste même si d’autres colonnes contiennent des formules.
5. Transfert et nettoyage
La plage source est le croisement (Intersect) de la ligne active et de la plage "A:M"
. Après la copie, la suppression Shift:=xlUp
remonte les lignes restantes pour conserver la structure compacte de Register.
Scénarios d’usage
- Gestion de tickets IT : lorsqu’un ticket passe de « Nouveau » à « En cours », puis « Résolu », il rejoint automatiquement la feuille appropriée tout en gardant le même format de colonne.
- Suivi logistique : un opérateur scanne un colis et sélectionne « Expédié » ; la ligne quitte la file d’attente et s’archive dans la feuille Expédié partagée avec le transporteur.
- Contrôle qualité : les enregistrements « Conforme » ou « Non conforme » se dispatchent en temps réel vers leurs feuilles respectives pour des analyses distinctes.
Optimisations avancées
Transfert par lot
Si vous changez le statut de plusieurs dizaines de lignes d’un coup, il peut être plus efficace de désactiver l’événement le temps du traitement puis d’effectuer un transfert groupé ; sinon, la macro se déclenche pour chaque ligne. Une approche consiste à :
- Filtrer sur l’ancien statut.
- Couper/coller la plage entière vers la destination.
- Supprimer les lignes en une seule opération.
Sécuriser la suppression
Pour réduire tout risque de perte de données, remplacez la suppression définitive par un déplacement vers une feuille « Corbeille ». Il suffit de changer la ligne :
rngSource.Copy Worksheets("Corbeille").Cells(ligneCorbeille, "A")
et de commenter la suppression ; vous gardez ainsi un historique récupérable.
Utiliser une table structurée
Convertir Register en Table Excel (Ctrl + T) permet d’ajouter automáticamente de nouvelles lignes à la plage analysée par le code, même si le nombre de colonnes change. Les références deviennent :
Set rngSource = Intersect(Me.ListObjects(1).ListRows(Target.Row).Range, _
Me.Range(PLAGE_A_DEPLACER))
Questions fréquentes (FAQ)
Que se passe‑t‑il si deux utilisateurs modifient le fichier en même temps ?
Dans un environnement partagé (OneDrive, SharePoint), les macros s’exécutent côté client. Si deux utilisateurs déplacent la même ligne avant la synchronisation, un conflit est possible. Une solution consiste à forcer l’enregistrement (ThisWorkbook.Save
) immédiatement après le transfert ou à migrer le processus vers Power Automate. Le code est‑il compatible avec Excel pour Mac ?
Oui, l’instruction Worksheet_Change
est gérée également sous macOS. Vérifiez simplement que le classeur est enregistré au format .xlsm et que les macros sont autorisées dans Excel > Preferences > Security. Puis‑je déclencher des actions supplémentaires selon le statut ?
Bien sûr ! Insérez un bloc Select Case nomFeuille
avant la copie pour lancer par exemple : l’envoi d’un e‑mail, la mise à jour d’un tableau croisé dynamique ou la génération d’un fichier PDF.
Bonnes pratiques de développement
- Versionnez votre fichier : gardez un duplicata sans macros actives pour pouvoir comparer les versions et restaurer le code d’origine.
- Documentez le classeur : un onglet « README » décrivant le flux de données évite les malentendus lorsque le fichier change de mains.
- Signez vos macros avec un certificat auto‑signé pour éviter les avertissements de sécurité au sein de votre organisation.
Alternative sans VBA (Power Query)
Power Query peut charger la feuille Register, appliquer un filtre sur la colonne Status, puis exporter les résultats vers de nouvelles feuilles. Cette stratégie présente plusieurs limites :
- le contenu d’origine reste dans Register ;
- le rafraîchissement doit être manuel ou déclenché par un évènement
Workbook_Open
; - les lignes ne sont pas réellement déplacées, donc la feuille initiale peut rapidement gonfler.
La macro VBA demeure la méthode la plus simple pour un découpage physique avec suppression des lignes sources.
Audit et maintenance
Lorsque votre classeur croît, ajoutez un module standard nommé Mod_Audit
contenant une procédure d’inventaire :
Sub AuditFeuilles()
Dim ws As Worksheet
Debug.Print "------ AUDIT (" & Now & ") ------"
For Each ws In Worksheets
Debug.Print ws.Name, ws.UsedRange.Rows.Count
Next ws
End Sub
En un clin d’œil, vous détectez les feuilles devenues obsolètes ou trop volumineuses.
Conclusion
En tirant parti d’un événement natif d’Excel, cette solution VBA offre un tri automatique, fiable et personnalisable de vos données. Que vous gériez quelques dizaines ou plusieurs milliers de lignes, vous réduisez les manipulations manuelles, limitez les erreurs et fluidifiez la collaboration entre équipes. Ajustez les paramètres à vos contraintes métier (nombre de colonnes, table structurée, contrôle qualité) et vous disposerez d’un outil robuste qui évolue avec vos process.