Test sur des cellules dans différentes feuilles

alphoe Messages postés 7 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 22 juin 2011 - 21 juin 2011 à 10:53
alphoe Messages postés 7 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 22 juin 2011 - 22 juin 2011 à 14:40
Bonjour à tous, je me présente, je suis élève ingénieur et j'aimerais avoir quelques renseignements au niveau de la programmation sous excel en VBA.

Dans mon fichier excel, j'ai une feuille pour chaque mois (Janvier, Février, ..., Décembre) et une feuille récapitulative. Dans cette dernière, il me faut aller vérifier des conditions dans les 12 feuilles des mois.

Exemple : Pour la case C6 de la dernière feuille, je dois faire un test de la case C6 dans chaque feuille des mois.
Soit l'une d'elle est bleue avec rien à l'intérieur, et je marque alors dans ma case "Prévu en "nom du mois correspondant à la feuille"".
Soit l'une d'elle est bleue avec x ou X et je marque "Réalisé en "nom du mois correspondant à la feuille"".
Autrement je ne marque rien.

Ce que j'ai fait, c'est de rentrer 12 cibles correspondants au 12 feuilles des mois (Cible1,...,Cible12) et oRef As Range qui correspondant à une case référence portant la couleur bleue.


Les pb sont : je suis censé vérifier qu'une case par feuille mais je suis en range et j'ai mis un for each o alors qu'il n'y en a qu'un par feuille.
Je ne sais pas si le Range est approprié ici.
Est-ce que l'on peut mettre plusieurs
Next
Res = i
dans une seule fonction, est-ce là le pb ?

Cela me marque Valeur#, donc c'est sur qu'il y a des pb dans ma fonction, mais je ne sais pas les résoudre.

Voilà ma fonction :


Function Res(Cible1 As Range, Cible2 As Range, Cible3 As Range, Cible4 As Range, Cible5 As Range, Cible6 As Range, Cible7 As Range, Cible8 As Range, Cible9 As Range, Cible10 As Range, Cible11 As Range, Cible12 As Range, oRef As Range) As String
Dim o, i%, k%
Application.Volatile
k = oRef.Interior.ColorIndex

For Each o In Cible1
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Janvier"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Janvier"
Next
Res = i

For Each o In Cible2
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


For Each o In Cible3
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


For Each o In Cible4
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i

For Each o In Cible5
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i

For Each o In Cible6
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


For Each o In Cible7
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i

For Each o In Cible8
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


For Each o In Cible9
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


For Each o In Cible10
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


For Each o In Cible11
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


For Each o In Cible12
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then i = "Réalisé en Février"
If o.Interior.ColorIndex k And o "" Then i = "Prévu en Février"
Next
Res = i


End Function



Merci pour vos réponses

10 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
21 juin 2011 à 11:48
Bonjour,

Rien n'interdit d'imbriquer des boucles For

Mais, avant même de continuer à examiner ton code qui, non indenté, me donne le torticolis :
Tes cible1, cible2, etc ... sont lourdes pour rien !

Commence par analyser ce que fait ceci :
Dim feuille As Worksheet
For i = 1 To 2
Set feuille = Worksheets(StrConv(MonthName(i), vbProperCase))
MsgBox feuille.Name
Next

sers-t-en et reviens avec un code indenté s'en servant.

et interroge-toi sur ce que retourne ta fonction res (puisque tu en changes la valeur sans cesse avant la fin de ta fonction et que, donc, le dernier res à "parler" sera le seul qui sera retourné ! )
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
alphoe Messages postés 7 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 22 juin 2011
21 juin 2011 à 11:59
Merci pour ta réponse, je vais analyser ton morceau de code.

Bertrand.
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
21 juin 2011 à 12:08
Bien,

maintenant : tu as écrit :
faire un test de la case C6 dans chaque feuille des mois.
Soit l'une d'elle est bleue avec rien à l'intérieur, et je marque alors dans ma case "Prévu en "nom du mois correspondant à la feuille"".
Soit l'une d'elle est bleue avec x ou X et je marque "Réalisé en "nom du mois correspondant à la feuille"".
Autrement je ne marque rien.

pour chaque feuille, donc :
- tu n'as qu'à lire QUE la cellule C6 et non (comme tu le fais) lire en boucle toutes les cellules de la feuille !
- puisqu'il suffit d'un seul cas ("une d'elle")
--- un select case serait bienvenu
--- inutile de continuer la boucle for (de tes feuilles) dès que tu es dans l'un des cas.
vas-y calmement, maintenant (c'est plus une question de logique que de quoi nque ce soit d'autre).


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
alphoe Messages postés 7 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 22 juin 2011
21 juin 2011 à 12:17
Alors je viens d'essayer ton code.
Voilà où j'en suis niveau raisonnement.

Dim feuille As Worksheet
For i = 1 To 2
Set feuille = Worksheets(StrConv(MonthName(i), vbProperCase))
MsgBox feuille.Name
Next

On fabrique un groupe gràce à worksheets et à l'incrémentation des i. Donc en mettant For i = 1 to 12, on arrive à avoir tous les mois compris dans feuille.

feuille.name pointe vers le nom des différentes feuilles prises entre 1 et 12, donc les mois dans mon cas.
J'obtiens donc une fenêtre pour chaque mois, se mettant l'une après l'autre.

