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 :

Indépendance vis à vis de la taille d'origine d'une image [XL-2016]


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Indépendance vis à vis de la taille d'origine d'une image
    Bonjour à tous,
    Je dois me plonger dans VBA pour résoudre un problème mais je ne pense pas y arriver seul... Je dois insérer des images liées à une cellule dans excel en passant par une macro. Jusque là ça va. Par contre comme il y a pas mal d'image, la taille du fichier augmente au delà du raisonnable. Je ne parviens pas à trouver l'option qui permettrait de ne plus lier la taille de l'image que j'ai insérée à celle du fichier d'origine. Il y a une case à cocher dans les options de l'image mais je ne voudrais le faire directement à partir de la macro. Le code que j'utilise est en dessous.

    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
     
    Sub Photo()
        Dim Pos As String
        Dim Chemin As Variant
        Dim Photo As IPictureDisp, rapport As Double
        Dim Gauche, Sommet, Largeur, Hauteur As Single
        Dim Tmax As Integer
     
     
        Pos = InputBox("Position de la photo?", "Position")
        If Pos = "" Then
        Exit Sub
        Else
        Chemin = Application.GetOpenFilename("Images JPEG (*.jpg), *.jpg")
        Select Case Chemin
        Case ""
        Exit Sub
        Case Is <> ""
     
        Set Photo = LoadPicture(Chemin)
        Plarg = Photo.Width
        Phaut = Photo.Height
     
        Gauche = Range(Pos).Left
        Sommet = Range(Pos).Top
        Range(Pos).ColumnWidth = 37.69
        Range(Pos).RowHeight = 200 * Phaut / Plarg
        Largeur = 200
        Hauteur = 200 * Phaut / Plarg
        Ech = 200 / Plarg
     
     
        Set test = Sheets("TRA").Shapes.AddPicture2(Chemin, False, True, Gauche, Sommet, Largeur, Hauteur, 1)
        test.ScaleHeight 1, False
        test.ScaleWidth 1, False
     
        Set test = Nothing
        Set Photo = Nothing
        End Select
        End If
     
    End Sub
    En vous remerciant pour votre aide

    Sergei RT

  2. #2
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Bonjour,

    L'objet Photo que vous déclarez ne sert à rien.
    En utilisant le code modifié ci-dessous, j'obtiens bien une taille de fichier différente selon la largeur que j'indique pour la photo :
    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
    Dim Pos As String, Chemin As Variant
        Dim Gauche As Single, Sommet As Single, Largeur As Single, Hauteur As Single
     
        Pos = InputBox("Position de la photo?", "Position")
        If Pos = "" Then
            Exit Sub
        Else
            Chemin = Application.GetOpenFilename("Images JPEG (*.jpg), *.jpg")
            Select Case Chemin
                Case ""
                    Exit Sub
                Case Is <> ""
                    Gauche = Range(Pos).Left
                    Sommet = Range(Pos).Top
                    Largeur = 400
                    With Feuil1.Shapes.AddPicture(Chemin, False, True, Gauche, Sommet, -1, -1)
                        .ScaleHeight Largeur / .Width, False
                        .ScaleWidth Largeur / .Width, False
                    End With
           End Select
        End If

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour votre solution. L'objet Photo me permettait d'extraire les données de taille de l'image afin de redimensionner la ligne en conséquence. Avec votre solution, je perds cette fonction. Je n'arrive pas à créer de variable récupérant la largeur de l'image avec votre code.

    Bonne journée

    Sergei RT

  4. #4
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Une fois utilisée AddPicture, les hauteru et largeur de l'image sont obtensibles via .Height et .Width (voir la ligne 17 du code que j'ai posté).
    Le code proposé maintient le format de l'image (le ratio largeur sur hauteur).

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    l'occupation de la mémoire ne dépend pas des dimensions données à l'affichage, mais :
    1) - du nombre de contrôles images utilisés
    2) - du "poids" en octets des images (avant leur affichage)
    Si tu veux réduire l'occupation du 2), c'est l'image elle-même, qu'il te faudra "réduire", avant son importation dans ton classeur.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Ben_L Voir le message
    Une fois utilisée AddPicture, les hauteru et largeur de l'image sont obtensibles via .Height et .Width (voir la ligne 17 du code que j'ai posté).
    Le code proposé maintient le format de l'image (le ratio largeur sur hauteur).
    Merci Ben_L, J'ai vu en effet que les dimensions de l'image étaient fournies par .Height et .Width. Je m'en servais à la fois pour dimensionner l'image et pour redimensionner la hauteur de la cellule. Avec le code que vous proposez, je ne sais pas récupérer l'info de l'échelle appliquée (ligne 17 de votre code) pour l'appliquer à la hauteur de la cellule.

    Bonne journée

    Sergei RT

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    l'occupation de la mémoire ne dépend pas des dimensions données à l'affichage, mais :
    1) - du nombre de contrôles images utilisés
    2) - du "poids" en octets des images (avant leur affichage)
    Si tu veux réduire l'occupation du 2), c'est l'image elle-même, qu'il te faudra "réduire", avant son importation dans ton classeur.
    Merci unparia pour ta réponse. Je pense que je vais creuser dans cette direction.

    Bonne journée

    Sergei RT

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bien
    Garde cependant à l'esprit que ce que j'ai mis dans le 1) est déjà très gourmand en soi (importation d'un contrôle avec tous ses évènements, propriétés, méthodes, etc ...) et est fixe quel que soit le poids de l'image.
    Il est même assez peu fréquent que l'image elle-même soit d'une taille telle qu'elle occupe en mémoire plus que le contrôle image lui-même.
    N'as-tu pas remarqué que la plupart des logiciels type "albums de photos" n'importent et n'affichent jamais la totalité ? Ils affichent par petits groupes, au fur et à mesure des affichages de "pages". Comprends que les images ne sont importées elles-mêmes qu'au fur et à mesure. Elles restent stockées à l'extérieur jusqu'à importation d'un groupe en vue de son affichage.

    A toi de gérer selon ce principe, si tu ne veux pas alourdir considérablement ton classeur, voire déborder en zone de swapping à l'exécution (encore pire).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    ça marche. Dans ce cas pour régler le 1) est ce qu'il y a un moyen de libérer la mémoire après importation et la fin de la macro?

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Ne te complique pas trop la vie
    Contente-toi de n'insérer que le nombre nécessaire de contrôles image (égal au maximum affichable et visible sur ton écran)
    Déplace ensuite ces contrôles où il le faut à chaque nouvel affichage
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

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

Discussions similaires

  1. [1.x] Connaitre la taille (hauteur/largeur) d'une image uploadé
    Par Malonix dans le forum Symfony
    Réponses: 11
    Dernier message: 08/07/2010, 12h09
  2. Taille en pixel d'une image à upload
    Par dieudo dans le forum VB.NET
    Réponses: 10
    Dernier message: 11/03/2008, 11h48
  3. Réponses: 2
    Dernier message: 20/10/2006, 19h28
  4. [ImageMagick] Taille en octet d'une image
    Par Oberown dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/08/2006, 09h32
  5. [XSLFO] Redimensionnement original d'une image ?
    Par elitost dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/09/2005, 13h49

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