Copié coller VBA

Bonjour à tous et à toutes,

Voilà, je vous explique mon problème.

Dans un premier temps je suis débutant en VBA (je ne comprends rien à ce langage).

Dans un deuxième temps j'aimerais sur le fichier joint que :

  • Lorsque je rentre "Facturer "dans la colonne W la ligne de la feuille "Gestion" passe dans la feuille "BRT FACTURER" puis se supprime de la feuille "GESTION"
  • Lorsque j'écris "reste réfection" dans la colonne V la ligne de la feuille "Gestion" passe dans la feuille "Refection" mais ne se supprime pas de la feuille "GESTION"
  • Lorsque je rentre "TERMINER" dans la colonne W la ligne remonte avec les autres ligne "TERMINER"
  • Lorsque je rentre "EN COURS" dans la colonne W la ligne remonte avec les autres ligne "EN COURS"

En espérant que mon besoin soit clair...

Dans l'attente de votre retour je vous remercie par avance.

Bonjour

A tester !

Bonjour,

est-il possible de faire cela sans macro ?

Car quand je colle ta macro dans mon fichier confidentiel qui est le même fichier avec des cellules pleines la macro ne fonctionne pas : je m'explique : la ligne qui se colle sur BRT FACTURER va en colonne C20 au lieu de s'insérer en B10...

De plus le mode reste refection ne fonctionne pas ...

Désolé....

Sans macro non c'est pas possible, c'est normal si ça ne marche pas si la disposition n'est pas la même d'un fichier a un autre.

C'est exactement le même ... Peut être que je ne copie colle pas tout le bon code et que je ne le positionne pas au bon endroit... as tu pu regarder pour le reste refection ?

Merci pour tout

Je vais reprendre ça demain alors

As tu un e-mail afin que je t'envoie le fichier ?

Re

je te remet le code qui fonctionne chez moi :

(A placer dans le module de la feuille GESTION)

Dim StopProcess As Boolean

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
StopProcess = False
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Crit As String
Dim Lig As Integer, NewLig As Integer
Dim f1 As Worksheet, f2 As Worksheet, f3 As Worksheet
Dim C As Object

If StopProcess = True Then Exit Sub

Set f1 = Sheets("GESTION")
Set f2 = Sheets("BRT FACTURER")
Set f3 = Sheets("REFECTION")

If Selection.Count = 1 Then
    If Not Intersect(Target, f1.Range("W:W")) Is Nothing Then
        Crit = UCase(Target)
        If Crit = "FACTURER" Then
            StopProcess = True
            Lig = Target.Row
            f1.Range("B" & Lig & ":W" & Lig).Cut
            f2.Range("B10").Insert Shift:=xlDown
            f1.Range("B" & Lig & ":W" & Lig).Delete Shift:=xlUp
        End If

        If Crit = "TERMINER" Then
            StopProcess = True
            Lig = Target.Row
            f1.Range("B" & Lig & ":W" & Lig).Cut
            f1.Range("B10").Insert Shift:=xlDown
        End If

        If Crit = "EN COURS" Then
            StopProcess = True
            Lig = Target.Row
            Set C = f1.Range("W:W").Find("TERMINER", LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious)
            If Not C Is Nothing Then
                NewLig = C.Row + 1
                Set C = Nothing
                f1.Range("B" & Lig & ":W" & Lig).Cut
                f1.Range("B" & NewLig).Insert Shift:=xlDown
            Else
                f1.Range("B" & Lig & ":W" & Lig).Cut
                f1.Range("B10").Insert Shift:=xlDown
            End If
        End If
    End If
    If Not Intersect(Target, f1.Range("V:V")) Is Nothing Then
        StopProcess = True
        Lig = Target.Row
        If UCase(Target) Like "*REFECTION*" Then
            f1.Range("B" & Lig & ":W" & Lig).Copy
            f3.Range("B10").Insert Shift:=xlDown
        End If
    End If
End If
End Sub

Si ça ne fonctionne toujours pas je te donnerais mon E-Mail

EDIT 09:17 : J'avais fait une petite erreur, j'ai corrigé ça dans ce poste !

Bonjour,

Le transfert vers la page Brt Facturer s'effectue bien sauf que ça vient toujours écraser sur la ligne B10 au lieu de s'afficher à la suite.

Peux-tu me passer ton e-mail car j'ai une autre demande à te faire si je peux me permettre ... si je n'abuse pas trop surtout

Oui effectivement, reprend le code du message précédent que j'ai corrigé

Je remet le code légèrement modifié et commenté si jamais ça intéresse quelqu'un

