Problème sélections et recopie

Bonjour à vous tous.

dans ce fichier il y a deux onglets, j'aimerais pouvoir recopier automatiquement les lignes de la feuil2 (uniquement celles qui ont un X dans la colonne3) dans la feuil1 dans les colonnes prévues à cet effet.

Merci d'avance pour votre aide et excellente journée à vous tous

14classeur4.xlsx (16.53 Ko)

Bonjour,

Voici une petite solution rapide.

Sub traiteLignes()
    Dim plg As Range
    Dim i As Long, ligne As Long

    Set plg = Feuil2.Range("A3").CurrentRegion

    ligne = 2
    For i = 2 To plg.Rows.Count
        If UCase(plg.Cells(i, 3)) = "X" Then
            Feuil1.Range("A" & ligne).Value = plg.Cells(i, 1)
            Feuil1.Range("B" & ligne).Value = plg.Cells(i, 2)
            Feuil1.Range("C" & ligne).Value = plg.Cells(i, 3)
            ligne = ligne + 1
        End If
    Next i
End Sub

Bonjour,

Si vous voulez l'automatiser via VBA, vous pouvez utiliser les filtres comme on le ferait manuellement.

Ci-après une proposition à copier dans un module et lancer.

Sub FilterExtract()
  Dim dataSht As Worksheet
  Set dataSht = ThisWorkbook.Worksheets("Feuil2")

  dataSht.Range("A3").AutoFilter _
    Field:=3, _
    Criteria1:="x", _
    VisibleDropDown:=True

  Dim filtData As Range
  Set filtData = dataSht.Range("A3").CurrentRegion.Offset(1, 0)

  With ThisWorkbook.Worksheets("Feuil1")
    Range(.Range("A2:C2"), .Range("A2:C2").End(xlDown)).ClearContents
    filtData.Copy
    .Range("A2").PasteSpecial xlPasteValues
    .Activate
  End With

  Application.CutCopyMode = False
  dataSht.ShowAllData

End Sub

EDIT : je viens de voir la solution de jpbt84, c'est une alternative (mais sur un nombre plus important de données, la sienne risque de ralentir)

Bien merci à vous, en effet j'ai un nombre tré important de données et votre système fonctionne parfaitement.

je vous souhaite une bien agréable journée.

Merci pour votre retour, bonne journée à vous aussi.

Bonjour,

EDIT : je viens de voir la solution de jpbt84, c'est une alternative (mais sur un nombre plus important de données, la sienne risque de ralentir)

Je viens de faire un test avec 100 000 enr, résultat

Ma méthode : 13,761 secondes

La méthode de Saboh : 1,789 secondes

Applaudissement pour Saboh.

Oui, c'est normal. Pour info 2 explications :

La principale : en VBA sur Excel ce qui prend le plus de temps c'est l'écriture/lecture dans le classeur. C'est à dire chaque "accès" pour lire une cellule ou changer sa valeur.

Dans votre code on va piocher les valeurs dans le classeur à chaque étape, c'est très lourd. On peut, alternativement, sauvegarder les valeurs en mémoire dans un tableau et le parcourir, c'est beaucoup plus rapide.

De meme pour écrire, au lieu de remplir les cellules une par une, on peut créer un tableau en mémoire (une matrice 2D) et l'intégrer directement dans le classeur.

La seconde : quand c'est possible, il est malin d'utiliser les fonctions Excel de base, qui sont mieux optimisées que le VBA exécuté uniquement en mono-thread. En l'occurrence j'ai utilisé Autofilter, qui applique un filtre sur la colonne des "x" comme on le ferait manuellement. Ça m'a permis d'éviter d'écrire une longue boucle, et ensuite j'ai juste besoin d'un accès en lecture/écriture pour copier/coller le résultat.

Voilà, dans les grosses lignes, l'explication. Bonne journée et au plaisir d'aider.

Merci pour l'explication et je vais m'en servir.

Tenez, si vous lisez l'anglais, l'optimisation VBA est donnée dans ce chapitre très complet par Microsoft (le document complet traite de l'optimisation sur Excel en général).

VBA-Docs/excel/Concepts/Excel-Performance/excel-tips-for-optimizing-performance-obstructions.md at main · MicrosoftDocs/VBA-Docs · GitHub

Il y a plusieurs étapes, celle que je mentionnais comme "la première" est donnée au 2§ - Read and write large blocks of data in a single operation

Rechercher des sujets similaires à "probleme selections recopie"