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 :

Dépassement capacité copier/coller ligne vers onglet [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 53
    Points : 34
    Points
    34
    Par défaut Dépassement capacité copier/coller ligne vers onglet
    Bonjour à tous,

    J'ai un petit soucis d'optimisation sur une macro qui copie/colle des ligne selon un critères vers les onglets correspondants (dédiés aux critères).
    J'ai un dépassement de capacité, de plus pour le peu de ligne copiée, cela prends un temps fou.

    ex: Si j'ai 'ADQ03' dans la colonne K alors copie/colle la ligne vers l'onglet ADQ03

    J'ai un total de 11 feuilles:
    - 1 feuille qui le résultat d'une extraction SQL (environ 200 000 lignes, 2 critères prennent 150 000 lignes)
    - 10 feuilles dédiés aux critères (vierge donc en attente des données provenant de la feuille DATA

    Alors bien sur je pourrais filtrer selon critère et ensuite copier/coller manuellement mais l'extraction se fait quotidiennement.

    Voici (une partie) de ma macro (avec seulement 2 critères) :
    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
    Sub Copy()
     
    Application.ScreenUpdating = False
     
    Dim i As Long
    Dim j As Integer
     
    Dim sh As Worksheet
    Dim feuillePrincipale As Worksheet
    Dim AQD03Sheet As Worksheet
    Dim QDR06acSheet As Worksheet
     
     
    Set feuillePrincipale = ThisWorkbook.Sheets("DATA")
    Set AQD03Sheet = ThisWorkbook.Sheets("AQD03")
    Set QDR06acSheet = ThisWorkbook.Sheets("QDR06ac")
     
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name = "AQD03" Then
        i = 2
        j = 2
            While Not IsEmpty(feuillePrincipale.Cells(i, 1))
                If feuillePrincipale.Cells(i, 11).Value Like "AQD03*" Then
                feuillePrincipale.Cells.Rows(i).EntireRow.Copy AQD03Sheet.Rows(j)
                j = j + 1
                End If
            i = i + 1
            Wend
        End If
     
        If sh.Name = "QDR06ac" Then
        i = 2
        j = 2
            While Not IsEmpty(feuillePrincipale.Cells(i, 1))
                If feuillePrincipale.Cells(i, 11).Value Like "QDR06ac*" Then
                feuillePrincipale.Cells.Rows(i).EntireRow.Copy QDR06acSheet.Rows(j)
                j = j + 1
                End If
            i = i + 1
            Wend
        End If
     
        Next
     
        Application.ScreenUpdating = True
     
    End Sub
    En attente de vos idées, je vous souhaite une bonne journée

  2. #2
    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 939
    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 939
    Points : 28 936
    Points
    28 936
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai un petit soucis d'optimisation sur une macro qui copie/colle des ligne selon un critères vers les onglets correspondants (dédiés aux critères).
    J'ai un dépassement de capacité, de plus pour le peu de ligne copiée, cela prends un temps fou.
    ex: Si j'ai 'ADQ03' dans la colonne K alors copie/colle la ligne vers l'onglet ADQ03
    Je te conseille l'utilisation des filtres avancés d'excel (méthode AdvancedFilter d'un objet Range en VBA)

    A lire Les filtres avancés ou élaborés dans Excel

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Bonjour,

    Utilise des Long pour les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim i As Long
    Dim j As Integer

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    J'ai déjà essayé parmi sans succès (le long à la place du integer), plantage complet de l'ordi et c'est pas une antiquité non plus

    Ok je vais me renseigner pour les filtres avancés.

    Je reviens avec du nouveau demain

  5. #5
    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 939
    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 939
    Points : 28 936
    Points
    28 936
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai déjà essayé parmi sans succès (le long à la place du integer)
    Si tu ne vas pas au delà de 32.767 lignes, tu n'auras pas de problème mais la remarque de Parmi est judicieuse car il vaut mieux prévenir que guérir.
    Cela n'enlève en rien ma suggestion de passer par le filtre avancé d'excel qui est bien plus rapide et simple à utiliser pour exporter des données suivant critères

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Bonjour,

    Juste un petit exemple avec l'idée des filtres élaborés de Philippe Tuliez :

    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
    Sub copy()
     
    'Set QDR06acSheet = ThisWorkbook.Sheets("QDR06ac")
     
    Dim WsSource As Worksheet, filtre As Workbook, WsCible As Worksheet
     
    Set WsSource = ThisWorkbook.Sheets("DATA")
    On Error Resume Next: WsSource.ShowAllData: On Error GoTo 0
    Application.ScreenUpdating = False
    Set WsCible = ThisWorkbook.Sheets.Add(After:=WsSource)
     
    Set AQD03Sheet = ThisWorkbook.Sheets("AQD03")
     
            WsCible.Name = "AQD03"
     
            Set filtre = Workbooks.Add
            'Mettre ici le nom de l'entête de colonne
            filtre.Sheets(1).Range("A1") = "Mettre ici le nom de l'en tête de colonne"
            'Mettre ici la valeur du filtre
            filtre.Sheets(1).Range("A2") = "AQD03*"
     
            'Crée le nouvel onglet ADQ03 avec une copie du filtre
            FiltreActif WsSource.UsedRange, filtre.Sheets(1).UsedRange, WsCible.Range("A1")
            filtre.Close False
            Set filtre = Nothing
            Application.ScreenUpdating = True
     
    End Sub
     
    'fonction qui fait la copie
    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
    Cordialement

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    J'ai trouvé mon bonheur :

    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
    Public Sub Christophe()
     
        Const FILTER_COLUMN = 11
     
        Dim i&, rCrit As Range, rData As Range, aShts
     
        aShts = Array("S01", "S02", "S04", "S10", "LocS10Bis", "LocS15", "LocS16", "NIH09", "NS01", "PR11", "QDR06bd", "DA09a")
     
        Set rData = Sheets("DATA").[a1].CurrentRegion
        Set rCrit = rData.Resize(2, 1).Offset(, rData.Columns.Count + 2)
        rCrit(1) = rData(1, FILTER_COLUMN)
     
        For i = 0 To UBound(aShts)
            rCrit(2) = aShts(i) & "*"
            rData.AdvancedFilter xlFilterCopy, rCrit, Sheets(aShts(i)).[a1].Resize(, rData.Columns.Count)
        Next
     
        rCrit.Clear
     
    End Sub
    En revanche je ne pige pas du tout comment sa fonctionne Si quelq'un peut m'expliquer

    Bon week end

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

Discussions similaires

  1. Copier coller colone vers onglet
    Par hugohours1993 dans le forum Excel
    Réponses: 5
    Dernier message: 02/09/2015, 21h06
  2. [XL-2007] Copier Coller Ligne vers autre feuille de même classeur
    Par pasterlouis dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/06/2013, 09h58
  3. Réponses: 3
    Dernier message: 19/07/2012, 12h05
  4. copier/coller lignes sous condition colonne vers autre feuille
    Par juniorglobal08 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/05/2009, 17h29
  5. VBA EXCEL - Copier des ligne vers un autre calseur.
    Par patine31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/03/2007, 12h46

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