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 :

Problème de format de cellules imposés dans une procédure évènementielle [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème de format de cellules imposés dans une procédure évènementielle
    Bonjour à tous.

    J'aimerais écrire une petite procédure évènementielle qui me permette d'imposer un format dans une cellule dès qu'on en change la valeur. Je m'explique :

    J'ai une plage de cellule concernée, disons sur ma Feuil1, la plage A1:H5
    Toutes les données à entrer dans cette plage sont numériques (nombres compris entre 0 et 50)

    J'aimerais, lorsque je rentre une valeur dans la première ligne de ma plage (donc dans une des cellules A1 à H1), que le format du nombre affiche 3 décimales si la valeur est strictement inférieure à 1, et que le format reste en standard si le nombre entré est supérieur ou égal à 1.

    Jusque là, j'ai réussi à me débrouiller, j'ai écris ce petit bout de code qui fonctionne (peut-être existe t-il quelque chose de plus simple encore ? )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim Ligne1 As Range
     
    Set Ligne1 = Range("A1:H1")
     
    For Each cell In Ligne1
        If cell < 1 Then
            cell.NumberFormat = "0.000"
        Else: cell.NumberFormat = "General"
        End If
    Next
     
    End Sub

    Mais là où ça se complique pour moi, c'est que je veux appliquer un format imposé dans les lignes du reste de la plage (donc la plage A2:H5) en fonction du nombre entré dans la première ligne. Un exemple sera plus parlant :

    Si j'entre le nombre 0,5 dans la cellule A1 (qui s'affichera donc "0,500"), je veux que toutes les cellules de ma plage sous cette cellule A1 (donc A2 à A5) s'affichent avec une décimale, et si le nombre entré en A1 est une autre valeur que 0,5, les cellules A2 à A5 s'affichent sans décimales. Et ce, pour chaque colonne de ma plage dont le format sera dépendant du nombre entré dans la première cellule de la colonne correspondante.

    J'ai écris un bout de code à la suite de celui indiqué plus haut avec des boucles for... next, ça fonctionne mais c'est relativement long (ma plage est beaucoup plus grande dans la réalité que celle que j'indique plus haut) et je me demandais s'il n'était pas possible d'utiliser une autre méthode comme for each ... ou un tableau à deux dimensions peut-être ... mais là, mes connaissances sont assez limitées.

    Je vous remercie par avance de l'aide ou des conseils que vous pourrez m'apporter.

    Joloma

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Plage As Range
     
    If Target.Count = 1 Then
       Set Plage = Range("A1:H5")
       If Not Intersect(Target, Plage.Rows(1)) Is Nothing Then
          If Target.Value < 1 Then
             Intersect(Target.EntireColumn, Plage).NumberFormat = "0.000"
          Else
             Intersect(Target.EntireColumn, Plage).NumberFormat = "General"
          End If
       End If
       Set Plage = Nothing
    End If
    End Sub

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour votre aide, Mercatog. Je ne maîtrisais pas beaucoup l'instruction Intersect, mais je vois que c'est très pratique.

    Cependant, ce n'est pas tout à fait ce que je recherchais. En fait, je veux garder le format dans la première ligne (3 décimales si le nombre est inférieur à 1 et format standard si >=1) et ne changer le format des nombres que j'entre dans les cellules qu'à partir de la deuxième ligne et en fonction du nombre de la première ligne pour chaque colonne. Si je rentre le chiffre 0,5 dans la première ligne, le format des cellules de la colonne en dessous s'affiche avec 1 décimale, sinon ce sera sans décimales.

    Comme je conçois que mes explications n'étaient pas très claires, je me suis permis de modifier un peu votre code et je suis arrivé à obtenir ce que je voulais. Voici le code modifié :

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Plage, Ligne1 As Range
     
    If Target.Count = 1 Then
        Set Ligne1 = Range("A1:H1")
        Set Plage = Range("A2:H5")
     
        If Not Intersect(Target, Ligne1.Rows(1)) Is Nothing Then
            If Target.Value < 1 Then
                Intersect(Target.Cells, Ligne1).NumberFormat = "0.000"
            Else
                Intersect(Target.Cells, Ligne1).NumberFormat = "General"
            End If
            If Target.Value = 0.5 Then
                Intersect(Target.EntireColumn, Plage).NumberFormat = "0.0"
            Else
                Intersect(Target.EntireColumn, Plage).NumberFormat = "0"
            End If
        End If
        Set Plage = Nothing
    End If
     
    End Sub
    Voilà. Cela dit, il y'a peut-être encore mieux, bien que pour moi, ça m'aille très bien.

    En tout cas, un grand merci à vous car je ne voyais pas comment faire et votre code m'a vraiment bien aidé. Merci beaucoup.

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Des remarques s'imposent
    - Dans les déclarations, il faut décalarer chaque variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Plage As Range, Ligne1 As Range
    - Ligne1 est composée d'une seule ligne, donc pas besoin d'indiquer la 1ère ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Intersect(Target, Ligne1) Is Nothing Then
    Une autre proposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Plage As Range
    Dim Frm As String
     
    If Target.Count = 1 Then
       Set Plage = Range("A1:H5")
       If Not Intersect(Target, Plage.Rows(1)) Is Nothing Then
          Target.NumberFormat = IIf(Target.Value < 1, "0.000", "General")
          Frm = IIf(Cells(Plage.Row, Target.Column).Value = 0.5, "0.0", "0")
          Plage.Offset(1, Target.Column - Plage.Column).Resize(Plage.Rows.Count - 1, 1).NumberFormat = Frm
       End If
       Set Plage = Nothing
    End If
    End Sub

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

Discussions similaires

  1. [XL-2007] Problème de format de nombre à virgule dans une liste de validation
    Par basto dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/05/2014, 15h03
  2. Réponses: 5
    Dernier message: 16/05/2014, 14h38
  3. [AC-2003] SQL dans une procédure évènementielle en VBA
    Par Kaera dans le forum VBA Access
    Réponses: 5
    Dernier message: 16/03/2012, 08h48
  4. [XL-2007] Problème Macro. Récupération de l'année dans une cellule
    Par PC1967 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/02/2010, 11h08
  5. Probleme de format ecriture en "exposant" dans une cellule
    Par fmris dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/06/2009, 12h41

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