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 :

Optimisation suppression de lignes contenant des images [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut Optimisation suppression de lignes contenant des images
    Bonjour,

    j'ai une macro qui marche parfaitement bien mais assez longue à l'exécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ' Suppression des lignes inutiles 
    With Cells(Rows.Count, "AN").End(xlUp).MergeArea: derligPdf = .Cells(.Cells.Count).Row: End With    ' dernière ligne à supprimer
    For i = derligPdf To 1 Step -1
    If Cells(i, 40).Value = "X" Then
        For Each shap In ActiveSheet.Shapes
        If shap.TopLeftCell.Row = i Then shap.Delete
        Next
    Cells(i, 40).EntireRow.Delete
    End If
    Next i
    derligPdf est > 1000

    Il me semble à l'étude de cette boucle qu'elle n'est pas optimum car en mode pas à pas je vois que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each shap In ActiveSheet.Shapes
        If shap.TopLeftCell.Row = i Then shap.Delete
        Next
    s'exécute ne nombreuses fois alors que je n'ai qu'une image par ligne, la boucle en jaune se fait sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If shap.TopLeftCell.Row = i Then
        Next
    Je ne saisi pas le sens de cette boucle

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    Bonjour,

    Quand tu insères une image au niveau de ta cellule dans un shape, tu n'as pas moyen de coller le nom du Shape dans la cellule pour associer directement le nom de la forme à la ligne ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    je ne vois pas comment, mes images sont insérées par Excel par les fonctions:

    INDIRECT(RECHERCHEV(…..)
    En fait je veux supprimer les lignes et image avec un "X" en colonne AN, dans les macros sans suppression d'image, pour optimise mon #1 je fais (sur les conseils d'un expert du forum):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Range("AN1:AN1365").AutoFilter Field:=1, Criteria1:="X"
    Rows("2:1365").Delete
    Range("AN1:AN1365").AutoFilter Field:=1
    cela marche parfaitrement et très rapidement
    Mais cela ne marche pas avec une image sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each shap In ActiveSheet.Shapes
        If Cells(shap.TopLeftCell.Row, 40).Value = "X" Then shap.Delete
    Next
     
    Range("AN1:AN1365").AutoFilter Field:=1, Criteria1:="X"
    Rows("2:1365").Delete
    Range("AN1:AN1365").AutoFilter Field:=1
    C'est pour cela que j'en suis revenu à mon #1 pour comprendre pourquoi c'est si long

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    je ne vois pas comment, mes images sont insérées par Excel par les fonctions:
    C'est pas grave...


    Une solution différente de celle de Patrick :

    Le principe est de charger une matrice des shapes dont la ligne est à supprimer. Lorsque le cas se produit, on change le nom de la forme et on identifie la ligne.
    On identifie la dernière ligne concernée par la destruction dans le tableau et je détruis séparément les formes, des lignes par une boucle.

    La suppression étant limitée aux seules lignes sélectionnées, la méthode devrait être plus rapide que celle de ton premier message.

    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
    68
    69
    70
    71
    72
    73
    74
    75
     
    Option Explicit
     
    Public MatriceShapes() As Variant
     
    Sub DetruireLesShapes()
     
    Dim I As Long, J As Long, DerniereLigne As Long
    Dim ShImages As Worksheet
    Dim ASupprimer As Boolean
     
        On Error GoTo Fin
     
        Set ShImages = Sheets("Feuil1")  ' A adapter
     
        ChargementMatriceShapes ShImages
     
        DerniereLigne = 0
        For I = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
            If MatriceShapes(1, I) > DerniereLigne Then DerniereLigne = MatriceShapes(1, I)
        Next I
     
     
        With ShImages
     
             For I = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
                 .Shapes(MatriceShapes(0, I)).Delete
             Next I
     
             For J = DerniereLigne To 1 Step -1
                 ASupprimer = True
                 For I = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
                     If MatriceShapes(1, I) = J And ASupprimer = True Then
                        .Rows(MatriceShapes(1, I)).Delete
                        ASupprimer = False
                     End If
                 Next I
             Next J
     
        End With
     
    Fin:
     
        Set ShImages = Nothing
     
    End Sub
     
     
     
    Sub ChargementMatriceShapes(ByVal FeuilleImages As Worksheet)
     
    Dim I As Long, J As Long, NbShapes As Long
     
        Erase MatriceShapes
     
        With FeuilleImages
     
             NbShapes = 0
             I = 0
             J = 1
             For NbShapes = .Shapes.Count To 1 Step -1
     
                 If .Range("AN" & .Shapes(NbShapes).TopLeftCell.Row) = "X" Then
                     ReDim Preserve MatriceShapes(1, I)
                     .Shapes(NbShapes).Name = "ASupprimer" & J
                     MatriceShapes(0, I) = .Shapes(NbShapes).Name
                     MatriceShapes(1, I) = .Shapes(NbShapes).TopLeftCell.Row
                     I = I + 1
                     J = J + 1
                 End If
             Next NbShapes
     
        End With
     
    End Sub

  5. #5
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    je vais prendre le temps d'essayer les 2 solutions pour voir, en espérant n'avoir jamais à les modifier…

    Pour revenir à mon premier message je ne comprends pas pourquoi en pas à pas je boucle à chaque i sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For Each shap In ActiveSheet.Shapes
        If shap.TopLeftCell.Row = i Then shap.Delete
        Next
    alors qu'il n'y a qu'une image par ligne
    J'aurai eu tendance à écrire (dans le principe, sans parler de la syntaxe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Cells(Rows.Count, "AN").End(xlUp).MergeArea: derligPdf = .Cells(.Cells.Count).Row: End With    ' dernière ligne à supprimer
    For i = derligPdf To 1 Step -1
    If Cells(i, 40).Value = "X" Then
        shap.Delete
        Cells(i, 40).EntireRow.Delete
    End If

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    Si les cellules sont fusionnées dans la colonne AN, utiliser ce code :

    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
    68
    69
    70
    71
    72
    73
    74
    75
     
    Option Explicit
     
    Public MatriceShapes() As Variant
     
    Sub DetruireLesShapes()
     
    Dim I As Long, J As Long, DerniereLigne As Long
    Dim ShImages As Worksheet
    Dim ASupprimer As Boolean
     
        On Error GoTo Fin
     
        Set ShImages = Sheets("Images (2)")  ' A adapter
     
        ChargementMatriceShapes ShImages
     
        DerniereLigne = 0
        For I = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
            If MatriceShapes(1, I) > DerniereLigne Then DerniereLigne = MatriceShapes(1, I)
        Next I
     
     
        With ShImages
     
             For I = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
                 .Shapes(MatriceShapes(0, I)).Delete
             Next I
     
             For J = DerniereLigne To 1 Step -1
                 ASupprimer = True
                 For I = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
                     If MatriceShapes(1, I) = J And ASupprimer = True Then
                        .Range("AN" & MatriceShapes(1, I)).MergeArea.EntireRow.Delete
                        ASupprimer = False
                     End If
                 Next I
             Next J
     
        End With
     
    Fin:
     
        Set ShImages = Nothing
     
    End Sub
     
     
     
    Sub ChargementMatriceShapes(ByVal FeuilleImages As Worksheet)
     
    Dim I As Long, J As Long, NbShapes As Long
     
        Erase MatriceShapes
     
        With FeuilleImages
     
             NbShapes = 0
             I = 0
             J = 1
             For NbShapes = .Shapes.Count To 1 Step -1
     
                 If .Range("AN" & .Shapes(NbShapes).TopLeftCell.Row) = "X" Then
                     ReDim Preserve MatriceShapes(1, I)
                     .Shapes(NbShapes).Name = "ASupprimer" & J
                     MatriceShapes(0, I) = .Shapes(NbShapes).Name
                     MatriceShapes(1, I) = .Shapes(NbShapes).TopLeftCell.Row
                     I = I + 1
                     J = J + 1
                 End If
             Next NbShapes
     
        End With
     
    End Sub

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    Pour revenir à mon premier message je ne comprends pas pourquoi en pas à pas je boucle à chaque i sur
    Parce qu'il y a deux boucles imbriquées.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    tu pourrais peut etre collectionner les lignes et les shapes et les supprimer toutes d'un coup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    dim tablo(),x&,shap as shape,rang as range,mongroupe
    With Cells(Rows.Count, "AN").End(xlUp).MergeArea: derligPdf = .Cells(.Cells.Count).Row: End With    ' dernière ligne à supprimer
    For i = derligPdf To 1 Step -1
        If Cells(i, 40).Value = "X" Then
            For Each shap In ActiveSheet.Shapes
                If shap.TopLeftCell.Row = i Then x = x + 1: ReDim Preserve tablo(1 To x): tablo(x) = shap.Name
            Next
            If rang Is Nothing Then Set rang = Cells(i, 40) Else Set rang = Union(rang, Cells(i, 40))
        End If
        Set mongroupe = ActiveSheet.Shapes.Range(tablo).Group
        mongroupe.Delete
        rang.EntireRow.Delete
    Next i
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. [XL-2007] Macro suppression ligne contenant des dates
    Par Bibimyu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/03/2016, 17h34
  2. Comment protéger un dossier contenant des images ?
    Par guy777 dans le forum Sécurité
    Réponses: 12
    Dernier message: 17/06/2006, 22h42
  3. Réponses: 2
    Dernier message: 22/05/2006, 00h07
  4. [JAR] créer une archive .jar contenant des images.
    Par keny dans le forum Général Java
    Réponses: 2
    Dernier message: 14/03/2005, 13h17
  5. Création d'une base de données contenant des images
    Par gandalf_le_blanc dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/06/2004, 15h29

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