Dim StopProcess As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Crit As String
Dim Lig As Integer, NewLig As Integer
Dim f1 As Worksheet, f2 As Worksheet, f3 As Worksheet
Dim C As Object

'La variable StopProcess permet d'empécher l'excution en boucle du code
If StopProcess = True Then StopProcess = False: Exit Sub

Set f1 = Sheets("GESTION") 'La variable f1 représente la feuille GESTION
Set f2 = Sheets("BRT FACTURER") 'Même principe
Set f3 = Sheets("REFECTION") 'Même principe

If Selection.Count = 1 Then 'Si une seule cellule est sélectionnée alors :
    If Not Intersect(Target, f1.Range("W:W")) Is Nothing Then 'Si la cellule séletionnée se trouve dans la colonne W de f1 alors :
        Crit = UCase(Target) 'La varibale Crit représente le contenue de la cellule sélectionnée en majuscule
        If Crit = "FACTURER" Then 'Si la varibale Crit = FACTEUR alors :
            StopProcess = True 'La variable StopProcess passe à l'état VRAI
            Lig = Target.Row 'La varibale Lig prend pour valeur le numéro de la ligne sélectionnée
            f1.Range("B" & Lig & ":W" & Lig).Cut 'La plage contenue entre les colonnes B et W sur la ligne représenté par Lig est coupée
            f2.Range("B10").Insert Shift:=xlDown 'La plage précedement coupée est insérée à partir de la ligne B10 en décalant les autres lignes vers le bas
            f1.Range("B" & Lig & ":W" & Lig).Delete Shift:=xlUp 'La plage précedement définie sur f1 est effacée avec un décalage des autres cellules vers le haut
        End If 'Fin du si Crit = FACTURER

        If Crit = "TERMINER" Then
            StopProcess = True
            Lig = Target.Row
            f1.Range("B" & Lig & ":W" & Lig).Cut
            f1.Range("B10").Insert Shift:=xlDown
        End If

        If Crit = "EN COURS" Then
            StopProcess = True
            Lig = Target.Row
            Set C = f1.Range("W:W").Find("TERMINER", LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious)
            'C représente la première la première cellule de la colonne W en partant du bas contenant TERMINER
            If Not C Is Nothing Then 'Si la variable C n'est pas nul (si on à trouvé une cellule contenant TERMINER alors :
                NewLig = C.Row + 1 'La varibale NewLig prend pour valeur le numéro de la ligne suivant la ligne représentée par C
                Set C = Nothing
                f1.Range("B" & Lig & ":W" & Lig).Cut 'La plage est coupée
                f1.Range("B" & NewLig).Insert Shift:=xlDown 'La plage coupée est insérée sous la dernière ligne contenant TERMINER
            Else 'Si on à pas trouvé de cellule contenant TERMINER
                f1.Range("B" & Lig & ":W" & Lig).Cut 'La plage est coupée
                f1.Range("B10").Insert Shift:=xlDown 'La plage coupée est insérée en B10
            End If 'Fin du si la varibale C
        End If
    End If
    If Not Intersect(Target, f1.Range("V:V")) Is Nothing Then
        StopProcess = True
        Lig = Target.Row
        If UCase(Target) Like "*REFECTION*" Then 'Si la cellule sélectionnée contient le terme REFECTION alors
            f1.Range("B" & Lig & ":W" & Lig).Copy 'La plage est copiée
            f3.Range("B10").Insert Shift:=xlDown 'La plage copiée est insérée à partir de la cellule B10 sur f3 en décalant les autres cellules vers le bas
        End If
    End If
End If
End Sub

Je met le code final ici pour les intéressés !

Dim StopProcess As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Crit As String, NoDossier As String
Dim Lig As Integer, NewLig As Integer
Dim f1 As Worksheet, f2 As Worksheet, f3 As Worksheet, f4 As Worksheet
Dim C As Object
Dim Max As Long

'La variable StopProcess permet d'empécher l'excution en boucle du code
If StopProcess = True Then StopProcess = False: Exit Sub

Set f1 = Sheets("GESTION") 'La variable f1 représente la feuille GESTION
Set f2 = Sheets("BRT FACTURER") 'Même principe
Set f3 = Sheets("REFECTION") 'Même principe
Set f4 = Sheets("LIAISON B") 'Même principe

If Selection.Count = 1 Then 'Si une seule cellule est sélectionnée alors :
    If Not Intersect(Target, f1.Range("Y:Y")) Is Nothing Then 'Si la cellule séletionnée se trouve dans la colonne Y de f1 alors :
        Crit = UCase(Target) 'La varibale Crit représente le contenue de la cellule sélectionnée en majuscule
        If Crit = "FACTURER" Then 'Si la varibale Crit = FACTEUR alors :
            StopProcess = True 'La variable StopProcess passe à l'état VRAI
            Max = f2.Range("B" & Rows.Count).End(xlUp).Row + 1
            Lig = Target.Row 'La varibale Lig prend pour valeur le numéro de la ligne sélectionnée
            f1.Range("B" & Lig & ":Y" & Lig).Cut f2.Range("B" & Max) 'La plage contenue entre les colonnes B et Y sur la ligne représenté par Lig est coupée
            f2.Range("A" & Max) = Date 'La date du jour est insérée dans la cellule A10 de f2
            StopProcess = True
            f1.Range("B" & Lig & ":Y" & Lig).Delete Shift:=xlUp 'La plage précedement définie sur f1 est effacée avec un décalage des autres cellules vers le haut
            Exit Sub
        End If 'Fin du si Crit = FACTURER

        If Crit = "TERMINER" Then
            StopProcess = True
            Lig = Target.Row
            f1.Range("B" & Lig & ":Y" & Lig).Cut
            f1.Range("B10").Insert Shift:=xlDown
        End If

        If Crit = "EN COURS" Then
            StopProcess = True
            Lig = Target.Row
            Set C = f1.Range("Y:Y").Find("TERMINER", LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious)
            'C représente la première la première cellule de la colonne Y en partant du bas contenant TERMINER
            If Not C Is Nothing Then 'Si la variable C n'est pas nul (si on à trouvé une cellule contenant TERMINER alors :
                NewLig = C.Row + 1 'La varibale NewLig prend pour valeur le numéro de la ligne suivant la ligne représentée par C
                Set C = Nothing
                f1.Range("B" & Lig & ":Y" & Lig).Cut 'La plage est coupée
                f1.Range("B" & NewLig).Insert Shift:=xlDown 'La plage coupée est insérée sous la dernière ligne contenant TERMINER
            Else 'Si on à pas trouvé de cellule contenant TERMINER
                f1.Range("B" & Lig & ":Y" & Lig).Cut 'La plage est coupée
                f1.Range("B10").Insert Shift:=xlDown 'La plage coupée est insérée en B10
            End If 'Fin du si la varibale C
        End If
    End If

    If Not Intersect(Target, f1.Range("V:V")) Is Nothing Then
        Lig = Target.Row
        Max = f3.Range("B" & Rows.Count).End(xlUp).Row + 1
        If UCase(Target) = "A FAIRE" Then 'Si la cellule sélectionnée = A FAIRE
            f1.Range("B" & Lig & ":Y" & Lig).Copy f3.Range("B" & Max) 'La plage est copiée
        End If
        If Target = "" Then 'Si la cellule sélectionnée est vide
            Lig = Target.Row
            NoDossier = f1.Range("C" & Lig) 'La varibale NoDossier représente le contenue de la cellule de contenant le N° de dossier
            Set C = f3.Range("C:C").Find(NoDossier, LookIn:=xlValues, LookAt:=xlWhole) 'Recherche de la cellule contenant ce même N° de dossier du f3
            If Not C Is Nothing Then 'Si le dossier à été trouvé alors :
                NewLig = C.Row 'NewLig prend pour valeur le numéro de la ligne où se trouve le dossier
                f3.Range("B" & NewLig & ":Y" & NewLig).Delete Shift:=xlUp 'La plage correspondate au N° du dossier est supprimée
                Set C = Nothing
            End If 'Fin de la suppression du dossier
        End If
    End If

    If Not Intersect(Target, f1.Range("W:W")) Is Nothing Then
        Lig = Target.Row
        Max = f4.Range("B" & Rows.Count).End(xlUp).Row + 1
        If UCase(Target) = "A FAIRE" Then 'Si la cellule sélectionnée = A FAIRE
            f1.Range("B" & Lig & ":Y" & Lig).Copy f4.Range("B" & Max) 'La plage est copiée
        End If
        If Target = "" Then
            Lig = Target.Row
            NoDossier = f1.Range("C" & Lig)
            Set C = f4.Range("C:C").Find(NoDossier, LookIn:=xlValues, LookAt:=xlWhole)
            If Not C Is Nothing Then
                NewLig = C.Row
                f4.Range("B" & NewLig & ":Y" & NewLig).Delete Shift:=xlUp
                Set C = Nothing
            End If
        End If
    End If
End If
End Sub
Rechercher des sujets similaires à "copie coller vba"