7
votes

Comment vérifier si une cellule a une image?

Dans Excel, je veux vérifier si une cellule spécifique par exemple "C12" a une image?
Comment pourrais-je faire cela?


0 commentaires

6 Réponses :


8
votes

Vous le faites en boucle via la collecte de formes de la feuille de calcul, à la recherche d'une forme dont .topleftcell a la même adresse que votre plage cible.


3 commentaires

Est-il possible de vérifier si cette forme est une image ou une icône? parce qu'il y a différents types de formes


Y a-t-il également une manière plus directe de le faire, en utilisant une cellule et de le vérifier pour une image.


.Type La propriété vous donne le type. S'il vous plaît appuyez sur F2 dans l'IDE et examinez le modèle d'objet. Je n'ai jamais une nouvelle réponse à cette question, mais cela m'a fallu 10 secondes pour la regarder dans le navigateur d'objets.



1
votes
For Each wShape In ActiveSheet.Shapes
If (wShape.Type <> 13) Then wShape.Delete ' If the shape doesn't represent a Picture,     ' delete
Next wShape

1 commentaires

Lorsque vous devez supprimer, vous devez démarrer en arrière à partir d'activesheet.shapes.count ou vous allez manquer certains. Aussi pour cet objectif, un simple asciveheet.pictures.delete ferait le tour en une ligne



2
votes

J'ai eu une situation où je voulais supprimer des images (dans mes graphiques de cas) des cellules sélectionnées sur une feuille de calcul et laisser les autres en place, alors supprimez toutes les images n'était pas une option. J'ai laissé un certain débogage et un code supplémentaire pour dire à l'utilisateur ce qui se passe.

Public Sub RemoveUnWantedGraphs()

    Dim shp As Shape
    Dim rangeToTest As Range
    Dim c As Range
    Dim shpList

    'Set the rangeToTest variable to the selected cells
    Set rangeToTest = Selection

    'Loop Over the the selected cells
    For Each c In rangeToTest


        'Inner loop to iterate over the shapes collection for the activesheet
        Set shpList = ActiveSheet.Shapes
        For Each shp In shpList

            Application.StatusBar = "Analysing:- " + c.Address + " Graphs To Find:- " & shpList.Count


            'If the address of the current cell and the address
            'of the shape are the same then delete the shape
            If c.Address = shp.TopLeftCell.Address Then

                Debug.Print "Deleting :- " & shp.Name
                shp.Delete

                DoEvents
            End If

        Next shp

    Next c

    Application.StatusBar = ""

    MsgBox "All Shapes In Range Deleted"

End Sub


1 commentaires

Cela ne peut pas fonctionner correctement (sauf lorsqu'il y a une image maximale dans la plage), lorsque vous supprimez, vous devez commencer à partir de la fin et accédez au premier pour i = activesheet.shapes.count à 1 étape -1 .



2
votes

La solution la plus simple consiste à créer une fonction qui retournera 1 si l'image existe dans la cellule, 0 si elle ne le fait pas. Cela ne fonctionne que pour les cellules individuelles et les besoins modifiés pour des plages multi-cellules.

Sub testFunction()

    If CellImageCheck(Range("B6")) Then
        MsgBox "Image exists!"
    Else
        MsgBox "Image does not exist"
    End If

End Sub


1 commentaires

La fonction doit être booléenne et une fonction de sortie après avoir trouvé qu'une image serait arée, à la vitesse et à une réponse correcte (si la photo suivante de la collection de formes est nulle, la fonction répondrait à 0)



1
votes

C'est tout à fait un vieux fil, alors ne savez pas si mon message aidera n'importe qui, mais j'ai rencontré un problème similaire aujourd'hui et après une solution dérivée.

J'ai d'abord stocké toutes les adresses de plage où l'objet existe, à un tableau, puis dans la deuxième partie du code, vérifiait chaque adresse de cellule dans ma plage sélectionnée pour l'objet contre chaque élément de matrice et effectué l'exécution du marquage à Une cellule offset si l'adresse de l'élément de tableau correspond à l'adresse de cellule active dans la plage sélectionnée. J'espère que ça aide. Voici le code: xxx


0 commentaires

0
votes

L'approche de Juhi m'a aidé. Je pense qu'il y a un besoin implicite dans la question initiale d'appliquer cela à plusieurs cellules ou une plage contiguë ou même une feuille entière. Dans un tel cas, il est souhaitable de ne pas envisager chaque cellule séparément et boucle à chaque forme de la feuille de la feuille à plusieurs reprises pour toutes les cellules d'intérêt.

J'ai modifié un peu la fonctionnalité pour supprimer la boucle imbriquée et entrer du texte dans tout les cellules contenant une forme. Ceci est optimisé pour mon besoin immédiat où les données source sont une région cellulaire 4x40 où les cellules contiennent une forme ou rien du tout. Ma méthode n'entre pas «NON» pour les cellules qui ne contiennent aucune forme, mais il est facile d'entrer dans les cellules vides à la fin. P>

Sub MarkCellsWithShapes()

    Dim rng As Range, shp As Shape, n As Integer, arr() As String, m As Integer, arrm As Variant

    n = ActiveSheet.Shapes.Count
    ReDim arr(n)
    
    m = 1

    For Each shp In ActiveSheet.Shapes
        arr(m) = shp.TopLeftCell.Address
        Range(arr(m)) = "Yes"
        m = m + 1
    Next

End Sub


0 commentaires