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 :

Afficher des images [XL-2016]


Sujet :

Excel

  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut Afficher des images
    Bonjour à tous ,

    je suis un peu perdu et sollicite votre aide
    j'ai 2 feuilles

    Feuille 1 - liste les articles avec des images et les adresses de ces images correspondantes
    Feuille 2 - liste les entrées - sorties de ces articles ainsi que les adresses

    je souhaiterai pouvoir afficher l'image des articles dans la feuille 2 mais je n'arrive pas
    j'ai illustré ma demande avec le fichier Test ci-dessous avec quelques articles et des entrées-sorties

    un grand merci par avance pour le coup de main

    pascal
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2024
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2024
    Messages : 36
    Par défaut
    Salut Cobra38

    Sauf erreur, avec une formule sur plusieurs lignes, c'est impossible !

    Il faudra utiliser VBA pour ça

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut
    Salut ExcelTastic

    Je comprends mieux pourquoi je n'y arrive pas !
    la solution est donc une fiche unique ?

    pascal

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2024
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2024
    Messages : 36
    Par défaut
    Re,

    Oui ou alors VBA

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut
    Juste pour savoir ,
    si je fais un formulaire, il faut donc que je valide le choix et que j'incrémente ma liste d'entrée-sortie de façon automatique
    comment fait-on stp pour incrémenter ( ajouter une ligne par exemple ) une feuille après une validation ?

  6. #6
    Membre chevronné
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2012
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 314
    Par défaut
    Bonsoir,

    Exemple avec du VBA

    Ps: activer les macros pour un fonctionnement normal

    Slts
    Fichiers attachés Fichiers attachés

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut
    Cool riton00
    mille mercis
    la macro doit être placée à chaque modification de la feuille 2 ?

    pascal

  8. #8
    Membre chevronné
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2012
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 314
    Par défaut
    Bonjour cobra38,

    je ne sais pas si cela résout ta demande mais je t'ai fais un exemple avec une feuille en + (tu fais ton choix dans la liste déroulante et ton image s'affichera)

    Slts
    Fichiers attachés Fichiers attachés

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut
    je ne sais pas si cela résout ta demande mais je t'ai fais un exemple avec une feuille en + (tu fais ton choix dans la liste déroulante et ton image s'affichera)
    Si çà résout bien mon problème merci encore
    et pour ma culture perso , j'avoue ne pas bien saisir quelques lignes de la macro comme par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Selection.ShapeRange.Left = ActiveCell.Left + 7
    Selection.ShapeRange.Top = ActiveCell.Top + 5
    j'ai créé un 4ieme feuille pour ex , plus besoin d'adresse ou autre ... c'est génial !!

    pascal

  10. #10
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 082
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Selection.ShapeRange.Left = ActiveCell.Left + 7
    Selection.ShapeRange.Top = ActiveCell.Top + 5
    Ces lignes permettent de placer l'image en fonction de la position en haut à gauche de la cellule (juste un peu à droite et en dessous)
    :bug:

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut
    Merci tototiti2008

    mille pardons
    Je découvre VBA ....

    j'abuse mais
    j'ai encore un petit blocage sur la variable s
    dans :
    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Column = 1 And Target.Count = 1 Then
        '-- suppression
        For Each s In ActiveSheet.Shapes    <============================
          If s.Type = 13 Or s.Type = 9 Then
             If s.TopLeftCell.Address = Target.Offset(0, 1).Address Then s.Delete
          End If
        Next s
        If Target <> "" Then
           lig = [objet].Find(Target, LookAt:=xlWhole).Row
           col = [objet].Column + 3
           For Each s In Sheets("Feuil3").Shapes
              If s.TopLeftCell.Address = Cells(lig, col).Address Then s.Copy
           Next s
           Target.Offset(0, 1).Select
           ActiveSheet.Paste
           Selection.ShapeRange.Left = ActiveCell.Left + 7
           Selection.ShapeRange.Top = ActiveCell.Top + 5
           Target.Select
         End If
       End If
    End Sub
    Sub xx()
      x = ActiveSheet.Shapes(1).Type
    End Sub
    je ne sais pas où elle est définie dans l'exemple donné

    pascal

  12. #12
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 082
    Billets dans le blog
    2
    Par défaut
    Re,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     For Each s In ActiveSheet.Shapes    <============================
          If s.Type = 13 Or s.Type = 9 Then
             If s.TopLeftCell.Address = Target.Offset(0, 1).Address Then s.Delete
          End If
        Next s
    Dans un For Each, on boucle sur tous les éléments d'une collection
    ici, la collection est ActiveSheet.Shapes, ce qui signifie les formes (inclus les images et graphiques) de la feuille
    A chaque tour de boucle, s est une Shape (objet graphique) de la feuille, puis au tour suivant il passe à l'objet graphique suivant
    Ce qu'il y a entre For each et Next est ce qui est appliqué à chaque Shape de la feuille
    :bug:

  13. #13
    Membre chevronné
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2012
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 314
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each s In ActiveSheet.Shapes
        If s.Type = 13 Or s.Type = 9 Then
            If s.TopLeftCell.Address = Target.Offset(0, 1).Address Then s.Delete
        End If
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For Each s In ActiveSheet.Shapes
     
    ActiveSheet : la feuille actuellement active (celle qui a le focus).
     
    .Shapes : la collection de toutes les formes présentes sur cette feuille : images, zones de texte, boutons, graphiques, flèches, groupes de formes, objets WordArt, etc.
     
    ForEachIn … : boucle qui parcourt un à un tous les éléments d’une collection.
     
    s : variable‑objet déclarée implicitement (de type Shape) qui, à chaque itération, représente la forme courante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    On parcourt toutes les formes (Shapes) de la feuille courante.
     
    s.Type = 13 : image ( msoPicture ) ; s.Type = 9 : groupe de formes (msoGroup).
     
    Si la forme a pour « cellule ancrage » (TopLeftCell) la cellule située juste à droite de Target (Target.Offset(0, 1)), on la supprime :
     
    Objectif : s’assurer qu’un ancien pictogramme ne reste pas lorsque la valeur de la ligne change.

    Slts

  14. #14
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 069
    Par défaut
    Salut

    Je me suis permis quelques modifs.

    Il est bien de penser à utiliser les tableaux structurés dès que possible.
    J'ai converti les deux tableaux, modifier le nom de cellule (bien plus simple que les formules "=decaler()"

    Plutôt que de reproduire le même code sur toutes les feuilles, autant mettre le code dans thisworkbook.onchange et ensuite filtrer les feuille où l'on veut agir... ou pas
    Pour le code VBA,

    1. On copie une image "vide" (avec un logo indiquant qu'il n'a pas trouvé)
    2. On place l'adresse de la cellule contenant l'image correspondant à l'article choisi, dans la propriété Formula de l'image "vide".
    3. On redimensionne le tout (image + hauteur de ligne)
    4. On ajoute une ligne vide à la fin du tableau pour permettre à l'utilisateur de faire une nouvelle sélection dans la liste déroulante


    Avec les tableaux, pas besoin d'étaler les mises en formes et les listes déroulantes au hasard d'un nombre de lignes incertain.
    Si on choisi de modifier une image de la base pour y mettre un meilleur visuel, toutes les images des autres feuille se mettent à jour sans aucune manip

    ++
    Qwaz
    Fichiers attachés Fichiers attachés

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  15. #15
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut
    Bonjour Qwazerty

    Un grand merci pour ce retour

    j'ai procédé à la mise à jour de ma base de données et çà a l'air de bien fonctionner :

    1) comme je ne suis pas très doué en VBA , j'ai usage de "copier-coller" qui s'avèrent désastreux
    j'ai malheureusement oublié comment on faisait pour supprimer les liens "parasites" ce qui ralentissent considérablement la mie à jour des images et plantent excel
    mais je plaide coupable quelques tuyaux me seraient utiles je crois ....

    2) j'ai bien noté le rajout automatique de lignes ( qui fonctionne bien )
    mais qu'en est-il des images lors de la suppression de ligne stp ? en effet lorsqu'on supprime une ou plusieurs lignes du tableau ( comme dans ex feuil1)
    on garde l'ensemble des images du tableaux
    pardon encore

    bien cordialement
    pascal

  16. #16
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 069
    Par défaut
    Salut

    Citation Envoyé par cobra38 Voir le message
    Bonjour
    1) comme je ne suis pas très doué en VBA , j'ai usage de "copier-coller" qui s'avèrent désastreux
    j'ai malheureusement oublié comment on faisait pour supprimer les liens "parasites" ce qui ralentissent considérablement la mie à jour des images et plantent excel
    mais je plaide coupable quelques tuyaux me seraient utiles je crois ....
    Deux cas de figure
    • Des liens internes avec des formules : Tu peux faire apparaitre les formules dans les cases à l'aide de la touche F3. Ça va te faciliter le repérage des cellules contenant des formules.
    • Des liens externes : Si plus aucun de ces lien n'a court, tu peux aller dans l'onglet Données... "Modifier les liaisons", Dans cette fenêtre, tu peux prendre connaissance des liens et les supprimer ou donner une nouvelle cible. Iil arrive quand on fait des versions successive, que des liens subsistent vers une version antérieur. Ici tu peux modifier la source et venir pointer sur le fichier de la version actuelle. (En gros, tu es sur la version MonFichierV3.xslx et tu as des liaisons non souhaité vers MonFichierV1.xlsx : Dans MonFichierV3, tu fais la manip expliqué au dessus et tu prend comme nouvelle source MonFichierV3, comme ça les références redeviennent internes.


    Citation Envoyé par cobra38 Voir le message
    2) j'ai bien noté le rajout automatique de lignes ( qui fonctionne bien )
    mais qu'en est-il des images lors de la suppression de ligne stp ? en effet lorsqu'on supprime une ou plusieurs lignes du tableau ( comme dans ex feuil1)
    on garde l'ensemble des images du tableaux
    Je n'ai peut-être pas très bien traité ce cas de figure, j'essaie de regarder ce soir. Est-ce que le mieux ne serait pas de dire, si target est vide (l'utilisateur vient de supprimer le contenu d'une cellule de la colonne article, alors on supprime l'image et on supprime la ligne? Est-ce que ce fonctionnement conviendrait?


    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #17
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    928
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 928
    Par défaut
    Re...

    Deux cas de figure
    Des liens internes avec des formules : Tu peux faire apparaitre les formules dans les cases à l'aide de la touche F3. Ça va te faciliter le repérage des cellules contenant des formules.
    Des liens externes : Si plus aucun de ces lien n'a court, tu peux aller dans l'onglet Données... "Modifier les liaisons", Dans cette fenêtre, tu peux prendre connaissance des liens et les supprimer ou donner une nouvelle cible. Iil arrive quand on fait des versions successive, que des liens subsistent vers une version antérieur. Ici tu peux modifier la source et venir pointer sur le fichier de la version actuelle. (En gros, tu es sur la version MonFichierV3.xslx et tu as des liaisons non souhaité vers MonFichierV1.xlsx : Dans MonFichierV3, tu fais la manip expliqué au dessus et tu prend comme nouvelle source MonFichierV3, comme ça les références redeviennent internes.
    j'ai bien retrouvé une liaison appelée "objet" venant d'un autre classeur mais même en "rompant la liaison" celle-ci persiste et je ne peux pas la supprimer (?) , je continue néanmoins de chercher mais
    ceci m'amène à te poser une autre question si tu le permets :
    j'ai avec VBA et le programme que tu as fait ( merci encore) la possibilité de multiplier les feuilles par ex j'ai filtré toutes mes commandes 2023 et 2024 et j'ai maintenant des "feuilles archives" avec les images correspondantes aux articles mais chaque feuille fait appel à la base "article" sous le nom "objet" comme dans le fichier exemple c'était "codes2"
    or si on liste les différents noms on peut constater qu'ils portent tous le même nom mais associé aux différentes feuilles
    ma question est la suivante : n'est-ce pas gênant si je multiplie ainsi par années les feuilles ?

    Je n'ai peut-être pas très bien traité ce cas de figure, j'essaie de regarder ce soir. Est-ce que le mieux ne serait pas de dire, si target est vide (l'utilisateur vient de supprimer le contenu d'une cellule de la colonne article, alors on supprime l'image et on supprime la ligne? Est-ce que ce fonctionnement conviendrait?
    Oui bien sûr, je n'osais te le demander bien vu ....

    pascal

  18. #18
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 069
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    j'ai bien retrouvé une liaison appelée "objet" venant d'un autre classeur mais même en "rompant la liaison" celle-ci persiste et je ne peux pas la supprimer (?) , je continue néanmoins de chercher
    Les fois où j'ai vu se comportement (bien que je ne comprenne pas le sens de appelée 'objet', c'est que le lien était présent dans un nom de cellule (Ruban Formules, Gestionnaire de nom)

    Citation Envoyé par cobra38 Voir le message
    j'ai avec VBA et le programme que tu as fait ( merci encore) la possibilité de multiplier les feuilles par ex j'ai filtré toutes mes commandes 2023 et 2024 et j'ai maintenant des "feuilles archives" avec les images correspondantes aux articles mais chaque feuille fait appel à la base "article" sous le nom "objet" comme dans le fichier exemple c'était "codes2"
    or si on liste les différents noms on peut constater qu'ils portent tous le même nom mais associé aux différentes feuilles
    Ah ben voila le fameux 'objet', donc ça confirme ce que j'ai noté au dessus, c'est la formule de 'objet' qui fait appelle à un autre classeur.
    Oui, c'est un phénomène courant, j'avoue que je n'ai jamais cherché à contourner cet état de fait, d'autant que non, ça n'est pas gênant en sois

    Citation Envoyé par cobra38 Voir le message
    ma question est la suivante : n'est-ce pas gênant si je multiplie ainsi par années les feuilles ?
    Je pense que tu devrais faire un sujet où tu explique exactement ce que tu veux faire. Il y a un sous forum conception, qui me semble adapté. Ce sujet n'aurait pas pour but de faire ou résoudre un problème en particulier mais d'exposer ce que tu veux faire et collecter des idées ou façon de faire pour y parvenir.

    Gérer ta base principale dans ton fichier me semble une mauvaise idée de départ si tu dis devoir faire un grand nombre d'onglet par la suite. Il serait préférable de faire un fichier base de donnée externe contenant la base de tes articles. Bien sûr ça va t'obliger à gérer tes visuel à l’extérieur de cette base.
    En gros (mais vu que je n'ai pas tous les tenants et aboutissants ça reste délicat), l'idéal pour moi serait que dans un fichier xlsx Base_Article, tu es ta liste d'articles et une colonne avec le chemin vers l'image associée (ou juste le nom de l'image, le reste du chemin peut être fixé "en dur" dans une autre cellule.
    A partir de là, tu pourrais avoir 1 fichier par an, ou par commande, ou pas ... Qui iraient tous chercher la liste des articles et leur visuel associé dans Base_Article (et son répertoire associé)
    Bien plus flexible dans le temps, par contre la mise à jour du visuel ne se ferait plus automatiquement mais je pense qu'à choisir...

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  19. #19
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 069
    Par défaut
    Voila le code modifié

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    Option Explicit
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim S As Variant
    Dim FindRg As Range
    Dim memoSU As Boolean
     
        'Initialisation
        'En cas d'erreur, on passe à la ligne suivante sans déclencher de message
        On Error Resume Next
        'On pointe les cellules présente dans la selection et dans la 1ère colonne du tableau
        Set FindRg = Intersect(Target, Sh.ListObjects(1).ListColumns(1).Range)
     
        'En cas d'erreur, on bascule directemnt à la fin
        On Error GoTo fin
     
        'On mémorise la position de screenupdating
        memoSU = Application.ScreenUpdating
     
        'On ne rafraichi plus l'écran
        Application.ScreenUpdating = False
     
        'On vérifie qu'il ne s'agit pas de la feuille base de données (à adapter pour cibler que les feuilles qui doivent faire l'objet d'un import d'image)
        'On regarde aussi qu'il n'y a qu'une cellule modifiée et qu'elle se trouve dans la 1ère colonne de la feuille
        If Sh.CodeName <> "F_Base" And (Not FindRg Is Nothing) And Target.Count = 1 Then
            '-- suppression
            'On boucle sur toute les images présentes
            For Each S In Sh.Shapes
                'If S.Type = 13 Or S.Type = 9 Then
                    'On regarde si l'adresse de la cellule qui contient cette image correspond à la cellule à droite de Target, si c'est le cas, on la supprime
                    If S.TopLeftCell.Address = Target.Offset(0, 1).Address Then
                        'On supprime l'image
                        S.Delete
                        'Si target est vide, on supprime la ligne
                        If Target.Value = "" Then
                            'On faire la correspondance en terme de ligne dans le tableau structuré
                            With Sh.ListObjects(1)
                                'Avant de supprimer la ligne, on s'assure qu'il ne s'agit pas de la dernière ligne vide du tableau!
                                'On prend le numero de ligne contenant target et on lui soustrait le numero de ligne où se trouve l'entête du tableau
                                'On pointe la ligne du tableau structuré correspondante
                                With .ListRows(Target.Row - .HeaderRowRange.Row)
                                    'On vérifie qu'il ne s'agit pas de la dernière ligne du tableau
                                    If .Index < Sh.ListObjects(1).ListRows.Count Then
                                        'On supprime la ligne
                                        .Delete
                                        'On quite la boucle For (Target n'existe plus)
                                        GoTo TargetKilled
                                    End If
                                End With
                            End With
                        End If
                    End If
                'End If
            Next
     
            'Si Target est vide, on ne remet pas d'image
            If Target <> "" Then
                'On recheche la correspondence dans le tableau Base de donnée
                Set FindRg = F_Base.ListObjects("Tab_Base").ListColumns(1).Range.Find(Target, LookAt:=xlWhole)
                'On place une copie de l'image Vide
                F_Base.Shapes("Img_Vide").Copy
                Target.Offset(0, 1).PasteSpecial
     
                'On s'assure qu'une correspondence à été trouvée, sinon on laisse vide
                If Not FindRg Is Nothing Then
                    'On place en formule, le lien vers la cellule dont on veut capturer l'apparence
                    Selection.Formula = FindRg.Offset(0, 2).Address(External:=True)
                End If
     
                'On laisse du temps à Windows/Excel de faire le boulot
                DoEvents
                'On rétablie la dimenssion de l'image
                With Selection.ShapeRange
                    .ScaleHeight 1, msoTrue
                    .ScaleWidth 1, msoTrue
                    'On affine la mise en place
                    .Left = Target.Offset(0, 1).Left + 7
                    .Top = Target.Offset(0, 1).Top + 5
                    'On adapte la taille de la ligne
                    Target.RowHeight = .Height + 10
                End With
     
            End If
     
    TargetKilled:
            'On regarde si la dernière ligne du tableau à une cellule vide, sinon, on ajoute une ligne pour bénéficier de la liste déroulante la prochaine fois
            With Sh.ListObjects(1)
                'On s'assure qu'il existe du contenu dans le tableau
                If .ListRows.Count > 0 Then
                    'On vérifie si la 1ère cellule de la dernière ligne contient du text
                    If .ListRows(.ListRows.Count).Range(1).Value <> "" Then
                        'On ajoute une ligne vide
                        .ListRows.Add
                    End If
                Else
                    'On ajoute une ligne pour que le tableau est au moins une ligne vide
                    .ListRows.Add
                End If
            End With
        End If
    fin:
        'On rétabli la rafraichissement d'écran*
        Application.ScreenUpdating = memoSU
     
        'On affiche l'erreur si présente
        If Err.Number <> 0 Then
            MsgBox "L'erreur suivante est apparue" & vbCrLf & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur"
            Err.Clear
            Resume
        End If
    End Sub
    Si tu gardes l'optique d'utiliser ce code, il peut y avoir deux améliorations
    • Une mineure, qui serait de gérer application.enabledevents pour empêcher de réexécuter le code au moment de la suppression d'une ligne (ça appelle OnChange)
    • Une majeure, en supprimant le test Target.count = 1 et en gérant ensuite une boucle sur les cellules sélectionnées (en faisant un intersect en 1er lieu pour limiter aux cellules de la colonne article). En faisant ça, tu pourrais supprimer plusieurs article en une fois et/ou ajouter plusieurs composant d'un coup en copiant des valeur en bas de la liste.


    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  20. #20
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 672
    Par défaut
    Bonjour,

    Il existe une technique intéressante pour récupérer l'image par formule (désolé c'est en anglais):
    https://trumpexcel.com/picture-lookup/

    Je l'utilise avec succès dans un fichier que j'ai créé il y a deux ans.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Afficher des images sur une grille
    Par Coussati dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/10/2005, 09h27
  2. [C#] Afficher des images dans un datagrid
    Par mbibim63 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/05/2005, 12h22
  3. [JLabel] Afficher des images
    Par Bouki dans le forum Composants
    Réponses: 8
    Dernier message: 25/03/2005, 10h38
  4. Afficher des images sous directX
    Par cyberlewis dans le forum DirectX
    Réponses: 17
    Dernier message: 12/07/2004, 12h07
  5. [TP][MULTI-PROBLEME]Comment afficher des images pcx
    Par mikoeur dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 24/10/2002, 13h57

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