[VBA] Rechercher et copier une plage

Zaffe

XLDnaute Nouveau
Bonjour le forum,

Même si je pensais pouvoir me débrouiller seul j'ai finalement un peu de mal à résoudre mon problème seul, je ne suis pas assez perfectionner en VBA :(
Je souhaite rechercher sur 2 onglets toute ligne correspondant au numéro entrer dans la textebox et copier les plages, correspondante à ces lignes, sur la feuille recherche.

Si quelqu'un passe par la et a une solution je suis preneur.

Merci
 

Pièces jointes

  • Classeur.xls
    28.5 KB · Affichages: 139
  • Classeur.xls
    28.5 KB · Affichages: 141
  • Classeur.xls
    28.5 KB · Affichages: 125

Minick

XLDnaute Impliqué
Re : [VBA] Rechercher et copier une plage

Salut,

Tu peux essayer comme cela:
Code:
Private Sub CommandButton2_Click()
    Dim BD As Variant
    Dim CptBD As Byte
    
    BD = Array("BD1", "BD2")
    
    Sheets("Recherche").Range("A6:C" & Sheets("Recherche").Range("A6").End(xlDown).Row).ClearContents
    For CptBD = 0 To UBound(BD)
        With Sheets(BD(CptBD))
            .Range("A1:I" & .Range("A65536").End(xlUp).Row).AutoFilter Field:=1, Criteria1:=Sheets("Recherche").TextBox1.Text
            
            If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
                .Range("G2:I" & .Range("A65536").End(xlUp).Row).Copy
                Sheets("Recherche").Range("A" & Sheets("Recherche").Range("A65536").End(xlUp).Row + 1).PasteSpecial xlPasteValues
                Application.CutCopyMode = False
            End If
            .AutoFilterMode = False
        End With
    Next CptBD
End Sub
 

youky(BJ)

XLDnaute Barbatruc
Re : [VBA] Rechercher et copier une plage

Bonjour Zaff,
Voici un code, Nombre de BD non limité
Seuls les onglets commencant par BD sont pris en compte.
Bruno

Code:
Private Sub CommandButton2_Click()
lig = 6
[A6:C36].ClearContents
For onglet = 1 To Sheets.Count
If Left(Sheets(onglet).Name, 2) = "BD" Then
With Sheets(onglet)
For Each c In .Range("A2:A" & .[A65536].End(3).Row)
If Val(Sheets("Recherche").TextBox1.Value) = c.Value Then
Sheets("Recherche").Range("A" & lig & ":C" & lig).Value = _
.Range("G" & c.Row & ":I" & c.Row).Value
lig = lig + 1
End If
Next
End With
End If
Next
End Sub
 

Zaffe

XLDnaute Nouveau
Re : [VBA] Rechercher et copier une plage

Merci à vous deux pour vos codes, je vais essayer de les utiliser.

(Caluire et son bon vieux métro C, ca me manque tout ca :()

Edit : Après adaptation ca fonctionne très bien, todo esta muy bien ! Encore merci à vous 2
 
Dernière édition:

Zaffe

XLDnaute Nouveau
Re : [VBA] Rechercher et copier une plage

Avec un fichier excel de plus de 250 Mo, on va dire que excel à un peu de mal à répondre à mes demandes :D (ex: enregistrement => 1mn; macro => 2mn)...
Vous pensez qu'en créant 2 classeurs (1 avec les BD1, 2, 3...; et l'autre avec le reste) ca peut accélerer le tout ? Dans ce cas la ou dois-je mettre "With WorkBood dans le code ?
Merci d'avance :eek:
 

jeanpierre

Nous a quitté
Repose en paix
Re : [VBA] Rechercher et copier une plage

Bonjour Zaffe, Bruno, Minick,

Pfiou, 250Mo.... (normal que cela ne réponde pas et c'est moins lié à Excel qu'à la machine)

J'ai eu quelques fichiers assez énormes entre 13 et 19Mo, mais 250... ???

Je ne sais pas si la création de 2 fichiers distincts vont résoudre ton problème, j'ai l'impression que non...

Petite impression au passage.

Jean-Pierre
 

Minick

XLDnaute Impliqué
Re : [VBA] Rechercher et copier une plage

Salut,

Wahouuu, effectivement 250Mo j'ai jamais vu ca, pourtant j'ai vu passe pas mal de chose...

Je ne sais pas d'ou vient ta source de donnees (BD1, etc...) mais as-tu envisage de gerer cela dans une base de donnees type access?
 

Zaffe

XLDnaute Nouveau
Re : [VBA] Rechercher et copier une plage

Je me posais justement la question, mais me replonger dans l'univers Access et continuer à progresser en VBA ca risque d'être dur :D.

Je me disais qu'en me débarassant des bases (4 onglets de 65000 lignes et 30 colonnes = :eek:) qui fait à lui seul 99% du poid ca pourrait aller car jusqu'a là je n'ai pas eu trop de ralentissement sauf lors de la sauvergarde.

Ce dernier code est très rapide car en quelques secondes tout y est sauf que quand j'ai voulu le "doubler" avec le code ci dessous il a était moins performant (2 minutes pour me copier 50 lignes contre 3 secondes pour en copier 25)

Sheets("Données Graphique").Range("A" & lig & ":H" & lig).Value = _
.Range("BB" & c.Row & ":BI" & c.Row).Value
Sheets("Données Graphique").Range("J" & lig & ":AI" & lig).Value = _
.Range("BL" & c.Row & ":CK" & c.Row).Value
 

Zaffe

XLDnaute Nouveau
Re : [VBA] Rechercher et copier une plage

Salut,

Wahouuu, effectivement 250Mo j'ai jamais vu ca, pourtant j'ai vu passe pas mal de chose...

