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

Excel Discussion :

Optimisation d'une macro + Application à tous les onglets [XL-2007]


Sujet :

Excel

  1. #21
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Est ce dû a l'utilisation de tableau ?

  2. #22
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Celle-ci semble fonctionner ?

    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
    Sub test2()
    Dim Tabl As Variant, Plage As Range
    Dim inCalculationMode As Integer
    Application.ScreenUpdating = False
    inCalculationMode = Application.Calculation
    Application.Calculation = xlCalculationManual
    With ThisWorkbook.Sheets("F2")
        Tabl = Application.Transpose(.Range("A1", .Cells(.Rows.Count, 1).End(xlUp)))
        For i = UBound(Tabl) To 1 Step -1
            Debug.Print Mid(Tabl(i), 16, 1)
            If Mid(Tabl(i), 16, 1) <> "0" Then
                If Plage Is Nothing Then
                    Set Plage = Rows(i)
                Else
                    Set Plage = Union(Rows(i), Plage)
                End If
            End If
        Next i
        Plage.Delete
    End With
    Application.Calculation = inCalculationMode
    Application.ScreenUpdating = True
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #23
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Non

    Erreur au niveau de "Plage.Delete"
    Variable objet ou variable de bloc with non définie.

  4. #24
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    quand on manipule des plages via un tableau portant sur un grand nombre d'items, on est parfois surpris de voir que toute la plage n'a pas été importée dans le tableau

    regarde si ton Tableau a bien récupéré l'ensemble des lignes, et que les ressources de ton PC n'ont pas limité l'import

    entre la ligne 8 et 9 du code, tu ajoutes ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msgbox Ubound(Tabl)
    Exit Sub
    et tu vérifies que le nombre affiché correspond bien à la dernière ligne de ta plage.
    J'ai mis une sortie de procédure après le test, ça évite de perdre du temps en laissant toute la procédure s'appliquer

  5. #25
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Ce qui est bien, c'est qu'on en apprend tous les jours : "Transpose" tronque à 65536 enregistrements. Je revois la macro, parce que le test est incorrect et qu'elle est encore longue.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  6. #26
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    La msg box ne s'affiche pas, le code ne s'execute même plus partiellement

    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
    Sub DelEditeur2()
     
    Dim Tabl As Variant, Plage As Range
    Dim inCalculationMode As Integer
    Dim i As Long
    Application.ScreenUpdating = False
    inCalculationMode = Application.Calculation
    Application.Calculation = xlCalculationManual
    MsgBox UBound(Tabl)
    Exit Sub
    With ThisWorkbook.Sheets("F2")
        Tabl = Application.Transpose(.Range("A1", .Cells(.Rows.Count, 1).End(xlUp)))
        For i = UBound(Tabl) To 1 Step -1
            If Mid(Tabl(i), 16, 1) <> "0" Then
                .Rows(i).Delete
            End If
        Next i
    End With
    Application.Calculation = inCalculationMode
    Application.ScreenUpdating = True
     
    End Sub

  7. #27
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    je parlais de la ligne 8-9 du dernier code de Daniel.C

    pour le code que tu nous montres, tu dois insérer les deux lignes entre les lignes 12 et 13, c'est à dire après la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tabl = Application.Transpose(.Range("A1", .Cells(.Rows.Count, 1).End(xlUp)))

  8. #28
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Effectivement le tableau s’arrête à 65536

  9. #29
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Teste :

    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
    Sub test()
    Dim Tabl As Variant, Plage As Range, Result() As Date, Ctr As Long
    Dim inCalculationMode As Integer
    Application.ScreenUpdating = False
    inCalculationMode = Application.Calculation
    Application.Calculation = xlCalculationManual
    With ThisWorkbook.Sheets("F2")
        Tabl = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
        ReDim Result(1 To UBound(Tabl, 1))
        For i = UBound(Tabl) To 1 Step -1
            If Minute(Tabl(i, 1)) Mod 10 = 0 Then
                Ctr = Ctr + 1
                Result(Ctr) = Tabl(i, 1)
            End If
        Next i
        ReDim Preserve Result(1 To Ctr)
        .[A:A].ClearContents
        .[A1].Resize(Ctr) = Application.Transpose(Result())
    End With
    Application.Calculation = inCalculationMode
    Application.ScreenUpdating = True
    End Sub
    Il ne faut pas qu'il reste plus de 65000 lignes non supprimées sinon, il faudra modifier. Mais teste d'abord.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  10. #30
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    PS. Il faudra modifier également en fonction du nombre de colonnes du tableau.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #31
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    La macro marche sur la colonne A.

    Mon fichier excel est composé de 3 colonnes A,B et C.

    Logiquement j'ai rajouté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    .[C:C].ClearContents
    .[B:B].ClearContents
    Suppression de la totalité des valeurs dans B et C.

    Pour réaliser le même filtre que en A il faut que je créer un tableau pour B et C?
    Je ne maîtrise pas bien la notion de tableau...

  12. #32
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Mais attention, par exemple: si il y a suppression de A42, B42 et C42 doivent être supprimé aussi...

    Ca paraît logique mais je le dis quand même.
    Les valeurs sont associées par lignes et doivent le rester après le tri ...

  13. #33
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Voici la macro adaptée pour 3 colonnes. représente-toi un tableau à deux dimensions comme une plage Excel. Si tu veux en savoir plus regarde ici :

    http://didier-gonard.developpez.com/...s-tableau-vba/
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  14. #34
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    et en évitant d'utiliser Transpose, ça marcherait ?

    Comme ça
    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
    Sub DelEditeur2()
    Dim Tabl As Variant, Plage As Range
    Dim inCalculationMode As Integer
    Dim i As Long
    Application.ScreenUpdating = False
    inCalculationMode = Application.Calculation
    Application.Calculation = xlCalculationManual
     
    With ThisWorkbook.Sheets("F2")
        Set Plage = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
        Tabl = Plage
        For i = UBound(Tabl) To 1 Step -1
            If Mid(Tabl(i), 16, 1) <> "0" Then
                .Rows(i).Delete
            End If
        Next i
    End With
     
    Application.Calculation = inCalculationMode
    Application.ScreenUpdating = True
     
    End Sub

  15. #35
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Non joe la macro n'est pas fonctionnelle:
    Erreur sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Mid(Tabl(i), 16, 1) <> "0" Then
    L'indice n'appartient pas à la selection

    Daniel.C , je n'ai pas accès à la macro...
    Merci pour le lien.

  16. #36
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Ah oui désolé, il faut spécifier la dimension par cette méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Mid(Tabl(i,1), 16, 1) <> "0" Then

    ça devrait outrepasser la limitation des 65536

  17. #37
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    @joe.levrai : le test fonctionne mal, parce que les cellules ont des valeurs date, donc numériques et non des valeurs texte. Fais un essai manuellement avec STXT.

    @Identifiant75 : Oups.

    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
    Sub test()
    Dim Tabl As Variant, Result() As Variant, Ctr As Long
    Dim inCalculationMode As Integer
    Application.ScreenUpdating = False
    inCalculationMode = Application.Calculation
    Application.Calculation = xlCalculationManual
    With ThisWorkbook.Sheets("F2")
        'charge dans la table "Tabl" (en mémoire) la plage A:C
        Tabl = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 3)
        ReDim Result(1 To 3, 1 To UBound(Tabl, 1))
        For i = 1 To UBound(Tabl)
            If Minute(Tabl(i, 1)) Mod 10 = 0 Then
                Ctr = Ctr + 1
                Result(1, Ctr) = Tabl(i, 1)
                Result(2, Ctr) = Tabl(i, 2)
                Result(3, Ctr) = Tabl(i, 3)
            End If
        Next i
        ReDim Preserve Result(1 To 3, 1 To Ctr)
        .[A:C].ClearContents
        .[A1].Resize(Ctr, 3) = Application.Transpose(Result())
    End With
    Application.Calculation = inCalculationMode
    Application.ScreenUpdating = True
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  18. #38
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    NICKEL !!! temps d’exécution extrêmement rapide ...

    Dernière petite chose ...

    Pour l'appliquer à tous les onglets de la feuille, une petite astuce ?

  19. #39
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Pour moi ça fonctionne !

    j'ai téléchargé ton fichier, j'ai volontairement doublé le nombre de lignes pour en tester 155 000 .. et je n'ai pas touché aux valeurs ou formats des cellules
    j'ai mis des vérifications durant la procédure et j'ai bien les résultats escomptés
    il ne reste que les lignes du style :

    21/06/2014 06:20:00
    21/06/2014 06:50:00
    21/06/2014 08:10:00


    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
    Sub DelEditeur2()
    Dim Tabl As Variant, Plage As Range
    Dim inCalculationMode As Integer
    Dim i As Long
    Application.ScreenUpdating = False
    inCalculationMode = Application.Calculation
    Application.Calculation = xlCalculationManual
     
    With ThisWorkbook.Sheets("F2")
        Set Plage = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
        Tabl = Plage
        Debug.Print "Nombre de lignes dans la plage : " & ThisWorkbook.Sheets("F2").UsedRange.Rows.Count
        Debug.Print "Nombre de lignes dans le tableau : " & UBound(Tabl)
     
        For i = UBound(Tabl) To 1 Step -1
            If Mid(Tabl(i, 1), 16, 1) <> "0" Then
                j = j + 1
                .Rows(i).Delete
            End If
        Next i
    End With
    Debug.Print "Lignes Supprimée calculé durant la procédure: " & j
    Debug.Print "Vérification des suppressions par soustraction : " & UBound(Tabl) - ThisWorkbook.Sheets("F2").UsedRange.Rows.Count
    Debug.Print "Lignes Restantes : " & ThisWorkbook.Sheets("F2").UsedRange.Rows.Count
     
    Application.Calculation = inCalculationMode
    Application.ScreenUpdating = True
     
    End Sub

    Fenêtre d'exécution
    Nombre de lignes dans la plage : 155004
    Nombre de lignes dans le tableau : 155004
    Lignes Supprimée calculé durant la procédure: 101503
    Vérification des suppressions par soustraction : 101503
    Lignes Restantes : 53501

  20. #40
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Peut-être une différence de version ?

    Nom : Capture.JPG
Affichages : 71
Taille : 13,8 Ko
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [XL-2003] Une macro sur tous les onglets
    Par Maksym dans le forum Macros et VBA Excel
    Réponses: 27
    Dernier message: 23/01/2013, 13h28
  2. application d'une macro a tous les fichiers d'un dossier
    Par muisca dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/05/2012, 20h14
  3. Exécuter une macro sur tous les onglets d'un fichier sauf un
    Par Marsama dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/04/2011, 17h38
  4. [XL-2003] Exécuter une macro sur tous les fichiers d'un dossier.
    Par ahmet dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/10/2009, 09h49
  5. Fermeture d'une fenêtre avec tous les onglets ouverts
    Par Invité dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/11/2008, 08h44

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