indexs dans collection pictures incohérents

patricktoulon

XLDnaute Barbatruc
bonjour a tous
j'ai un soucis avec pictures
cette petite boucle me liste mêmes les bouton activX et toutes shapes confondues
alors que je n'ai qu'une seule image :oops: o_O
VB:
Sub test()
    With ActiveSheet
        For i = 1 To .Pictures.Count
            MsgBox .Pictures(i).Name
        Next
    End With

End Sub
c'est un peu gênant ;)

Résumé et résolution adoptée pour cette longue discussion

la collection pictures intégrant tout le oléobjects y compris les activeX
on est obligé de faire une boucle et de créer un range de shapes de type (13)msopicture
il y donc 2 solutions simples

Laurent en post91 qui la créé en selectionnant tout les shapes concernées
moi en post95 qui le cree avec un tableau de noms d'images
 
Dernière édition:
Solution
Re,
Partie 2
Comment Travailler avec Chaques images stockés de la feuille Excel dans la variable Objet "sr"
Avec une Boucle Ou juste sur une précise (J'ai choisie juste une précise est désactivé la boucle)
Pour Travailler avec les images :
https://docs.microsoft.com/fr-fr/office/vba/api/excel.pictureformat
Méthodes
Propriétés
Code...

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

=>patricktoulon
Y veut un tableau, il a un tableau
(array pour les brexiteurs)
VB:
Sub O_Mon_Tablo_KILéBo()
Dim tableau_de_pictures() As Variant
On Error Resume Next
tableau_de_pictures = _
Application.GetOpenFilename("Fichier Jpg (*.jpg), *.jpg ,Fichier Jpeg (*.jpeg), *.jpeg, Fichier Bitmap (*.bmp), *.bmp", MultiSelect:=True)
If IsArray(tableau_de_pictures) Then
For i = LBound(tableau_de_pictures) To UBound(tableau_de_pictures)
Cells(i, 1) = tableau_de_pictures(i)
Next
End If
End Sub
Ok je sors ;)
 

laurent950

XLDnaute Accro
Bonsoir Staple1600
En faite je pense que patrick veux un tableau, mais disont un tableau d'objet.
C'est a dire stocké l'image dans le tableau mais l'objet
Votre code : tableau_de_pictures(i) contient l'adresse de l'image le chemin.
Pour votre code il faudrait donc importer l'image dans la feuille excel
est stocké cette image dans le tableau sous forme de tableau d'objet.
donc : tableau_de_pictures(i) contiendrait l'objet image
set tableau_de_pictures(i) = l'objet image (le chemin de l'image qui donne acces a cette image)
Bon c'est l'idée de Patrick Staple1600.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re, Bonsoir Laurent950

Il fallait voir mon précédent message comme une blague avant tout
Mais pour info en utilisant Application.GetOpenFilename avec MultiSelect:=True, j'obtiens un tableau (array) de plusieurs images.
Partant de là, au lieu de lister le nom des images (comme le fait ma blague), on pourrait insérer les images sur la feuille etc...
 

laurent950

XLDnaute Accro
Ha oui Staple effectivement c'est parfait comme méthode est vraiment astucieux se que vous avez donner en complémenent. est ensuite justement stocké cette même image dans un tableau mais un tableau d'objet.
comme /
Dim TabSr(1 To 3) As Shape
donc cette même image serait stocké dans ce tableau
set TabSr(1) = est donc l'objet.

La vrais question de Patrick c'est comment récupérer sur sa feuille excel les multitudes de shapes images en une seul fois (mais sans autres aobjets shapes qui correspondent pas au images. alors j'ai fait cela.
For Each s In ws.Shapes
If s.Type = TypeShape(0) Then
s.Select False
End If
Next
' Mais comment arrivée a selectionné en une fois tous les type ci-dessus sans boucle
' est stocké cette même selection en une seul fois sans aucune boucle
' La j'ai pas encore chercher mais je pense c'est ceux que Patrick veux arriver a faire !!
Set sr = Selection.ShapeRange '
car le soucis c'est que tous c'est objet sont déjà présent dans la feuille est qu'il faut en faire le tri avant
donc : c'est parfait à la construction en partant d'une base propre
tableau_de_pictures = _
Application.GetOpenFilename("Fichier Jpg (*.jpg), *.jpg ,Fichier Jpeg (*.jpeg), *.jpeg, Fichier Bitmap (*.bmp), *.bmp", MultiSelect:=True)

Mais lorsque tous les objets sont déjà exitsant sur la feuille ? est ce que ma méthode peux être correcte ?
 

patricktoulon

XLDnaute Barbatruc
Bonsoir a tous
VB:
Type Pict: Count As Long: Picture() As Picture: End Type
Dim pctX As Pict
Function groupPct() As Pict
    Dim tabl As Pict
    With ActiveSheet
        For Each shap In .Shapes
            If shap.Type = 13 Then
                a = a + 1: ReDim Preserve tabl.Picture(1 To a): Set tabl.Picture(a) = ActiveSheet.Pictures(shap.Name): tabl.Count = a
            End If
        Next
    End With
    groupPct = tabl
End Function

Sub test2()
    Dim GrouPpictureX As Pict
    GrouPpictureX = groupPct
    'test d'utilisation de la méthode pictureformat de la classe picture(OK)la cible= pictures(3)
    With GrouPpictureX.Picture(3).ShapeRange
        With .PictureFormat
            .CropLeft = 50
        End With
    End With
End Sub
des solutions il y a mais ça me mine de devoir faire ça
Laurent je regarde ce que tu a fait
 
Dernière édition:

laurent950

XLDnaute Accro
Bonjour tous le monde,
j'ai alleger le code
Partie 1
Comment stocké toutes les images de la feuille Excel dans la variable Objet "sr"
Code Ci-Dessous (Module / Laurent2) Fichier excel poste #83

