IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Déplacer des lignes dans un autre onglet selon valeur d'une cellule [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut Déplacer des lignes dans un autre onglet selon valeur d'une cellule
    Bonjour les cracks,

    Mon caprice est peut-être impossible ou trop compliqué, mais qui ne demande rien n'a rien...

    Dans le tableau ci-joint, je voudrais que les lignes dont la valeur n'est pas nulle dans la colonne G soient déplacées dans l'onglet "Absents". De même, lorsque l'absence est supprimée en G de l'onglet "Absents", la ligne revienne dans le premier onglet.

    Je joins un fichier exemple (à noter qu'en réalité j'ai beaucoup plus de colonnes mais mon critère est la colonne des absences).


    Un merci beaucoup à ceux qui voudront bien consacrer quelques temps à ma demande.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Voici un exemple pour transférer les absences.
    Il te suffit d'utiliser le même principe pour faire l'inverse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TransfertAbsence()
        Dim nbLignes As Long, Ligne As Long
     
        Sheets("Suivi").AutoFilterMode = False  'enlève les filtres
        nbLignes = Sheets("Suivi").Cells(Rows.Count, "A").End(xlUp).Row  'détermine le nombre de lignes
        Sheets("Suivi").Rows(1).AutoFilter Field:=7, Criteria1:="<>"  'filtre sur les non vides
     
        Ligne = Sheets("Absents").Cells(Rows.Count, "A").End(xlUp).Row + 1  'détermine la première ligne vide
        Sheets("Suivi").Range("A2:G" & nbLignes).SpecialCells(xlCellTypeVisible).Copy
        Sheets("Absents").Range("A" & Ligne).PasteSpecial xlPasteValues
     
        Application.CutCopyMode = False
    End Sub
    petit oubli...
    J'ai utilisé Copy, mais ça aurait dû être Cut pour couper...

  3. #3
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut Ça marche mais...
    Bonjour Parmi !

    Nous avons un très bon début. Merci !

    Cependant, si je remplace Copy par Cut, VBA surligne la ligne en jaune. Il n'aime vraisemblablement pas le Cut. On pourrait laisser le Copy et lui demander ensuite d'effacer les lignes en "Suivi" qui ont été filtrées ?

    J'ai une autre question : ce code fonctionne soit en insérant un bouton dans mon tableau ou dans la barre d'outils, soit en appelant la macro depuis l'onglet Développeur. Cependant, au départ, mon idée était de lancer la macro au moment où l'utilisateur fait un choix dans la liste déroulante des absences, c'est à dire que la mise à jour se fait au fur et à mesure de la saisie. Est-ce que ça modifie beaucoup le code dans ce cas ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    On pourrait utiliser Worksheet_Change()
    Mais que se passe-t-il si les autres cellules ne sont pas remplies ?

    Ça donnerait ceci sans autre validation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim nbLignes As Long, Ligne As Long
     
        'Vérifier si on a bien changé la valeur en G
        If Target.Column <> 7 Then Exit Sub
     
        If Target.Value <> "" Then
     
           Ligne = Sheets("Absents").Cells(Rows.Count, "A").End(xlUp).Row + 1  'détermine la première ligne vide
     
           'Copie de la ligne en cours
           Sheets("Suivi").Range("A" & Target.Row & ":G" & Target.Row).Copy Sheets("Absents").Range("A" & Ligne)
           Sheets("Suivi").Rows(Target.Row).Delete
     
           Application.CutCopyMode = False
        End If
    End Sub

  5. #5
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Mais que se passe-t-il si les autres cellules ne sont pas remplies ?
    Très bonne remarque, je n'avais pas pensé à ça... On revient donc à nos moutons du début, et je m'arrangerai avec le moment où ça se déclenche.

    Pourquoi est-ce que le Cut ne marche pas ? Comment indiquer en VBA de supprimer les lignes filtrées en "Suivi" une fois qu'elles ont été copiées en "Absents" ? J'ai essayé de faire un enregistrement de macro pour l'adapter dans votre code mais je vois que la référence à la plage est absolue, donc ça va niaiser (je ne sais pas comment lui écrire la référence relative des lignes filtrées) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveSheet.Range("$A$1:$G$15").AutoFilter Field:=7, Criteria1:="<>"
        Rows("2:9").Select
        Selection.Delete Shift:=xlUp

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Mon 2e code fonctionne bien et rapidement.
    Il faudrait, par contre, valider les champs "obligatoires" avant de copier les données.

    Est-ce que les 6 autres colonnes doivent être remplies

    En supposant que toutes les cellules doivent être remplies, on pourrait valider ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim nbLignes As Long, Ligne As Long
     
        'Vérifier si on a bien changé la valeur en G
        If Target.Column <> 7 Then Exit Sub
     
        If Target.Value <> "" Then
            If IsValide(Target.Row) Then
                Ligne = Sheets("Absents").Cells(Rows.Count, "A").End(xlUp).Row + 1  'détermine la première ligne vide
     
                'Copie de la ligne en cours
                Sheets("Suivi").Range("A" & Target.Row & ":G" & Target.Row).Copy Sheets("Absents").Range("A" & Ligne)
                Sheets("Suivi").Rows(Target.Row).Delete
     
                Application.CutCopyMode = False
            Else
                MsgBox "Toutes les cellules doivent être remplies", vbInformation, "Erreur de données"
            End If
        End If
    End Sub
     
    Function IsValide(Ligne As Long) As Boolean
        Dim I As Long
     
        IsValide = True
     
        For I = 1 To 6
            If Cells(Ligne, I) = "" Then
                IsValide = False
                Exit For
            End If
        Next
    End Function

  7. #7
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    En fait, mon "vrai" tableau va jusqu'à la colonne R.
    Le motif d'absence est dans la colonne J.
    Les colonnes obligatoirement remplies sont A, B, D, F, G et J. Les autres sont facultatives.
    (Je suis capable d'adapter votre code à mes colonnes).
    Le déclenchement de la macro sur le choix de l'absence serait possible mais cela impliquerait que le focus reste sur l'onglet "Absents" pour finir de remplir la ligne, le cas échéant. Même chose à l'inverse. (Car dans les colonnes suivantes j'ai des dates de départ et des dates de retour selon le cas).

    Donc le code devrait supprimer les lignes filtrées dans "Suivi" mais ramener l'utilisateur à "Absents" pour qu'il finisse sa saisie... Ça fait un peu compliqué non ?

    Je vais essayer vos propositions sur mon tableau test et vous en donne des nouvelles ! Merci encore !

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    En fait, dans mon dernier code, ça se passe uniquement dans l'onglet Suivi.
    Il faudra faire la même chose au niveau de la feuille Absence tout en modifiant légèrement le code
    Si les données ne sont pas entrées selon la Function IsValide, ça ne fait rien du tout.
    Et il n'y a plus besoin des filtres.

  9. #9
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Bonjour Parmi !

    J'ai été bien occupée sur un autre projet depuis la semaine dernière et je n'avais pas eu le temps de tester votre dernier code. Il me plait beaucoup mais je voudrais étendre la sélection de la ligne jusqu'à la colonne S.

    J'ai donc modifié le code comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Suivi").Range("A" & Target.Row & ":S" & Target.Row).Copy Sheets("Absents").Range("A" & Ligne)
                Sheets("Suivi").Rows(Target.Row).Delete
    Mais le message d'avertissement que toutes les cellules doivent être remplies apparaît. Je veux bien laisser ce message, mais pour les cellules A, B, D, F, G et J. Comment faire ? Également, dans le code de validation, "1 to 6" correspond à des colonnes ? A à F ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function IsValide(Ligne As Long) As Boolean
        Dim I As Long
     
        IsValide = True
     
        For I = 1 To 6
            If Cells(Ligne, I) = "" Then
                IsValide = False
                Exit For
            End If
        Next
    End Function
    Merci !

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    On pourrait modifier la méthode en créant un tableau qui contient les numéros de colonnes à vérifier
    Sans tester, ça deverait donner ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function IsValide(Ligne As Long) As Boolean
        Dim I As Long
        Dim ArrColonnes
     
        IsValide = True
        srrColonnes = Array(1, 2, 4, 6, 7, 10)    
     
        For I = 0 to UBounf(arrColonnes)
            If Cells(Ligne, arrColonnes(I)) = "" Then
                IsValide = False
                Exit For
            End If
        Next
    End Function

  11. #11
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    1 - j'ai corrigé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    srrColonnes = Array(1, 2, 4, 6, 7, 10)
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrColonnes = Array(1, 2, 4, 6, 7, 10)
    , j'ai bien fait ?

    2 - il y a une erreur de compilation sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For I = 0 to UBounf(arrColonnes)
    Fonction UBounf inconnue au bataillon ?

    Merci !

  12. #12
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,

    en cherchant un peu sur l'utilisation des tableaux => "Ubound"

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Désolé...
    Je suis allé un peu vite

    c'est bien arrColonnes (arr pour array)
    Et c'est bien UBound() comme l'a bien dit casefayere

  14. #14
    Membre régulier
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2013
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 220
    Points : 98
    Points
    98
    Par défaut
    Et bien merci à Casefayere pour le d de Bound

    Et un GRAND merci à Parmi car mon problème est ré-so-lu !!

    Bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2000] copier une ligne dans un autre onglet
    Par chouki60 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/10/2009, 13h10
  2. rechercher une date et copier la ligne dans un autre onglet
    Par ptitloup57 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/02/2009, 13h34
  3. Déplacer des messages dans un autre dossier
    Par ouadie99 dans le forum Outlook
    Réponses: 5
    Dernier message: 26/02/2008, 17h10
  4. Déplacer des lignes dans une autre feuille
    Par dj-julio dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 22/11/2007, 09h24
  5. Réponses: 3
    Dernier message: 12/04/2006, 20h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo