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 :

Affecter une couleur à un contrôle placé dans une feuille de calculs


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut Affecter une couleur à un contrôle placé dans une feuille de calculs
    Re Bonjour,
    Je cherche à modifier la couleur de fond d'un contrôle image placé dans une feuille de calculs
    Pour le moment je n'arrive à rien. Pas de bug avec cette syntaxe... malheureusement inopérante.
    "couleur" est le paramètre envoyé sur sélection dans un combo, qui permet de retrouver, dans FL3, la combinaison RGB de la couleur choisie
    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
    Sub Colorier(Couleur As String)
    Dim FL1 As Worksheet
    Dim FL3 As Worksheet
    Dim FL2 As Worksheet
    Dim c As Range
    Dim Objet As Shape
        Set FL1 = Worksheets("Feuil1")
        Set FL2 = Worksheets("Feuil2")
        Set FL3 = Worksheets("Feuil3")
        With FL3.Range("A2:A13")
            Set c = .Find(Couleur)
            If Not c Is Nothing Then
                 Set Objet = FL1.Shapes(FL2.Cells(1, 1))
                 If Objet.OLEFormat.progID = "Forms.Image.1" Then
                    Objet.Select
                    With Selection.ShapeRange
                        .Fill.BackColor.RGB = RGB(c.Offset(0, 1), c.Offset(0, 2), c.Offset(0, 3))
                    End With
                    FL1.Range("A1").Select
                 End If
            End If
        End With
    End Sub
    Si quelqu'un a une idée pour modifier les propriétés des contrôles placés dans une feuille de calculs, je suis preneur.
    Par avance, merci.

    NB - La procédure passe bien sur la ligne incriminée (en rouge sombre)

    Pour éviter de faire perdre du temps... Ne fonctionnent pas non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    With FL1.Shapes(FL2.Cells(1, 1))
                        .Fill.BackColor.RGB = RGB(c.Offset(0, 1).Value, c.Offset(0, 2).Value, c.Offset(0, 3).Value)
                    End With
    ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    With Selection.ShapeRange.Fill.BackColor
                        .RGB = RGB(c.Offset(0, 1).Value, c.Offset(0, 2).Value, c.Offset(0, 3).Value)
                        DoEvents
                    End With
    ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    With Selection.ShapeRange.Fill
                        .BackColor.RGB = RGB(c.Offset(0, 1).Value, c.Offset(0, 2).Value, c.Offset(0, 3).Value)
                        DoEvents
                    End With
    non plus que tous les modes de sélection ou d'affectation de la propriété BackColor

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Pardon si je réponds à côté ...

    mais as-tu essayé dans ton bloc With ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            .Fill.Visible = msoTrue
            .Fill.Solid
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  3. #3
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour à vous ... ;o)

    As tu essayé simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil1.Image1.Object.BackColor = RGB(255, 0, 0)

    bonne soirée
    michel

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello Silky, les aut'
    Ok, ton code fonctionne sans pb si on a le nom du contrôle, non si ce nom est récupéré par l'événement clic du contrôle intercepté dans un module de classe (ton code)
    J'ai testé plusieurs choses :
    1 - En plaçant tout le code dans une macro (standard) avec le nom du contrôle passé en paramètre, macro qui ouvre un usf qui permet la sélection d'une couleur dans une liste.
    Puis, retour dans la macro et traitement de la couleur.
    Tout fonctionne normalement et je récupère bien le nom du contrôle et les valeurs RGB de la couleur sélectionnée
    ... mais ça ne fonctionne pas
    Alors en 2, j'ai placé le code d'ouverture de l'usf dans le module de classe ainsi que le traitement des couleurs... Tout pareil. Reconnaissance, identification, récupération des bonnes valeurs... Mais ça ne fonctionne toujours pas.
    Désespéré je suis.
    J'ai bien compris que ces contrôles faisaient partie d'une collection mais là, je cale. J'utilise l'objet Img. du code que tu m'as passé.
    Voilà.
    Si tu as une idée... (je suppose bien... )
    par avance merci

    Le code (dernier test)
    Rien de changé par rapport au code passé dans Workbook_Open

    Dans le module de classe :
    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
    Option Explicit
     
    Public WithEvents Img As MSForms.Image
     
    'exemple pour gerer l'evenement clic sur les objets type Image
    Private Sub Img_Click()
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet
    Dim c As Range
        Set FL1 = Worksheets("Feuil1")
        Set FL2 = Worksheets("Feuil2")
        FL1.Cells(1, 1) = Img.Name
        UserForm1.Show
        With FL2.Range("A2:A13")
            Set c = .Find(FL2.Cells(1, 1).Value)
            If Not c Is Nothing Then
               Img.Select
               With Selection.ShapeRange
                   .Fill.BackColor.RGB = RGB(c.Offset(0, 1).Value, c.Offset(0, 2).Value, c.Offset(0, 3).Value)
                   DoEvents
               End With
               FL1.Range("A1").Select
            End If
        End With
    End Sub
    Le code dans l'usf
    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
    Private Sub ListBox1_Click()
    Dim FL2 As Worksheet
        Set FL2 = Worksheets("Feuil2")
        'Couleur selectionnée
        FL2.Cells(1, 1) = Me.ListBox1.Value
        Unload Me
    End Sub
     
    Private Sub UserForm_Initialize()
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet, Plage
        Set FL1 = Worksheets("Feuil1")
        Set FL2 = Worksheets("Feuil2")
        Label1.Caption = FL1.Cells(1, 1)
        FL1.Cells(1, 1) = ""
        Plage = FL2.Range("A2:B" & FL2.Range("A65536").End(xlUp).Row).Value
        'Liste des couleurs
        Me.ListBox1.List = Plage
    End Sub

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par cafeine Voir le message
    Pardon si je réponds à côté ...
    mais as-tu essayé dans ton bloc With ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            .Fill.Visible = msoTrue
            .Fill.Solid
    Pas de pardon !
    Oui, j'ai testé, pas de changement. Mais merci pour l'idée.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    rebonsoir

    Ok, ton code fonctionne sans pb si on a le nom du contrôle, non si ce nom est récupéré par l'événement clic du contrôle intercepté dans un module de classe
    bien sur que si..
    dans cet exemple les controle image ont une couleur verte par défaut et prennent une couleur rouge quand on clique dessus:


    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
    '--------------------------------------
    'à placer au niveau de ThisWorbook pour que la classe soit
    'inialisée lors de l'ouverture du classeur
     
    Option Explicit
     
    Private Sub Workbook_Open()
    Dim Obj As OLEObject
    Dim Cl As Classe1
     
    Set Collect = New Collection
     
    'boucle sur les objets de la Feuil1
    For Each Obj In Feuil1.OLEObjects
        'verifie s'il s'agit d'un contrôle Image
        If TypeOf Obj.Object Is MSForms.Image Then
        Set Cl = New Classe1
        Set Cl.Img = Obj.Object
        Collect.Add Cl
        End If
    Next Obj
     
    End Sub
    '--------------------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    '--------------------------------------
    'dans un module standard
    Option Explicit
     
    Public Collect As Collection
    Public objTemp As MSForms.Image
     
    '--------------------------------------

    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
    '--------------------------------------
    'dans un module de classe nommé "Classe1"
    '
    Option Explicit
     
    Public WithEvents Img As MSForms.Image
     
    'exemple pour gerer l'evenement clic sur les objets type Image
    Private Sub Img_Click()
     
        If objTemp Is Nothing Then
            Img.Object.BackColor = RGB(255, 0, 0)
            Set objTemp = Img
        Else
            objTemp.Object.BackColor = RGB(0, 255, 0)
            Img.Object.BackColor = RGB(255, 0, 0)
            Set objTemp = Img
        End If
     
    End Sub
    '--------------------------------------

    bonne soirée
    michel

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Très cher Michel,
    Je savais bien que tu aurais "une idée".
    C'est ok, ça fonctionne parfaitement...
    Je savais aussi qu'il me manquait quelque chose.
    J'avais fait le test avec Img.ShapeRange qui ne fonctionnait pas (!) j'avais "simplement" oublié "object"... (et ajouté un RGB bien inutile )
    Un grand merci (encore !...)
    Mais tu as de la veine de savoir tout ce que tu sais

    Bonne soirée
    Joël

    En reprenant ton code, ça donne ça
    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
    Option Explicit
     
    Public WithEvents Img As MSForms.Image
    Private Sub Img_Click()
    Dim FL1 As Worksheet
    Dim FL2 As Worksheet
    Dim c As Range
        Set FL1 = Worksheets("Feuil1")
        Set FL2 = Worksheets("Feuil2")
        FL1.Cells(1, 1) = Img.Name
        UserForm1.Show
        With FL2.Range("A2:A13")
            Set c = .Find(FL2.Cells(1, 1).Value)
            If Not c Is Nothing Then
                 Img.Object.BackColor = RGB(c.Offset(0, 1).Value, c.Offset(0, 2).Value, c.Offset(0, 3).Value)
            End If
        End With
    End Sub
    Me reste à gérer les autres propriétés.
    Encore merci

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/08/2009, 18h34
  2. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  3. Réponses: 1
    Dernier message: 16/05/2007, 12h51
  4. [MySQL] récupérer dans une boucle chaque information MySQL dans une variable différente
    Par gtenthorey dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2007, 22h34
  5. Réponses: 2
    Dernier message: 20/06/2006, 08h22

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