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 d'un code VBA pour remplacer une image en fonction d'une équivalence de cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut Optimisation d'un code VBA pour remplacer une image en fonction d'une équivalence de cellule
    Bonjour,

    Je suis nouveau par ici et débutant en VBA.
    Je viens vers vous pour un code sur lequel j'ai un peu buté, certes fonctionnel mais il ne me convient pas. Je trouve que l'on peut l'optimiser afin d'éviter notamment la vue des chargements sur le curseur certainement causé par la boucle du code qui me semble inutile. Vu que je sais quel ligne dois voir son image s'effacé/ce remplacer on doit pouvoir éviter de chercher parmi tous les Shapes.

    Le but du code est d'insérer ou remplacer les logos de la colonne A sur la feuille active qui est la n°2 (Portefeuille) grâce aux url de la colonne E sur la feuille n°7 (API) seulement si les symboles (Colonnes C) sur les deux feuilles correspondent lors de l'insertion de ces symboles dans la cellule.

    Les défauts actuels :
    1. C'est long à charger, on aperçoit les micro chargements au niveau du curseur.
    2. On voit l'url s'insérer furtivement avant de devenir l'image. Peut-on importer directement l'image dans la colonne A sans pour ce faire insérer au préalable l'url depuis la feuille 7 ?


    Voci la macro :

    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
     
    Dim stopEvent
    Dim CompareSymbole As Range
    Dim PosLigne As Range
    Dim Image As Variant
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If stopEvent = 1 Then Exit Sub
     
    stopEvent = 1
    If Target.count > 1 Then
        stopEvent = 0
        Exit Sub
    End If
     
     
    If Target.Column = 3 Then 'Colonne Symbole
        Set PosLigne = Target.Offset(0, -2)
        If Target <> "" Then 'Si le symbole inséré est non vide
     
            Set CompareSymbole = Worksheets("API").Range("C:C").Find(Target, lookat:=xlWhole) 'Retrouve le Symbole dans la table API
     
            If Not CompareSymbole Is Nothing Then 'Si on retrouve le Symbole
     
     
                SupprimerImage
                PosLigne.Value = CompareSymbole.Offset(0, 2)
                Set Image = ActiveSheet.Pictures.Insert(PosLigne.Value)
                With Image
                    .ShapeRange.LockAspectRatio = msoFalse
                    .Width = PosLigne.Width - 10
                    .Height = PosLigne.Height - 3
                    .Top = Rows(PosLigne.Row).Top + 2
                    .Left = Columns(PosLigne.Column).Left + 5
                    .Placement = xlMoveAndSize
                    .Locked = True
                End With
                PosLigne.Value = ""
     
     
     
            Else: PosLigne.Value = 0 'Si le symbole est introuvable, alors on met 0 en valeur pour l'image de mise en forme conditionnelle
            End If
        Else:
            PosLigne.ClearContents 'Si le symbole inséré est vide, alors on efface l'image et l'url
            SupprimerImage
        End If
    End If
     
     
    stopEvent = 0
    End Sub
     
     
    Sub SupprimerImage()
        For Each Image In ActiveSheet.Shapes
            If Image.TopLeftCell.Address = PosLigne.Address Then
                Image.Delete
                Exit Sub
            End If
        Next Image
    End Sub
    J'espère que j'ai assez bien détaillé les problèmes.
    Je vous remercie par avance.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 472
    Par défaut
    Salut,

    D'où proviennent les images ?
    Si elles proviennent d'internet, ce temps de chargement est normal (temps de latence inhérente à internet).
    Au pire tu peux désactiver les évènements, l'affichage et les alertes le temps que la fonction s'exécute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    application.ScreenUpdating = false
    application.EnableEvents = false
    application.DisplayAlerts = false
    Ne pas oublier de les réactiver une fois que tu as terminé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    application.ScreenUpdating = true
    application.EnableEvents = true
    application.DisplayAlerts = true
    Sinon, pas grand-chose à redire sur ton code, sauf:
    Vire les globales, tu n'en as pas besoin, et passes-les en local.
    A quoi sert stopEvent ?
    Evite les références dépendantes du contexte.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    Salut,

    Merci pour la réponse rapide.
    Les images sont des url qui sont déjà charger dans la table API lors de la recherche.

    Je désactive déjà les évènements mais de manière "artisanale" grâce à la variable stopEvent que je viens de mettre en Static dans la Sub vu qu'elle ne me sert que pour l'événement.
    J'utilise la variable pour désactiver l'événement en le quittant s'il est déjà en cours.
    Dans ce cas, lorsque l'événement est déclenché, la variable stopEvent ne vaut pas 1, la procédure n'est donc pas quittée prématurément.
    Lorsque la cellule sera modifiée, l'événement sera redéclenché mais cette fois-ci, stopEvent vaudra 1. La procédure s'arrêtera donc à la première ligne.

    Evite les références dépendantes du contexte.
    C'est à dire ?

    Vire les globales, tu n'en as pas besoin, et passes-les en local.
    Si tu parle des variable, je ne peut pas pour "PosLigne" et "Image" puisque je m'en sert dans les deux Sub.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 472
    Par défaut
    Citation Envoyé par DeeJas Voir le message
    Je désactive déjà les évènements mais de manière "artisanale" grâce à la variable stopEven
    En claire tu shunte une gestionnaire d'évènement, mais tu ne désactive pas les évènements proprement dit.
    De plus, ça ne sert à rien, VBA ne supporte pas le multi-thread, pendant qu'un code s'exécute, aucun autre ne peut s'exécuter en même temps.

    Citation Envoyé par DeeJas Voir le message
    Si tu parle des variable, je ne peut pas pour "PosLigne" et "Image" puisque je m'en sert dans les deux Sub.
    Les paramètres, ça sert à quelque chose !!
    Ce que tu as fait s'apparente plus à de la paresse qu'autre chose.

    Citation Envoyé par DeeJas Voir le message
    C'est à dire ?
    L'utilisation du classeur / feuille / cellule active (ou pire, la sélection), est fortement dépendante des actions de l'utilisateur (un simple click et ça change).
    En développement, on veut des certitudes. Voit pour t'en passer.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    Salut,

    Ok pour les évènements je modifie ça.
    Je ne comprend pas bien où tu veut en venir avec les paramètres. Je suis preneur si tu as une solution plus audacieuse.

    Pour les actions oui c'est dépendant des actions de l'utilisateur mais totalement voulu.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    UP'

    Je ne comprend malheureusement pas comment je peut optimiser le code à ce stade.

    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
    Dim PosLigne As Range
    Dim Image As Variant
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .DisplayAlerts = False
    End With
     
    If Target.Count > 1 Then
        With Application
            .Undo
            .ScreenUpdating = True
            .EnableEvents = True
            .DisplayAlerts = True
        End With
        Exit Sub
    End If
     
    If Target.Column = 3 Then 'Colonne Symbole
        Set PosLigne = Target.Offset(0, -2)
        SupprimerImage
        If Target <> "" Then 'Si le symbole inséré est non vide
     
            Dim CompareSymbole As Range
            Set CompareSymbole = Worksheets("API").Range("C:C").Find(Target, lookat:=xlWhole) 'Retrouve le Symbole dans la table API
     
            If Not CompareSymbole Is Nothing Then 'Si on retrouve le Symbole
     
     
                PosLigne.Value = CompareSymbole.Offset(0, 2)
                Set Image = ActiveSheet.Pictures.Insert(PosLigne.Value)
                With Image
                    .ShapeRange.LockAspectRatio = msoFalse
                    .Width = PosLigne.Width - 10
                    .Height = PosLigne.Height - 3
                    .Top = Rows(PosLigne.Row).Top + 2
                    .Left = Columns(PosLigne.Column).Left + 5
                    .Placement = xlMoveAndSize
                    .Locked = True
                End With
                PosLigne.Value = ""
     
     
     
            Else: PosLigne.Value = 0 'Si le symbole est introuvable, alors on met 0 en valeur pour l'image de mise en forme conditionnelle
            End If
        Else: PosLigne.ClearContents 'Si le symbole inséré est vide, alors on efface l'image et l'url
        End If
    End If
     
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .DisplayAlerts = True
    End With
    End Sub
     
     
    Sub SupprimerImage()
        For Each Image In ActiveSheet.Shapes
            If Image.TopLeftCell.Address = PosLigne.Address Then
                Image.Delete
                Exit Sub
            End If
        Next Image
    End Sub

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 472
    Par défaut
    Les paramètres, c'est la base de la programmation.
    Revoit tes cours (ou trouves-en un potable).

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    Effectivement, heureusement pour moi je ne suis pas débutant. En VBA si.
    Le fait que je débute et tes explications trop mince font que je n'est pas de piste d'amélioration.
    Je ne demande pas un code tout fait, mais d'avantage d'explications pour que je puisse moi même comprendre et programmer en conséquence.

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 472
    Par défaut
    Une petite recherche sur Google:
    https://learn.microsoft.com/en-us/of...tion-statement

    PS: Ce n'est pas sur l'optimisation que je te reprend, mais sur la qualité de ton code.
    Et pour t'améliorer, il n'y a pas 36 solutions:
    - Fait des recherches.
    - Trouve un cours potable.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    Je ne comprend pas ce que je dois faire? Je tente des choses mais rien de concluant car je ne vois pas ce que je dois faire.. Dit le moi avec des mots que je puisse le transformer en code.
    Passer "SupprimerImage" en fonction ? Et mettre en paramètre "PosLigne" et "Image" ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/10/2021, 21h53
  2. [XL-2007] Code VBA pour remplacer le contenu de cellules
    Par tomlapomme dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 25/08/2010, 14h39
  3. Réponses: 2
    Dernier message: 14/10/2009, 08h57
  4. Code VBA pour Copier une cellule dans un filtre?
    Par Redisdead dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/02/2009, 05h48
  5. Réponses: 7
    Dernier message: 21/09/2006, 14h06

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