Je ne sais pas d'ou vient ta source de donnees (BD1, etc...) mais as-tu envisage de gerer cela dans une base de donnees type access?

Enfaite c'est un suivi des clients par semaine depuis 2009 avec la façon dont est passé les commandes... du coup ca en fait des lignes :D
 

Zaffe

XLDnaute Nouveau
Re : [VBA] Rechercher et copier une plage

AS-tu essaye avec la methode du filtre (celle du code que je t'ai propose)?
Tu gagneras peut etre quelques precieuses secondes.

Pour faire deux copies il suffit de dupliquer les lignes ? :D Je dois copier BB à BI et de BL à CK
pour coller de C à H et de L à AI.


Private Sub CommandButton1_Click()
Dim BD As Variant
Dim CptBD As Byte

BD = Array("BD1", "BD2"; "BD3"; "BD4")

Sheets("Données Graphique").Range("A6:AI" & Sheets("Données Graphique").Range("A6").End(xlDown).Row).ClearContents
For CptBD = 0 To UBound(BD)
With Sheets(BD(CptBD))
.Range("A1:A" & .Range("A65536").End(xlUp).Row).AutoFilter Field:=1, Criteria1:=Sheets("Données Graphique").TextBox2.Text

If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
.Range("BB2:BI" & .Range("BB65536").End(xlUp).Row).Copy
Sheets("Données Graphique").Range("C" & Sheets("Données Graphique").Range("C65536").End(xlUp).Row + 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
End If
.AutoFilterMode = False
End With
Next CptBD
End Sub
 
Dernière édition:

Minick

XLDnaute Impliqué
Re : [VBA] Rechercher et copier une plage

Salut,

Presque, il faut bien copier 2 fois mais avant, memoriser la ligne de destination
pour ne pas decaler le collage

Code:
Private Sub CommandButton2_Click()
    Dim BD As Variant
    Dim CptBD As Byte
    Dim LigDst As Long
    BD = Array("BD1", "BD2", "BD3", "BD4")
    
    Sheets("Données Graphique").Range("C6:AI" & Sheets("Données Graphique").Range("C6").End(xlDown).Row).ClearContents
    For CptBD = 0 To UBound(BD)
        With Sheets(BD(CptBD))
            .Range("A1:A" & .Range("A65536").End(xlUp).Row).AutoFilter Field:=1, Criteria1:=Sheets("Données Graphique").TextBox1.Text
            
            If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
                LigDst = Sheets("Données Graphique").Range("C65536").End(xlUp).Row + 1
                .Range("BB2:BI" & .Range("BB65536").End(xlUp).Row).Copy
                Sheets("Données Graphique").Range("C" & LigDst).PasteSpecial xlPasteValues
                .Range("BL2:CK" & .Range("BL65536").End(xlUp).Row).Copy
                Sheets("Données Graphique").Range("L" & LigDst).PasteSpecial xlPasteValues
                Application.CutCopyMode = False
            End If
            .AutoFilterMode = False
        End With
    Next CptBD
End Sub
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : [VBA] Rechercher et copier une plage

Bonjour à tous


Zaffe: Quand je lis cela:

Je me disais qu'en me débarassant des bases (4 onglets de 65000 lignes et 30 colonnes = :eek:) qui fait à lui seul 99% du poid ca pourrait aller car jusqu'a là je n'ai pas eu trop de ralentissement sauf lors de la sauvergarde.

Je pense que la solution idéale est dans ce cas travailler sur des fichiers de type txt, csv, voire xls puis faire des requêtes de type ODBC.

De toute façon, travailler sur un fichier de 250 Mo avec Excel, ce n'est pas très sérieux.
 

Zaffe

XLDnaute Nouveau
Re : [VBA] Rechercher et copier une plage

Salut,

Presque, il faut bien copier 2 fois mais avant, memoriser la ligne de destination
pour ne pas decaler le collage

Code:
Private Sub CommandButton2_Click()
    Dim BD As Variant
    Dim CptBD As Byte
    Dim LigDst As Long
    BD = Array("BD1", "BD2", "BD3", "BD4")
    
    Sheets("Données Graphique").Range("C6:AI" & Sheets("Données Graphique").Range("C6").End(xlDown).Row).ClearContents
    For CptBD = 0 To UBound(BD)
        With Sheets(BD(CptBD))
            .Range("A1:A" & .Range("A65536").End(xlUp).Row).AutoFilter Field:=1, Criteria1:=Sheets("Données Graphique").TextBox1.Text
            
            If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
                LigDst = Sheets("Données Graphique").Range("C65536").End(xlUp).Row + 1
                .Range("BB2:BI" & .Range("BB65536").End(xlUp).Row).Copy
                Sheets("Données Graphique").Range("C" & LigDst).PasteSpecial xlPasteValues
                .Range("BL2:CK" & .Range("BL65536").End(xlUp).Row).Copy
                Sheets("Données Graphique").Range("L" & LigDst).PasteSpecial xlPasteValues
                Application.CutCopyMode = False
            End If
            .AutoFilterMode = False
        End With
    Next CptBD
End Sub

Bonjour MiniCK,

Je viens d'essayer ton code, j'ai eu une première erreur et j'ai rapidement compris qu'il me manquait un onglet (BD4) par contre la j'ai une deuxième erreur et je ne trouve pas ou est le problème : "La méthode autofilter de la classe Ranger à échouer"
Tu ne sais pas par hasard a quoi cela peut être du ?
 

Discussions similaires

Réponses
12
Affichages
514
Réponses
8
Affichages
138

Statistiques des forums

Discussions
312 094
Messages
2 085 244
Membres
102 833
dernier inscrit
Hassna