Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 VBA - Transferer une ligne d un onglet a l autre

Saumon80

XLDnaute Occasionnel
Bonjour ,

Jai un fichier et souhaiterais savoir comment transferer une ligne d un onglet a lautre sous conditions ?

Je souhaiterais ajouter une colonne J de l onglet pending complaints qui si elle a la valeur "complete" la deplace dans longlet "resolved complaints' a la suite des autres existantes:

Existe il un code permettant de faire cela?

Merci
 

Pièces jointes

  • complaint-management-system-version-1-0.xlsm
    56.4 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Saumon,
Sérieusement, j'ai rien compris.
Jai un fichier et souhaiterais savoir comment transferer une ligne d un onglet a lautre sous conditions ?
ok, je transfère une ligne de Pending_Complaints vers la feuille Resolved_Complaints sur conditions.

Je souhaiterais ajouter une colonne J de l onglet pending complaints qui si elle a la valeur "complete" la deplace dans longlet "resolved complaints' a la suite des autres existantes:
La feuille Pending_Complaints n'a pas de colonne J occupée.
Que doit on faire ?
Est ce cela :
Si en Pending_Complaints je trouve "Complète" en colonne J sur une ligne alors je transfère cette ligne à la fin de la feuille Resolved_Complaints, et je l'efface de la feuille Pending_Complaints ?
Seulement Pending_Complaints à 9 colonnes, et Resolved_Complaints 12 colonnes. Donc quelles colones doit on copiées ?
 

job75

XLDnaute Barbatruc
Bonjour Saumon80, sylvanu,

Bah on peut toujours faire un essai avec le fichier joint et ce code dans la 2ème feuille :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Cells(Target.Row, 10) <> "Complete" Then Exit Sub
Cancel = True
With Sheets("Resolved_Complaints")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .Cells(.Rows.Count, 1).End(xlUp)(2)
        .Resize(, 9) = Cells(Target.Row, 1).Resize(, 9).Value
        Target.EntireRow.Delete
        .Cells(1, 10) = "it's done"
        .Cells(1, 11) = Environ("UserName")
        .Cells(1, 12) = Date
    End With
End With
End Sub
et adapter ensuite ce qu'il faut adapter.

A+
 

Pièces jointes

  • complaint-management-system-version-1-0.xlsm
    62.7 KB · Affichages: 6

Saumon80

XLDnaute Occasionnel
Bonjour Saumon,
Sérieusement, j'ai rien compris.
Bonjour Sylvanu et Desole pour la confusion.
Oui tout a fait , je viens de rajouter la colonne J , en effet la logique que vous mentionne est exacte.
Il faudrait dans ce cas copier de la colonne A a I de longlet pending conplaints vers resolved complaints . Dans l onglet resolved complaints les colonnes J a L sont en addition.
 

Pièces jointes

  • Complaint-Management-System-version-1.0.xlsm
    54.1 KB · Affichages: 2

Saumon80

XLDnaute Occasionnel
Bonjour Job75,

Parfait ! Merci beaucoup cela marche en effet.
Est-il possible de declencher le transfert une fois la saisie du mot "complete" dans le fichier ou d'avoir autrement un bouton qui transfere toutes les lignes marques "complete" en lieu du double click?

Merci encore!
 

job75

XLDnaute Barbatruc
Est-il possible de declencher le transfert une fois la saisie du mot "complete" dans le fichier
Voyez le fichier joint avec cette macro :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim F As Worksheet, n&, P As Range, c As Range
Set F = Sheets("Resolved_Complaints") 'à adapter
With [A1].CurrentRegion.Resize(, 10)
    n = Application.CountIf(.Columns(10), "Complete")
    If n = 0 Then Exit Sub
    Set P = .Offset(1).Resize(.Rows.Count - 1)
    Application.ScreenUpdating = False
    Application.EnableEvents = False 'désactive les évènements
    If FilterMode Then ShowAllData 'si la feuille est filtrée
    .Rows.Hidden = False 'affiche toutes les lignes, au cas où...
    .AutoFilter 10, "Complete" 'filtre automatique sur la colonne J
    If F.FilterMode Then F.ShowAllData 'si la feuille est filtrée
    Set c = F.Cells(F.Rows.Count, 1).End(xlUp)(2)
    P.Copy c 'copie-colle la zone filtrée
    c(1, 10).Resize(n) = "it's done"
    c(1, 11).Resize(n) = Environ("UserName")
    c(1, 12).Resize(n) = Date
    P.SpecialCells(xlCellTypeVisible).EntireRow.Delete 'supprime les lignes sources copiées
    .AutoFilter 'ôte le filtre
    Application.EnableEvents = True 'réactive les évènements
End With
End Sub
Elle fonctionne même si l'on entre "Complete" sur des sélections multiples en colonne J.

Bonne nuit.
 

Pièces jointes

  • Complaint-Management-System-version-1.1.xlsm
    66.8 KB · Affichages: 2
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Saumon80, le forum,

Si l'on veut pouvoir utiliser des tableaux structurés il faut faire quelques modifications :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim F As Worksheet, n&, P As Range, c As Range
Set F = Sheets("Resolved_Complaints") 'à adapter
With [A1].CurrentRegion
    n = Application.CountIf(.Columns(10), "Complete")
    If n = 0 Then Exit Sub
    Set P = .Offset(1).Resize(.Rows.Count - 1)
    Application.ScreenUpdating = False
    Application.EnableEvents = False 'désactive les évènements
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    .Rows.Hidden = False 'affiche toutes les lignes, au cas où...
    .AutoFilter 10, "Complete" 'filtre automatique sur la colonne J
    Set c = F.UsedRange(F.UsedRange.Rows.Count + 1, 1)
    While c(0) = "": Set c = c(0): Wend 'pour trouver la 1ère cellule vide
    P.Copy c 'copie-colle la zone filtrée
    c(1, 10).Resize(n) = "it's done"
    c(1, 11).Resize(n) = Environ("UserName")
    c(1, 12).Resize(n) = Date
    Set P = P.SpecialCells(xlCellTypeVisible) 'mémorise
    .AutoFilter: .AutoFilter 'ôte le filtre
    P.Delete xlUp 'supprime les lignes sources copiées
    Application.EnableEvents = True 'réactive les évènements
End With
End Sub
La macro fonctionne que les tableaux soient structurés ou non.

A+
 

Pièces jointes

  • Complaint-Management-System-version-1.1.xlsm
    66.7 KB · Affichages: 14

Saumon80

XLDnaute Occasionnel
Bonjour Job75,

Desole de vous deranger encore, mais quand je fais une saisisie dans le dernier fichier je ne peux la valider car je recoit le message d erreur suivant :



Quand j'utilise le fichier initial cela marche cependant. Est-ce du a mon PC?

Merci
 

job75

XLDnaute Barbatruc
Il y a de nombreux exemples sur le forum sur la manière de remplir une ComboBox ou ListBox par la méthode .List, si vous n'y arrivez pas créez une nouvelle discussion.

De toute façon ce n'est plus l'objet de ce fil.
 

Discussions similaires

Réponses
20
Affichages
721
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…