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 :

Réaliser une recherche dans une colonne et copier coller les lignes


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut Réaliser une recherche dans une colonne et copier coller les lignes
    Bonjour,

    Je continue à développer mon application, et je me retrouve bloquer.
    J'ai une feuille "SituationMateriel" ou apparait la liste des Entrée/Sortie du matériel. Dans cette feuille, il y a dans la colonne B, le code d'identification du matériel.
    J'ai créé une boîte de dialogue ou il y a 2 TextBox :
    - TextBox1 : Nom de la feuille à créer
    - TextBox2 : Numéro du code d'identification à rechercher

    Pour le moment j'utilise ce code, avec la fonction Find et FindNext.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Private Sub CommandButton2_Click()
     
    If Me.TextBox1.Value = "" Then
        MsgBox "Veuillez indiquer un nom de feuille, merci."
        Me.TextBox1.SetFocus
    Exit Sub
    End If
     
    If Me.TextBox2.Value = "" Then
        MsgBox "Veuillez indiquer un numéro d'identification, merci."
        Me.TextBox2.SetFocus
    Exit Sub
    End If
     
     'création d'une feuille pour y copier les données
    Dim sh As Worksheet
    Set sh = Worksheets.Add
    sh.Name = TextBox1
     
    ' Rechercher dans la liste, historique du matériel voulu
    Dim LastLign As Long ' Dernière ligne de la liste dans la feuille SituationMateriel
    Dim NewLign As Long 'Dernière ligne de la liste dans la feuille recherche Matériel
    Dim Pcellule As Range 'Première cellule trouver
    Dim Num As String 'Code d'identification
     
     
    LastLign = Range("SituationMateriel!B1048576").End(xlUp).Row
    NewLign = 2
    Num = TextBox2
     
    With Worksheets("SituationMateriel").Range("B1:B" & LastLign)
        Set c = .Find(Num)
        Set Pcellule = c 'enregistre le premier élémént trouver
        If Not c Is Nothing Then
        Do
            c.EntireRow.Copy Destination:=Worksheets(TextBox1).Range("B" & NewLign) 'copie la ligne dans l'autre feuille
            Set c = .FindNext(c) ' recherche si il y a un autre code dans la liste
            NewLign = NewLign + 1
        Loop While Not c Is Nothing And c <> Pcellule
    End If
    End With
     
    'Vide la BDD
    Unload Me
    RechercherMateriel.Hide
    Choix_Action.Show
     
    End Sub
    Le but de ce code, est de permettre de copier coller tout les lignes ou apparait le code d’identification tapé dans la TextBox2. Ces lignes sont collées dans une feuille créer dont le nom est écrit dans la TextBox1.

    Lorsque j’effectue un débogage pas à pas détaillé, j’ai une erreur d’exécution de type 13 : Incompatibilité de type 13 qui apparait à la ligne n°36 . Je ne comprends pas d’où viens cette erreur.

    En vous remerciant d'avance pour votre aide.

    Cordialement

  2. #2
    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 674
    Points
    18 674
    Par défaut
    Bonjour,

    comme dans ta précédente discussion, tu dois donc vérifier les variables de cette ligne …

    Sinon la plage de destination est plus petite que la plage source !
    Si tu copies la ligne entière alors la destination devrait être en colonne A, non ?!

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Oui, il faut vérifier toutes les variables de la colonne B dans la feuille SituationMatériel, pour trouver la ou les celulles ou est le code d'identification. puis copier coller toute la ligne.

    Oui, je me suis trompé, ce n'est pas B mais A la destination des lignes copiées.

    Est-ce le bon code qu'il faut utiliser pour effectuer ce type de recherches ?

  4. #4
    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 674
    Points
    18 674
    Par défaut
    Nan, nan, je parlais des variables de la ligne n°36 ‼

    Aucune variable dans une colonne, uniquement des cellules …

  5. #5
    Invité
    Invité(e)
    Par défaut Bonjour,
    si tu veux récupérer toutes les ligne qui match("A:A"), j'opterais pour un filtre actif en oubliant pas de supprimer le ligne de titre dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LastLign =worckseets("SituationMateriel").usedrange.rows.count +1
    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
    Sub test()
    Dim L As Long
    L = Sheets("FichierClient").UsedRange.Rows.Count + 1
     
        FiltreActif Sheets("ImportClient").UsedRange, Sheets("Filtre").UsedRange, Sheets("FichierClient").Range("A" & L), False
    Sheets(FichierClient).Cells(L, 1).EntireRow.Delete
    End Sub
     
    Function FiltreActif(RangeSource As Range, CriterRange As Range, CopyRange As Range, Optional Unique As Boolean = True) As Boolean
    FiltreActif = False
    On Error Resume Next
     RangeSource.AdvancedFilter Action:= _
            xlFilterCopy, CriteriaRange:=CriterRange _
            , CopyToRange:=CopyRange, Unique:=Unique
            DoEvents
            If Err = 0 Then FiltreActif = True
            'MsgBox Err.Description
            On Error GoTo 0
    End Function

  6. #6
    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 674
    Points
    18 674
    Par défaut

    … ou de masquer la ligne des titres après le filtre avant la copie des cellules visibles …

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    A vrai dire, je ne comprends pas trop, vérifier la variables de cette ligne ?
    La variable de la ligne c'est c, qui correspond à l'addresse ou a était trouvé le code d'identification ? Et c'est cette ligne qu'il faut copier puis coller dans une autre feuille.

  8. #8
    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 674
    Points
    18 674
    Par défaut

    Il y avait une erreur en ligne n°36, il fallait donc la vérifier, notamment les éléments variables y figurant …

    Et il y en a trois ‼

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Justement, je ne vois pas quelle est l'erreur de variable.

    Est-il possible d'écrire Worksheets(TextBox1) ?
    Ou est-ce plutôt c.entire.row ?

  10. #10
    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 674
    Points
    18 674
    Par défaut
    Oui si cela correspond textuellement à une feuille existante dans le classeur actif …

    Pour s'en sortir, mettre un point d'arrêt sur cette ligne (ou suivre en mode pas à pas via la touche F8)
    afin de vérifier ces éléments variables à l'exécution du code …

    Une erreur 13 c'est mélanger les torchons et les serviettes, ou l'accouplement entre un éléphant et une fourmi !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Le nom de la feuille n'est pas TextBox1, mais ce que j'ai écris dans TextBox1. D'ailleurs, quand une feuille est créer, elle est activer par défaut ? il faut l'activer ?
    Quand je fait le pas à pas et que je laisse le curseur sur les variables j'ai :
    Pour la variables Worksheets(TextBox) : ce que j'ai écris dans la TextBox qui apparait
    Pour NewLign, le chiffre 2 qui apparait.
    c'est à ce moment là que l'erreur de type 13 apparait.
    Mon impression, est que j'ai sans doute mal écris le début de la ligne de code...

    Rdurupt, je vois ou vous voulez en venir avec votre code. Ce code doit être insérer dans ma boucle ? ou il est la pour remplacer la boucle ?

  12. #12
    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 674
    Points
    18 674
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Oui si cela correspond textuellement à une feuille existante dans le classeur actif …
    Donc son classeur est-il actif ?

    Sinon, pas besoin de l'activer mais juste précéder la feuille par le classeur sur la ligne …

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Pour moi la feuille est actif, vu qu'elle est créer au début du code.

  14. #14
    Invité
    Invité(e)
    Par défaut
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Private Sub CommandButton2_Click()
     
    If Me.TextBox1.Text = "" Then
        MsgBox "Veuillez indiquer un nom de feuille, merci."
        Me.TextBox1.SetFocus
    Exit Sub
    End If
     
    If Me.TextBox2.Text = "" Then
        MsgBox "Veuillez indiquer un numéro d'identification, merci."
        Me.TextBox2.SetFocus
    Exit Sub
    End If
     
     'création d'une feuille pour y copier les données
    Dim sh As Worksheet
    Set sh = Worksheets.Add
    sh.Name = TextBox1
     
    ' Rechercher dans la liste, historique du matériel voulu
    Dim LastLign As Long ' Dernière ligne de la liste dans la feuille SituationMateriel
    Dim NewLign As Long 'Dernière ligne de la liste dans la feuille recherche Matériel
    Dim Pcellule As Range 'Première cellule trouver
    Dim Num As String 'Code d'identification
     Dim WbActif As Workbook
     Dim WbFiltre As Workbook
     Set WbActif = ActiveWorkbook
     Set WbFiltre = Workbooks.Add
     WbFiltre.Sheets(1).Range("A1") = sh.Range("A1")
     WbFiltre.Sheets(1).Range("A2") = Me.TextBox2.Text
     LastLign = WbActif.Worksheets("SituationMateriel").UsedRange.Rows.Count + 1
     FiltreActif sh.UsedRange, WbFiltre.Sheets(1).UsedRange, WbActif.Worksheets("SituationMateriel").Cells(LastLign, 1), False
        WbFiltre.Close False
     WbActif.Worksheets("SituationMateriel").Cells(LastLign, 1).EntireRow.Delete
     
    'NewLign = 2
    'Num = TextBox2
    '
    'With Worksheets("SituationMateriel").Range("B1:B" & LastLign)
    '    Set c = .Find(Num)
    '    Set Pcellule = c 'enregistre le premier élémént trouver
    '    If Not c Is Nothing Then
    '    Do
    '        c.EntireRow.Copy Destination:=Worksheets(TextBox1).Range("B" & NewLign) 'copie la ligne dans l'autre feuille
    '        Set c = .FindNext(c) ' recherche si il y a un autre code dans la liste
    '        NewLign = NewLign + 1
    '    Loop While Not c Is Nothing And c <> Pcellule
    'End If
    End With
     
    'Vide la BDD
    Unload Me
    RechercherMateriel.Hide
    Choix_Action.Show
     
    End Sub
    Function FiltreActif(RangeSource As Range, CriterRange As Range, CopyRange As Range, Optional Unique As Boolean = True) As Boolean
    FiltreActif = False
    On Error Resume Next
     RangeSource.AdvancedFilter Action:= _
            xlFilterCopy, CriteriaRange:=CriterRange _
            , CopyToRange:=CopyRange, Unique:=Unique
            DoEvents
            If Err = 0 Then FiltreActif = True
            'MsgBox Err.Description
            On Error GoTo 0
    End Function

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Rdurupt, le code que vous envoyé, permet de couper et coller les lignes dans un nouveau classeur ?

    Est-il possible de rechercher, copier et coller les lignes avec le premier code que j'ai mis ? Cela prends peut etre beaucoup de temps à calculer quand on lance les calculs ?

    Ce que je recherche c'est utiliser un seul classeur Excel, je comptais, une fois avoir réussi à copier coller les lignes, lancer une impression sous PDFcreator automatiquement. (ce que j'essayerai de faire, une fois mon premiere pbm régler).

  16. #16
    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 674
    Points
    18 674
    Par défaut
    Je laisse Robert répondre quant à son code mais j'ai juste une question Georges :

    pourquoi donc utiliser PDFCreator alors qu'à partir de la version 2007 Excel gère les fichiers .pdf ?!

  17. #17
    Invité
    Invité(e)
    Par défaut
    ile est toujours possible de copier coller avec la méthode Find, mais il faut adapter le code que je t'avais mis dans ton premier poste.

    ici on copie en une seule passe toutes les ligne concernées par Me.TextBox1.Text & Me.TextBox2.Text, pas besoin d'y revenir.

    la fonction FiltreActif permet de copier ce que veux, de l'endroit que tu veux ,vers ou tu veux

  18. #18
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il me semble à la première lecture de ta question que la première réponse faite par Robert (rdurupt) était la plus adéquate.
    En effet, si l'on veut exporter des données d'une liste de données vers une zone cible (autre plage de la même feuille ou d'une autre feuille se trouvant sur le même classeur ou pas), le filtre avancé d'excel est le plus simple et le plus rapide à utiliser.
    Pour comprendre les filtres avancés voir ce tutoriel Les filtres avancés ou élaborés dans Excel.

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Ok Rdurupt, je vais regarder le code, et essayer de l'adapter à ce que j'ai envie de faire, en ne conservant qu'un classeur.

    Effectivement, je ne savais pas que Excel 2007 permettais de sauvergarder en PDF directement. Merci pour cette précision.

    Je regarde cela, est reviens vers vous, si j'ai quelques soucis à mettre en oeuvre votre code Rdurupt.

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Je reviens vers vous, depuis le dernier message je n'ai pas eu le temps de vraiment me repencher sur mon pbm.

    Je viens d'essayer votre code Rdurupt, d'aprés ce que j'ai compris il créer une nouveau classeur excel pour y inscrire le code que j'ai écris dans la TextBox2.

    De plus, je ne maîtirse pas du tout les filtres. J'ai commencé à regarder le Tutoriel sur les filtres.

    Je reprend une explication :
    j'ai 2 TextBox, la TextBox1 ou j'écris le nom de la nouvelle feuille (intégrer au classeur) que je vais créer et la TextBox2 le code d'identification du matériel rechercher.

    Le Code d'identification est dans la colonne B. Le but est de pouvoir trouver toutes les lignes ou apparait le code tapé dans la TextBox2 pour copier la ligne entière et la coller dans la feuille créer.

    Le plus simple est-il d'utiliser un filtre ? ou d'utiliser des boucles ?

    En vous remerciant par avance.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/02/2015, 18h19
  2. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  3. Réponses: 6
    Dernier message: 21/06/2012, 16h13
  4. Réponses: 7
    Dernier message: 25/02/2011, 13h06
  5. Comment faire une recherche dans une combobox et une sélection automatique
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2009, 16h17

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