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 :

VBA Rechercher cellules dans colonne, puis copier-coller


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 12
    Par défaut VBA Rechercher cellules dans colonne, puis copier-coller
    Bonjour,

    Je suis débutante sur VBA et je cherche un code qui me permette de chercher chaque valeur de ma colonne A ("Feuil1") dans la colonne A ("Feuil2").
    S'il ne le trouve pas, alors il ajoute cette cellule à la fin de mon tableau de référence en Feuil 2.

    Il me manque la fonction find je pense mais je vois comment/où la mettre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim i As Long
     
    For i = 1 To Sheets("SourceFormations").Range("A" & Rows.Count).End(xlUp).Row
        With Worksheets("Classements").Range("A:A")
        If Not i Is Nothing Then
        ActiveSheet.Range("A" & i).Copy
        Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
        End If
    Next i
     
    ActiveSheet.Range("A:A").RemoveDuplicates Columns:=1, Headers:=xlYes
     
    End Sub

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Bonjour,
    #Dim i As Long

    For i = 1 To Sheets("SourceFormations").Range("A" & Rows.Count).End(xlUp).Row
    With Worksheets("Classements").Range("A:A")
    If Not i Is Nothing Then
    ActiveSheet.Range("A" & i).Copy
    Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
    End If
    Next i

    ActiveSheet.Range("A:A").RemoveDuplicates Columns:=1, Headers:=xlYes

    End Sub#
    C'est mignon, tu as fait l'effort de mettre les balises #, mais ce n'est pas vraiment comme ça que ça marche Tu surlignes ton code, puis tu cliques sur le bouton # parmis les boutons au-dessus de la plage d'écriture.

    Pourquoi écris-tu cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not i Is Nothing Then
    Vu qu'il y a la boucle for, i est un nombre entre 1 et Sheets("SourceFormations").Range("A" & Rows.Count).End(xlUp).Row.
    Si tu as peur que Sheets("SourceFormations").Range("A" & Rows.Count).End(xlUp).Row renvoie une erreur, il vaut mieux que tu vérifies avant de rentrer dans ta boucle si Sheets("SourceFormations").Range("A" & Rows.Count).End(xlUp).Row renvoie bien un nombre.

    Ensuite, au lieu de faire un copier-coller spécial valeur, écris directement la valeur dans ta cellule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = ActiveSheet.Range("A" & i).Value
    Puis, plusieurs erreurs sur la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     With Worksheets("Classements").Range("A:A")
    Tu ne le finis pas avec un End With.
    A quoi te sert cette ligne? Que veux-tu faire avec cela? Tu ne l'utilises pas du tout plus tard, donc je ne vois pas à quoi elle te sert. Regarde l'aide sur With.

    Maintenant, venons-en à ta question : où placer le find?
    La réponse se trouve dans ta question :
    S'il ne le trouve pas, alors il ajoute cette cellule à la fin de mon tableau de référence en Feuil 2.
    Si --> condition If
    ne trouve pas --> Find renvoie une erreur
    Alors ... --> Then et action qu'il faut
    Pour savoir comment utiliser une condition If : https://msdn.microsoft.com/fr-fr/lib...=vs.80%29.aspx

    Personnellement, j'utilise jamais Find dans ce genre de cas, mais Match :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Match(valeur à trouver, plage de recherche, 0)
    Si Match ne trouve rien, il renvoie 0, donc la condition à vérifier serait = 0. Je trouve Match plus simple, mais c'est personnel Peut-être ai-je tort de procéder ainsi ...

    Essaie avec tout cela et reviens nous voir

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 12
    Par défaut
    Bonjour,

    Merci pour toutes ces indications!!

    En fait, j'ai une erreur au niveau de mon If Application et je suppose que c'est parce que mon i est un numéro de ligne et que je recherche une désignation.

    J'ai essayé de changer le code mais on me dit que Valeur_Cherchée est vide.

    Voilà ce que j'ai fait :

    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
    Sub nouveaute()
    Dim i As Long
    Dim Valeur_Cherchée As Variant
     
    For i = 1 To Sheets("SourceFormations").Range("A" & Rows.Count).End(xlUp).Row
    Set Valeur_Cherchée = Sheets("SourceFormations").Range("A" & i).Value
        If Application.Match(Valeur_Cherchée, Worksheets("Classements").Range("A:A"), 0) = 0 Then
        ActiveSheet.Valeur_Cherchée.Copy
        Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Valeur_Cherchée
        End If
    Next i
     
    ActiveSheet.Range("A:A").RemoveDuplicates Columns:=1, Headers:=xlYes
     
    End Sub
    Merci de votre aide !!

  4. #4
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Bonsoir,

    Enlève le "Set" avant Valeur_Cherchée
    Mieux comprendre les variables

    De plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveSheet.Valeur_Cherchée.Copy
        Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Valeur_Cherchée
        End If
    Ici ton Valeur_Cherchée n'est pas un Range donc il ne peut être copié ainsi. Donc tu peux enlever une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Valeur_Cherchée
        End If
    OU ALORS :

    si tu souhaites garder le set de ton code d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set Valeur_Cherchée = Sheets("SourceFormations").Range("A" & i).Value
        If Application.Match(Valeur_Cherchée, Worksheets("Classements").Range("A:A"), 0) = 0 Then
        ActiveSheet.Valeur_Cherchée.Copy
        Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Valeur_Cherchée
        End If
    Il faut que tu dise à Excel que Valeur_Cherchée est un Range soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Valeur_Cherchée = Sheets("SourceFormations").Range("A" & i)
    Est que du coup tu souhaites donner à ta cellule cible la valeur de se Range :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Application.Match(Valeur_Cherchée.Value, Worksheets("Classements").Range("A:A"), 0) = 0 Then
        Sheets("Classements").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Valeur_Cherchée.Value
        End If

  5. #5
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Je rejoins tout à fait Al__22 (je trouve que la 1ère façon de faire : utiliser une variable et pas un Range, est plus simple & intuitive, mais tu fais comme tu préfères )
    Juste un petit commentaire, dans tes noms de variables et autre, essaie de ne pas utiliser des caractères spéciaux comme é, è, à ... qui ne sont pas internationaux, c'est une bonne pratique à prendre.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Je procèderais personnellement de cette manière (écrite vite fait) :
    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
    Dim i As Long, derlig As Long, SHD As Worksheet, plage As Range
      Set SHD = Worksheets("Classements")
      With Worksheets("SourceFormations")
        derlig = .Range("A" & Rows.Count).End(xlUp).Row
        For i = 1 To derlig
           If .Range("A" & i).Value <> "" And WorksheetFunction.CountIf(SHD.Range("A:A"), .Range("A" & i).Value) = 0 Then
               If plage Is Nothing Then
               Set plage = .Range("A" & i)
             Else
               Set plage = Union(plage, .Range("A" & i))
             End If
           End If
        Next i
        If Not plage Is Nothing Then  plage.Copy Destination:=SHD.Range("A" & SHD.Range("A" & Rows.Count).End(xlUp).Row)
      End With

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 12
    Par défaut
    Bonjour,

    Vaut mieux tard que jamais!
    Voici un code qui fonctionne parfaitement au cas où quelqu'un d'autre en aurait besoin

    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
    Sub test_cathy()
    Dim a As Integer
    Worksheets("f2").Activate
    Range("A2").Activate
     
    Do While ActiveCell <> ""
    On Error Resume Next
    If WorksheetFunction.Match(ActiveCell, Range(Range("begin"), Range("begin").End(xlDown)), 0) = 0 Then
    Range("begin").End(xlDown).Offset(1, 0) = ActiveCell.Value
    End If
    Debug.Print (Err.Number)
    On Error GoTo 0
    a = WorksheetFunction.IfError(WorksheetFunction.Match(ActiveCell.Value, Range(Range("begin"), Range("begin").End(xlDown)), 0), 0)
    ActiveCell.Offset(1, 0).Activate
    Loop
     
    Sheets("f1").Activate
     
     
    End Sub

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/07/2015, 23h02
  2. Réponses: 1
    Dernier message: 18/12/2013, 13h14
  3. [XL-2007] Réaliser une recherche dans une colonne et copier coller les lignes
    Par Georges50 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 13/11/2013, 15h39
  4. Réponses: 1
    Dernier message: 09/02/2012, 18h30
  5. Réponses: 5
    Dernier message: 15/03/2007, 06h58

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