VB:
Sub CategorieShapeRange()
Dim ws As Worksheet
    Set ws = Worksheets(ActiveSheet.Name)
Dim s As Shape
Dim sr As ShapeRange
Dim TabSr(1 To 3) As Shape
    For Each s In ws.Shapes
        If s.Type = 13 Then
            s.Select False
        End If
    Next
    Set sr = Selection.ShapeRange
    ws.Cells(1, 1).Select
' ***********************************
' ***********************************
' Boucle (Test) sur toutes les images
    For i = 1 To sr.Count
        sr.Item(i).Select
        Debug.Print sr.Item(i).Name
        MsgBox TypeName(sr.Type) & "  " & sr.Item(i).Name
    ' essaie msgbox typename(TabSr(i)) je suis curieux
        MsgBox TypeName(sr.Item(i).Type) & "  " & sr.Item(i).Name
    Next i
' En conclusion :
' le conteneur sr (Objet) qui contient l'ensemble de tous les types 13 (Ranger dans un tableau d'objet (Item 1 à Infini entre "")
' Alors :
' Typename c'est donc un long ci-dessous.
' C'est normal que TypeName(sr.Type) soit la même chose que TypeName(sr.Item(1).Type) Ou TypeName(sr.Item(2).Type) Ou TypeName(sr.Item(2).Type)
' Car Sr Contient à la base tous se qu'il y a en commun avec tout les objets de type 13
' est lorsque c'est plus en commun c'est ranger dans le tableau de tableau (Item(1) --> Item(2) --> à Item(etc...)
' ***********************************
' ***********************************
' Deselection des images
    ws.Cells(1, 1).Select
End Sub
 
Dernière édition:

laurent950

XLDnaute Accro
Re,
Partie 2
Comment Travailler avec Chaques images stockés de la feuille Excel dans la variable Objet "sr"
Avec une Boucle Ou juste sur une précise (J'ai choisie juste une précise est désactivé la boucle)
Pour Travailler avec les images :
https://docs.microsoft.com/fr-fr/office/vba/api/excel.pictureformat
Méthodes
Propriétés
Code Ci-Dessous (Module / Laurent3)
VB:
Sub CategorieShapeRange()
Dim ws As Worksheet
    Set ws = Worksheets(ActiveSheet.Name)
Dim s As Shape
Dim sr As ShapeRange
Dim TabSr(1 To 3) As Shape
    For Each s In ws.Shapes
        If s.Type = 13 Then
            s.Select False
        End If
    Next
    Set sr = Selection.ShapeRange
    ws.Cells(1, 1).Select
' ***********************************
' https://docs.microsoft.com/fr-fr/office/vba/api/excel.pictureformat
' PictureFormat, objet (Excel)
' Utilisez la propriété PictureFormat de l'objet Shape pour renvoyer un objet PictureFormat .
' L'exemple suivant montre comment définir la luminosité, le contraste et le changement de couleur
' de la forme 1 de myDocument et comment rogner le bas de cette forme de 18 points. Pour que cet
' exemple fonctionne, la forme 1 doit être soit une image, soit un objet OLE.
'Set myDocument = Worksheets(1)
'With myDocument.Shapes(1).PictureFormat
' .Brightness = 0.3
' .Contrast = 0.7
' .ColorType = msoPictureGrayscale
' .CropBottom = 18
' end with
' ***********************************
' Boucle (Test) sur toutes les images
    'For i = 1 To sr.Count
        ' ici test sur l'image Picture 4
        With sr.Item(4).PictureFormat
            .Brightness = 0.3
            .Contrast = 0.7
            .ColorType = msoPictureGrayscale
            .CropBottom = 18
        End With
    'Next i
' En conclusion :
' le conteneur sr (Objet) qui contient l'ensemble de tous les types 13 (Ranger dans un tableau d'objet (Item 1 à Infini entre "")
' Alors :
' Typename c'est donc un long ci-dessous.
' C'est normal que TypeName(sr.Type) soit la même chose que TypeName(sr.Item(1).Type) Ou TypeName(sr.Item(2).Type) Ou TypeName(sr.Item(2).Type)
' Car Sr Contient à la base tous se qu'il y a en commun avec tout les objets de type 13
' est lorsque c'est plus en commun c'est ranger dans le tableau de tableau (Item(1) --> Item(2) --> à Item(etc...)
' ***********************************
' ***********************************
' Deselection des images
    ws.Cells(1, 1).Select
End Sub
 

Pièces jointes

  • test pour Laurent.xlsm
    191.3 KB · Affichages: 5
Dernière édition:

laurent950

XLDnaute Accro
Re,
Poste #90 et #91
Poste #92 (Complément plus besoin de boucle pour traité en masse l'ensemble de toutes les images d'une feuille excel)

code (Module / Laurent4) en relation avec la Feuille excel : Feuil1 (2)

Explication de l'objet sr / cf image espion VBA sur feuille = L'objet "Sr" - image 4
Donc :
* Ou toutes les Images traitement en une fois avec : soit sr.PictureFormat
* Ou une Image au choix avec l'item : exemple Image 4 sr.Item(4).PictureFormat
VB:
' Plus besoin d'une boucle
' sr.PictureFormat (Traite toutes les images en 1 fois)
    'For i = 1 To sr.Count
        With sr.PictureFormat
            .Brightness = 0.3
            .Contrast = 0.7
            .ColorType = msoPictureGrayscale
            .CropBottom = 18
        End With
    'Next i
 

Pièces jointes

  • test pour Laurent.xlsm
    926.1 KB · Affichages: 5
Dernière édition:

Statistiques des forums

Discussions
312 184
Messages
2 086 008
Membres
103 088
dernier inscrit
Psodam