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 :

Reporter des valeurs sur une colonne, exceptée une [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut Reporter des valeurs sur une colonne, exceptée une
    Bonjour tout le monde,

    Voilà, je découvre VBA et après pas mal de recherches je reste bloqué sur ce problème.

    Je possède un fichier Excel avec en Feuille 1 (Feuil1), une colonne de valeurs (commençant par A1) comme :

    01-001
    02-001
    01-002
    00-000
    03-001
    02-002
    00-000
    00-000
    03-002
    ...


    Je voudrais reporter les valeurs de cette colonne sur la Feuille 2 (Feuil2) à partir de A1 sauf la valeur "00-000". A la place, la valeur suivante (différente de "00-000") sera recopiée. Ainsi ma colonne de valeurs sur la feuille 2 n'aura pas de cellules vides.
    Je cherche à faire une VBA qui ferait automatiquement la suppression de "00-000" sur la feuille 2. Je ne sais pas si c'est possible ni comment résoudre ce problème. C'est pourquoi je fais appel à votre aide aimable.
    Je vous remercie par avance pour votre contribution.

  2. #2
    Membre éclairé Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Points : 758
    Points
    758
    Par défaut


    Bonjour,

    Oui, c'est tout à fait possible !

    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
    'Définition des variables
    Dim lastLine as single
    Dim TempArray
    Dim I as single, J as single
     
    'Calcul de la dernière ligne remplie de la colonne A de la feuille 1
    lastLine =  Worksheets("Feuil1").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
     
    'Assigne la plage dans un tableau pour gain de vitesse d’exécution
    TempArray = Worksheets("Feuil1").Range("A1:A" & lastLine)
     
    'Initialisation de J
    J = 1
     
    'Parcours le tableau
    For I = LBound(TempArray, 1) To UBound(TempArray, 1)
     
        'Si une valeur est différente de "00-000" alors on l'exporte dans la feuille 2
        If TempArray(I, 1) <> "00-000" Then 
            Worksheets("Feuil2").cells(J, 1) = TempArray(I, 1)
            J = J + 1
        End if
    Next I
    Tu peux essayer quelque chose comme ça, si tu as besoin de plus d'explication, n'hésite pas à revenir !
    Citation Envoyé par Oscar Wilde
    Je déteste les discussions: elles vous font parfois changer d'avis.

  3. #3
    Membre averti Avatar de LawNasK
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2015
    Messages : 144
    Points : 391
    Points
    391
    Par défaut
    Bonjour,

    Deux solutions me viennent immédiatement en tête :

    1 : Une boucle qui parcours la feuille 1. Cette méthode risque d'être lente pour un grand nombre de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub un()
        Dim i As Integer
        Dim compteurLigne As Integer
     
        compteurLigne = 1
     
        With ThisWorkbook.Worksheets("feuile1")
        For i = 1 To .Range("A1").End(xlDown).Row
            If .Range("A" & i).Value <> "00-000" Then
                ThisWorkbook.Worksheets("feuile2").Range("A" & compteurLigne).Value = .Range("A" & i).Value
                compteurLigne = compteurLigne + 1
            End If
        Next
    End Sub
    2 : Plus rapide mais impossible s'il y a déjà des données dans la feuille 2, car cela effacerait des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub deux()
        With ThisWorkbook.Worksheets("feuille2").Range("A:A")
            .Value = ThisWorkbook.Worksheets("feuille1").Range("A:A").Value
     
            .AutoFilter Field:=1, Criteria1:="00-000"
            .SpecialCells(xlCellTypeVisible).Rows.Delete
     
            .AutoFilter
        End With
    End Sub

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup à vous ! J'ai testé vos scripts, ça fonctionne comme je le voulais. Cependant, quand je rajoute une valeur sur la colonne de la feuille 1, elle ne s'affiche pas automatiquement sur la feuille 2. Comment peut-t-on y remédier à ça?

  5. #5
    Membre averti Avatar de LawNasK
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2015
    Messages : 144
    Points : 391
    Points
    391
    Par défaut
    C'est un peu lourd, mais tu peux lancer l’exécution automatique de la macro à chaque modification de ta plage A:A

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Comme je l'avais dit plus haut, je débute sur VBA et je me perds assez facilement. Pourrais-tu, s'il te plait, m'expliquer la démarche pour que ma macro s’exécute automatiquement?

    Aussi, quand tu dis que c'est un peu lourd, est-ce que ça signifie que mon fichier Excel prendra plus de temps pour se charger?

  7. #7
    Membre averti Avatar de LawNasK
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2015
    Messages : 144
    Points : 391
    Points
    391
    Par défaut
    J'ai trouvé ça sur le support Microsoft :

    A mettre dans le code de la feuille1 et non pas dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim KeyCells As Range
     
        ' La variable KeyCells contient les cellules qui déclencheront
        ' une alerte si elles sont modifiées.
        Set KeyCells = Range("A:A")
     
        If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
            Call maFonctionQuiRecopie
        End If
    End Sub
    Aussi, quand tu dis que c'est un peu lourd, est-ce que ça signifie que mon fichier Excel prendra plus de temps pour se charger?
    Pas spécialement à charger, mais lors de la modification d'une cellule de la colonne A, il y aura une latence du temps de l’exécution de la macro pour la mise à jour.

  8. #8
    Membre éclairé Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Points : 758
    Points
    758
    Par défaut


    Non, pas spécialement, c'est jusque la macro va se lancer à chaque modification de la colonne A.

    Il existe une autre méthode, sans passer par du VBA :


    Dans la Feuil1, tu insère une colonne à gauche de A (nouvellement A), et tu recopie simplement
    que tu tire jusqu'ou tu veux.

    Dans la colonne A de ta feuille 2, tu insère cette formule que tu valide avec ctrl + shift + enter (formule matricielle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(INDEX(Feuil1!$A$1:$A$15;PETITE.VALEUR(SI(Feuil1!$A$1:$A$15<>"";LIGNE($1:$15));LIGNE(A2));1);"")
    Si tu as bien validé avec ctrl + shift + enter, tu as des "{}" autour de ta formule. Tu la tire jusqu'ou tu veux, dans mon exemple, je l'ai tiré jusqu'à la ligne 15.

    Normalement, ce que je fais :

    Dans la nouvelle colonne A de la feuille 1, je fais une liste sans la valeur "00-000", mais avec des cellules vides. Dans la colonne A de la feuille 2, je récupère cette liste sans les cellule vide.
    Citation Envoyé par Oscar Wilde
    Je déteste les discussions: elles vous font parfois changer d'avis.

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour.

    Citation Envoyé par carte_blanche Voir le message
    reporter les valeurs de cette colonne sur la Feuille 2 (Feuil2) à partir de A1 sauf la valeur "00-000"
    C'est possible en seulement deux lignes de code via un filtre avancé avec un titre de colonne …


    __________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Merci pour vos réponses. Finalement j'ai fait sans VBA en suivant la méthode de Nico, c'est plus facile et moins "lourd" aussi

    Bonne journée à vous!

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

Discussions similaires

  1. [XL-2007] Selection avec répartition des valeurs sur les colonnes
    Par lili31 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 20/04/2012, 10h16
  2. Réponses: 0
    Dernier message: 06/06/2011, 13h31
  3. [WD16] Récupérer la valeur d'une colonne d'une table d'une ligne précise
    Par elghers_hocine dans le forum WinDev
    Réponses: 16
    Dernier message: 06/05/2011, 18h11
  4. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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