Au niveau du res, il change (ou pas) tout au long du code. Si les conditions ne sont pas vrais, le res ne change pas normalement.

Après, je ne sais pas comment pointer vers la seconde feuille par exemple. J'ai essayé de faire dire seulement février


Dim feuille As Worksheet
For i = 1 To 12
Set feuille = Worksheets(StrConv(MonthName(i), vbProperCase))
Res = feuille.Name[color=red].2
Next /color

Mais ce n'est pas la bonne syntaxe. Enfin, comment fait-on pour cibler une case en particulier?
Que veut dire vbProperCase ??

Voilà :)

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
alphoe Messages postés 7 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 22 juin 2011
21 juin 2011 à 12:59
Alors pour moi un bon code serait :


Function Res() As String
Dim o, i%, k%
Dim j As String
Application.Volatile
k = oRef.Interior.ColorIndex

Dim feuille As Worksheet
For i = 1 To 12
Set feuille = Worksheets(StrConv(MonthName(i), vbProperCase))


For Each o In feuille

Select Case o
Case C6
If o.Interior.ColorIndex k And (o "x" Or o = "X") Then j = feuille.Name

Case Else
j = "rien"

End Select
Next
Next
Res = j



End Function

ça ne marche pourtant pas
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
21 juin 2011 à 14:15
Res = feuille.Name.2

Non !
je n'avais utilisé la propriété Name que pour te montrer qu'on parcourait bien, une par une, tes feuilles/mois ! Tu n'as pas à utiliser du tout cette propriété !
pour te référer à la cellule C6 de chaque feuille !

Voici comment on se réfère à la cellule C6 de chaque objet feille :
feuille.Range("C6")
et ensuite (après la 2ème parenthèse :
.toute_propriété_ton_choix à lire !

Mais plus les choses avancent, plus j'ai l'impression qu'il me faudra écrire la totalité de ton code (et ce n'est pas du tout mon approche d'une aide sur un forum où les intervenants connaissent au moins les bases essentielles).
Désolé, mais j'arrête là ma participation.
____________________
[color=green]Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
alphoe Messages postés 7 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 22 juin 2011
21 juin 2011 à 15:17
Pas de soucis, tu m'as déjà aiguillé, je te remercie.
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
22 juin 2011 à 09:03
Bon...
J'ai finalement choisi d'écrire, mais en commentant très largement pour te permettre de suivre, adapter au besoin, etc ...
Function Res() As String
  Dim feuille As Worksheet
  Res = ""
  For i = 1 To 12 'on passe en revue, une par une, les 12 feuilles/mois
    Set feuille = Worksheets(StrConv(MonthName(i), vbProperCase))
    'Feuille est un objet feuille de calcul .
    ' exemple ; Quand i = 3, on traite pla feuille de calcul nommée "Mars
    '===================================================================
    'on va maintenant regarder ce que contient la cellule C6 dee la feuille traitée
    'et décider en foction de sa couleur et de sa valeur
    ' supposons que soit une variable numérique déclarée publique
    'quelque part et à laquelle une valeur/couleur a été attribuée :
    If feuille.Range("C6").Interior.ColorIndex = k Then
       'j'utilise Ucase pour traiter à la fois nles "x" et les "X"
       Select Case UCase(feuille.Range("C6").Value)
         Case "X"
            Res = "Réalisé en " & feuille.Name
         Case ""
            Res = "Prévu en " & feuille.Name
       End Select
       Exit For ' ce n'est pas la peine de continuer ma boucle !
    End If
  Next
End Function


Maintenant : tes explications ne sont pas complètes, mais si la formule devait :
- s'appliquer à une cellule (par exemple D10) de ta feuille récapitulative et considérer la cellule correspondante (D10, donc) de tes feuilles mois, Il serait bien évidemment judicieux de passer à la fonction la cellule la contenant.
Et alors ===>>
Function Res(lacellule) As String
  Dim feuille As Worksheet
  Res = ""
  For i = 1 To 12
    Set feuille = Worksheets(StrConv(MonthName(i), vbProperCase))
    If feuille.lacellule.Interior.ColorIndex = k Then
      Select Case  Case(feuille.lacellule.Value)
         Case "X"
            Res = "Réalisé en " & feuille.Name
         Case ""
            Res = "Prévu en " & feuille.Name
       End Select
       Exit For
    End If
  Next
End Function

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
22 juin 2011 à 09:55
Correction pour mon code "général" :
C'est l'adresse de la cellule qu'il faut alors utiliser, ainsi :
Function res(adresse As String) As String
  Application.Volatile
  Dim feuille As Worksheet
  res = ""
  For i = 1 To 12
    Set feuille = Worksheets(StrConv(MonthName(i), vbProperCase))
    If feuille.Range(adresse).Interior.ColorIndex = 10 Then
       Select Case UCase(feuille.Range(adresse).Value)
         Case "X"
            res = "Réalisé en " & feuille.Name
         Case ""
            res = "Prévu en " & feuille.Name
       End Select
       Exit For
    End If
  Next
End Function

et la formule à mettre dans la celule est alors du type (exemple pour la cellule D9) :
=res("C14") 



____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
alphoe Messages postés 7 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 22 juin 2011
22 juin 2011 à 14:40
Ah, je m'y attendais pas! Mille fois merci ça convient parfaitement à ce que je cherchais. C'est super.

Bertrand.
Rejoignez-nous