Déplacement de données validées

Bonjour,

Je viens vers vous car je bloque sur une petit problème,

Dans mon fichier je remplis dans un UserForm des données qui sont injectées dans le tableau de la feuille "Test"

Les données de l'UserForm sont entrées dans les colonnes de A à L et O.

Après cela les colonnes M,N et P sont remplis manuellement plus tard.

Mon souhait est que quand lorsque j'ai une ligne complété celle-ci soit coupé puis collé dans la feuille Test_

Je joins un fichier avec un exemple si mon explication n'a pas été claire

Cognomen

6test.xlsx (10.55 Ko)

Bonjour,

Se peut-il qu'une ou plusieurs cellules (hormis en colonnes M, N et P) ne soient pas remplies?

Non chaque cellules doivent être remplies

Un exemple :

Se déclenche lors de la saisie dans les colonnes M, N ou P.

Code à insérer dans le module de la feuille Test : Clic droit sur l'onglet de cette feuille / visualiser le code...

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ligne As Long, DL As Long
    If Target.Column = 13 Or Target.Column = 14 Or Target.Column = 16 Then
        Ligne = Target.Row
        If Ligne > 1 Then
            If Application.WorksheetFunction.CountA(Range("A" & Ligne & ":P" & Ligne)) = 16 Then
                DL = derlig_reelle(Sheets("Test_").Columns(1)) + 1
                Range("A" & Ligne & ":P" & Ligne).Cut Sheets("Test_").Range("A" & DL)
                Rows(Ligne).Delete Shift:=xlUp
            End If
        End If
    End If
End Sub
Private Function derlig_reelle(Plage As Range) As Long
   If WorksheetFunction.CountA(Plage) = 0 Then derlig_reelle = Plage.Cells(1, 1).Row: Exit Function
   derlig_reelle = Plage.Find("*", , , , , xlPrevious).Row
End Function

Merci beaucoup,

Cela marche parfaitement

PS: Si vous avez le temps je serais preneur d'explication sur le code

Ok. Pas de souci.

Tout d'abord, la fonction :

Private Function derlig_reelle(Plage As Range) As Long
   If WorksheetFunction.CountA(Plage) = 0 Then derlig_reelle = Plage.Cells(1, 1).Row: Exit Function
   derlig_reelle = Plage.Find("*", , , , , xlPrevious).Row
End Function

Elle se charge de trouver la dernière ligne remplie de la plage (Plage As Range) qu'on lui passe en paramètre.

Cette fonction utilise la méthode Find, méthode que je juges la moins mauvaise pour accomplir ce travail.

Ensuite la procédure Worksheet_Change() est une procédure événementielle de feuille. (C'est pourquoi il vous faut placer ce code dans le module de la feuille concernée.)

Cet événement est déclenché, comme son nom l'indique, lors de la modification (Change) d'une cellule de la feuille. Cette cellule est passée en argument de la procédure sous la variable Target.

Voici maintenant, plus en détail, cette procédure avec commentaires :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ligne As Long, DL As Long    'déclaration des variables 
    'Si la cellule modifiée (Target) appartient à la colonne M (13), N (14) ou P (16) Alors...
    If Target.Column = 13 Or Target.Column = 14 Or Target.Column = 16 Then
        'On stocke le numéro de sa ligne dans la variable Ligne
        Ligne = Target.Row
        'On évite la ligne 1
        If Ligne > 1 Then
            'Si le nombre de cellules remplies (countA est l'équivalant de la formule de calcul NBVAL) 
            'de la plage A:P de cette ligne = 16 (tout est remplit donc) Alors...
            If Application.WorksheetFunction.CountA(Range("A" & Ligne & ":P" & Ligne)) = 16 Then
                'On détermine la première cellule vide colonne A de la feuille Test_ (dernière ligne remplie + 1)
                DL = derlig_reelle(Sheets("Test_").Columns(1)) + 1
                'Cut = Couper (ici on coupe la plage A:P de la ligne Ligne) "ESPACE" Coller.
                'On trouve, après Cut et l'espace, la plage de destination. Ici Feuille Test_, Col A, 1ère ligne vide
                Range("A" & Ligne & ":P" & Ligne).Cut Sheets("Test_").Range("A" & DL)
                'on supprime la ligne qui vient d'être coupée
                Rows(Ligne).Delete Shift:=xlUp
            End If
        End If
    End If
End Sub

Merci infiniment d'avoir pris le temps d'expliqué

Rechercher des sujets similaires à "deplacement donnees validees"