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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 609
    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 609
    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 éclairé
    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
    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 609
    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 609
    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 éclairé
    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
    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 609
    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 609
    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
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

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

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

    en cherchant un peu sur l'utilisation des tableaux => "Ubound"
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    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 609
    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

  9. #9
    Membre éclairé
    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
    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, 14h10
  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, 14h34
  3. Déplacer des messages dans un autre dossier
    Par ouadie99 dans le forum Outlook
    Réponses: 5
    Dernier message: 26/02/2008, 18h10
  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, 10h24
  5. Réponses: 3
    Dernier message: 12/04/2006, 21h44

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