Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/08/2011, 10h00   #1
Invité régulier
 
Inscription : avril 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 28
Points : 7
Points : 7
Par défaut Sommer les cellules écrites en noir

Bonjour,

J'ai un fichier avec des plages de données allant de D17 à O25, de D30 à O35 et de D40 à O43, certaines données peuvent être écrite en noir si elles sont définitives, d'autres écrites en rouge si elles sont prévisionnelles.

Je souhaite faire deux sommes, la première prévisonnelle donc qui additionne le noir et le rouge, celle ci pas de problème.
La deuxième réelle en additionnant seulement les sommes en noir, c'est là que je coince.

J'ai lu plusieurs codes pouvant marcher mais vu qu'il n'y avait d'explication avec j'ai pas réussi à les adapter.

Pourriez vous m'aider s'il vous plait ?
chipster008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 11h05   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Citation:
Envoyé par chipster008 Voir le message
J'ai lu plusieurs codes pouvant marcher mais vu qu'il n'y avait d'explication avec j'ai pas réussi à les adapter.
Bonjour,

D'où l'inefficacité voire le danger de recopier des bouts de code trouvés sur le net sans les comprendre. Je ne te fais pas la morale, mais il vaut mieux prendre un peu de temps pour se familiariser avec les bases de VB (via les tutos disponibles sur ce site par exemple) pour comprendre ce que l'on fait...l'investissement est bien plus rentable, je pense.

Pour en revenir à tes moutons:

-Il faut que tu définisse dans VBA la plage de cellules susceptibles de contenir tes données écrites en noir.
-Il faut définir une variable pour stocker le total de tes cases noires

Et après, parcourir toutes tes cellules et augmenter la valeur du total si la police de la cellule est noire. En pratique (essaie de comprendre le code et pose des questions si ce n'est pas le cas):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Sub totalCellulesNoires()
 
Dim maPlage As Range 'Définition une plage de cellules (qui pour le moment ne représente rien)
    Set maPlage = Union(Range("D17:O25"), Range("D30:O35"), Range("D40:O43")) 'Initialisation de la plage de cellules (on y met celles qui nous intéressent)
 
Dim totCellNoires As Double
    totCellNoires = 0
 
Dim maCellule As Range
For Each maCellule In maPlage 'Ceci est une énumération qui permet de prendre une par une une toutes les cellules contenues dans maPlage
 
    If maCellule.Font.ColorIndex = 1 Then totCellNoires = totCellNoires + maCellule.Value 'Test si la police est noire et si c'est le cas, incrémente le total de la valeur de la cellule
 
Next maCellule
 
'Pour marquer le résultat dans une cellule
 
Range("réf de ta cellule").Value = totCellNoires
 
End Sub
Ça devrait fonctionner (mais je n'ai pas testé donc c'est pas garanti)...
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 11h59   #3
Invité régulier
 
Inscription : avril 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 28
Points : 7
Points : 7
Bonjour,

Je sais que ce n'est pas la bonne méthode, mais même si les tutoriels du forum sont super bien fait, c'est un peu dur à appliquer d'un coup. Mais c'est clair qu'ils sont très secourables de temps en temps.

Le code ne marche pas il m'affiche 0. Je pense que ça vient du fait qu'on définit totCellsNoires pâr 0 et que la fin on lui demande de nous donner totCellsNoires, non ?

En tout cas merci pour ce code très détaillé, c'est beaucoup plus pratique pour une novice comme moi.
chipster008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 12h49   #4
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Citation:
Envoyé par chipster008 Voir le message
Le code ne marche pas il m'affiche 0. Je pense que ça vient du fait qu'on définit totCellsNoires pâr 0 et que la fin on lui demande de nous donner totCellsNoires, non ?
Non car la ligne suivante permet (en théorie) de rajouter la valeur contenue dans la cellule à totCellNoires chaque fois que la condition "la police est noire" est bien vérifiée:

Code :
If maCellule.Font.ColorIndex = 1 Then totCellNoires = totCellNoires + maCellule.Value
Mais en fait ici c'est la condition qui n'est justement pas bonne (je n'avais pas vérifié...).

Voici un code qui marche avec une ou deux améliorations:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub totalCellulesNoires()
 
Dim maPlage As Range
    With ActiveSheet
    Set maPlage = Union(.Range("D17:O25"), .Range("D30:O35"), .Range("D40:O43"))
    End With
 
Dim totCellNoires As Double
    totCellNoires = 0
 
Dim maCellule As Range
For Each maCellule In maPlage
 
    If maCellule.Font.Color = 0 Then totCellNoires = totCellNoires + maCellule.Value
 
Next maCellule
 
Range("réf de la cellule que tu veux").Value = totCellNoires
 
End Sub

As-tu bien compris comment fonctionne ce code?
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/08/2011, 17h17   #5
Invité régulier
 
Inscription : avril 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 28
Points : 7
Points : 7
Oui je pense par contre qu'est ce que le activesheet amène en plus ?

Merci de ta patience
chipster008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 17h25   #6
Membre actif
 
Homme
Étudiant
Inscription : août 2011
Messages : 126
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : août 2011
Messages : 126
Points : 183
Points : 183
Bonjour,
Je me permet de poser une question à sclarckone.Pouvez expliquez la nuance entre les deux codes ?
Merci d'avance et vive le Forum
erlerwade est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 17h52   #7
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Citation:
Envoyé par chipster008 Voir le message
Oui je pense par contre qu'est ce que le activesheet amène en plus ?
C'est pour lever une possible ambigüité (potentielle source d'erreur dans des cas plus complexes).

Cela vient du modèle objet d'Excel. Du point de vue programmation, Excel est considérée comme une application dans laquelle peuvent être ouverts plusieurs fichiers (chaque fichier est un Workbook et l'ensemble de ces fichiers est regroupé dans la collection Workbooks).
Chaque Workbook contient des feuilles de calcul (Worksheet/Worksheets) et des feuilles graphiques (Chart/Charts) qui sont toutes contenues dans la collection Sheets (mais il n'y a pas d'objet Sheet car il y aurait ambigüité: Workbook ou Chart?).

Lorsque dans mon code j'initialise l'objet maPlage avec des Range("D17:O25") (...etc.), "VBA" ne sait pas à quelle feuille appartiennent les plages que je rajoute!

Je pense qu'automatiquement il considère que ce sont celles de la feuille activée. Mais dans le cas où la macro ne serait pas appelée depuis la feuille où l'on veut que les actions soient réalisées, ça ne marcherait pas (les actions seraient bien réalisées, mais sur la mauvaise feuille).

Donc utiliser ActiveSheet permet de lever l'ambigüité en précisant qu'on veut travailler avec la feuille sur laquelle on se trouve. Si l'on voulait réaliser des actions sur une autre feuille que la feuille active, on pourrait alors la désigner par Sheets("nom de la feuille").

Citation:
Envoyé par erlerwade Voir le message
Je me permet de poser une question à sclarckone.Pouvez expliquez la nuance entre les deux codes ?
La nuance est celle que j'explique dans le post précédent (au sujet d'ActiveSheet).

J'avais aussi corrigée la condition de test (entre le If et le Then) qui ne fonctionnait pas pour tester si la police de la couleur est bien noire.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/08/2011, 08h42   #8
Invité régulier
 
Inscription : avril 2011
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 28
Points : 7
Points : 7
Merci beaucoup pour le code et surtout tes explications. C'est super de ta part.
chipster008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h52.


 
 
 
 
Partenaires

Hébergement Web