Excel VBA : déplacer une ligne vers une autre feuille selon la valeur d’une liste déroulante

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.

Sommaire

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

  1. Ouvrez l’éditeur VBA (Alt + F11).
  2. Dans le volet « Explorateur de projets », double‑cliquez sur la feuille Register.
  3. Dans la première liste déroulante, choisissez Worksheet ; dans la seconde, sélectionnez Change.
  4. Collez le code entre les deux lignes générées automatiquement.
  5. Enregistrez votre classeur sous le format .xlsm pour conserver les macros.

Paramétrages rapides

BesoinQue 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’écranEncadrez le code principal avec :
Application.ScreenUpdating = False/True
Collage simultané de plusieurs cellulesLe 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 à :

  1. Filtrer sur l’ancien statut.
  2. Couper/coller la plage entière vers la destination.
  3. 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&nbsp;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.

Sommaire