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 :

Modifier la mise en forme via une fonction [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur d'étude
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'étude

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Par défaut Modifier la mise en forme via une fonction
    Bonjour,

    je commence mon apprentissage en VBA et je me heurte à un problème depuis quelques jours.

    Je souhaite changer dynamiquement la mise en forme d'une cellule selon le contenu d'une autre.

    J'ai commencé une macro qui inscrit une formule dans la cellule (my_lign + 21, my_coll).
    Cette formule vérifie le contenu de la cellule (my_lign + 4, my_coll), si ce contenu est égal à une valeur elle lance la fonction hachure() qui hachure la cellule (my_lign + 21, my_coll), sinon elle lance la fonction nettoie() qui vide cette même cellule.

    Soit la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(my_lign + 21, my_coll).Formula = "=SI(" & Cells(my_lign + 4, my_coll).Address(RowAbsolute:=False, ColumnAbsolute:=False) & "=""SMS"",hachure(),nettoie())"
    J'accède effectivement bien à mes fonctions, et si je change plusieurs fois le contenu de la cellule my_lign+4, les fonctions hachure() et nettoie() sont bien lancés plusieurs fois car les msgbox apparaissent bien. Le problème c'est qu'à l'intérieur de mes fonctions je ne peux quasi rien faire, je peux juste lancer une MsgBox et changer la valeur de ma cellule en faisant par exemple nettoie="tralala". Impossible de faire par exemple Cells(34,53) = 45 ou encore hachure.Interior.Pattern = xlUp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function hachure()
    hachure = "" ' vide bien la case
    MsgBox "hachure" ' affiche bien une box avec le message
    hachure.Interior.Pattern = xlUp 'ne fait rien
    MsgBox "fin" ' n'apparait même pas
    End Function

  2. #2
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut Mix it!!!
    Salut,

    Bon déjà balise ton code, ça augmente la lisibité

    Ensuite est ce que tu as pensé à faire de la mise en forme conditionnelle qui a l'air de bien répondre à ta demande.

    Ensuite pour ton problème de fonction :
    Ca ne marche pas car tu mélanges plusieurs choses

    T'as déterminé une fonction hachure() que tu appelles si certaines conditions sont remplies.
    Une fonction c'est une opération mathématique ou autre comme +, -, SOMME()...
    Donc dans ta formule si la condition est remplie, la cellule renvoie le résultat de l'opération hachure() soit "" (plus des msgbox qui sont autorisés dans une fonction).
    Sinon opération nettoie()

    En simple la fonction ne fait que renvoyer le résultat d'une opération.

    Si tu veux plus qu'une opération mathématique, il faut utiliser une procédure Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub XXX()
    ...
    End Sub
    Et si tu veux qu'elle s'applique à la modification d'une cellule alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Worksheet_Change(ByVal Target As Range) 'Ceci est une procédure spécifique qui s'active à tout changement du classeur
        If Not Application.Intersect(Target, Range("B2")) Is Nothing Then 'On lui demande de travailler que si la cellule B2 est modifiée (à adapter à ton besoin)
                 If Range("B2")="SMS" 'ta condition
                 ...                            ' ton code
                 Else 'Si "B2" n'est pas égal à SMS
                 ...                            ' ton code
                 End If
        End If
    End Sub
    Tu n'as plus besoin d'avoir de formule dans ta cellule (my_lign + 21, my_coll), vu que les conditions sont intégré dans la procédure.

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur d'étude
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'étude

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Par défaut
    Ha merci cela fait exactement ce que je veux sans surchargé la feuille !

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

Discussions similaires

  1. Modifier la mise en forme d'une PagingToolBar
    Par Crhys dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 17/01/2013, 12h40
  2. Réponses: 8
    Dernier message: 07/03/2009, 14h02
  3. Mise en forme d'une cellule en fonction de son contenu
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/01/2008, 10h42
  4. [GTK+] Modifier une liste via une fonction callback
    Par odsen.s dans le forum GTK+ avec C & C++
    Réponses: 12
    Dernier message: 03/05/2007, 17h33
  5. Réponses: 5
    Dernier message: 02/01/2007, 15h19

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