Appel d'une fonction au sein d'une autre
Résolu/Fermé
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
-
18 mars 2014 à 17:46
ecko772 Messages postés 9 Date d'inscription mardi 18 mars 2014 Statut Membre Dernière intervention 20 mars 2014 - 20 mars 2014 à 15:10
ecko772 Messages postés 9 Date d'inscription mardi 18 mars 2014 Statut Membre Dernière intervention 20 mars 2014 - 20 mars 2014 à 15:10
A voir également:
- Appel d'une fonction au sein d'une autre
- Fonction si et - Guide
- Appel anonyme - Guide
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- Renvoi d'appel ooredoo - Forum Mobile
14 réponses
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
Modifié par michel_m le 19/03/2014 à 07:04
Modifié par michel_m le 19/03/2014 à 07:04
Bonjour
moyenCoul.Value.Call moyenneCouleur(plage)
j'aurais plutôt écris
moyenCoul= Call moyenneCouleur(plage)
mais...
Voir l'aide sur Call
Michel
moyenCoul.Value.Call moyenneCouleur(plage)
j'aurais plutôt écris
moyenCoul= Call moyenneCouleur(plage)
mais...
Voir l'aide sur Call
Michel
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
19 mars 2014 à 10:03
19 mars 2014 à 10:03
Merci Michel pour ta réponse.
J'ai changé la logique et j'ai créé une seule macro. Voici le nouveau code
Public Function niveaucriticite(plage As Range) As Long
'Declaration des variables
Dim rouge As Integer
Dim vert As Integer
Dim orange As Integer
Dim cpt As Integer
Dim tt As Long
Dim moyenneDeCouleur As Long
Dim Couleur As Double
'rouge=3 vert=43 orange=45
Application.Volatile
For Each c In plage
cpt = cpt + 1
Couleur = c.Interior.ColorIndex
If Couleur = 3 Then 'rouge
c = 5
Else
If Couleur = 43 Then 'vert
c = 1
Else
If Couleur = 45 Then 'orange
c = 3
End If
End If
End If
tt = tt + c
Next c
moyenneDeCouleur = tt / cpt
For Each i In plage
If (1 <= moyenneDeCouleur <= 3) Then 'Colorer le fond des cellules sélectionnées en vert
Range("U" & i).Interior.Color = RGB(153, 204, 0) '43
Range("U" & i).Interior = "Criticité faible"
Else
If (3 < moyenneDeCouleur <= 4) Then 'Colorer le fond des cellules sélectionnées en orange
Range("U" & i).Interior.Color = RGB(255, 153, 0) '45
Range("U" & i).Interior = "Criticité moyenne"
Else
If (4 < moyenneDeCouleur) Then 'Colorer le fond des cellules sélectionnées en rouge
Range("U" & i).Interior.Color = RGB(255, 0, 0) '3
Range("U" & i).Interior = "Criticité haute"
End If
End If
End If
Next i
End Function
Maintenent le souci que j'ai c'est que je n'arrive pas à récupérer le code de la couleur de mes cellules en parcourant la plage, à chaque fois ile me sort le même code -4142 pour toutes les cellules sachant que la couleur change de l'une à l'autre: sur 8 cellules j'ai 3 fois vert, 3 fois rouge et 2 fois orange.
Merci pour ton aide
J'ai changé la logique et j'ai créé une seule macro. Voici le nouveau code
Public Function niveaucriticite(plage As Range) As Long
'Declaration des variables
Dim rouge As Integer
Dim vert As Integer
Dim orange As Integer
Dim cpt As Integer
Dim tt As Long
Dim moyenneDeCouleur As Long
Dim Couleur As Double
'rouge=3 vert=43 orange=45
Application.Volatile
For Each c In plage
cpt = cpt + 1
Couleur = c.Interior.ColorIndex
If Couleur = 3 Then 'rouge
c = 5
Else
If Couleur = 43 Then 'vert
c = 1
Else
If Couleur = 45 Then 'orange
c = 3
End If
End If
End If
tt = tt + c
Next c
moyenneDeCouleur = tt / cpt
For Each i In plage
If (1 <= moyenneDeCouleur <= 3) Then 'Colorer le fond des cellules sélectionnées en vert
Range("U" & i).Interior.Color = RGB(153, 204, 0) '43
Range("U" & i).Interior = "Criticité faible"
Else
If (3 < moyenneDeCouleur <= 4) Then 'Colorer le fond des cellules sélectionnées en orange
Range("U" & i).Interior.Color = RGB(255, 153, 0) '45
Range("U" & i).Interior = "Criticité moyenne"
Else
If (4 < moyenneDeCouleur) Then 'Colorer le fond des cellules sélectionnées en rouge
Range("U" & i).Interior.Color = RGB(255, 0, 0) '3
Range("U" & i).Interior = "Criticité haute"
End If
End If
End If
Next i
End Function
Maintenent le souci que j'ai c'est que je n'arrive pas à récupérer le code de la couleur de mes cellules en parcourant la plage, à chaque fois ile me sort le même code -4142 pour toutes les cellules sachant que la couleur change de l'une à l'autre: sur 8 cellules j'ai 3 fois vert, 3 fois rouge et 2 fois orange.
Merci pour ton aide
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
Modifié par michel_m le 19/03/2014 à 11:28
Modifié par michel_m le 19/03/2014 à 11:28
beaucoup de choses à dire sur ta fonction avec beaucoup de déclaration fausses...
mais pour l'instant
tes couleurs proviennent elles de mises en formes conditionnelles ?
Car les fonctions (indexcolor et autres)donnant la couleur ne fonctionnent que pour des mises en couleur manuelles..
c'est ce que j'ai fait sur ma maquette (couleur manuelle) et ca marche
mais pour l'instant
tes couleurs proviennent elles de mises en formes conditionnelles ?
Car les fonctions (indexcolor et autres)donnant la couleur ne fonctionnent que pour des mises en couleur manuelles..
c'est ce que j'ai fait sur ma maquette (couleur manuelle) et ca marche
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
19 mars 2014 à 11:55
19 mars 2014 à 11:55
Oui effectivement c'est des mises en formes conditionnelles :( parce que pour chaque cellule j'ai plusieurs choix de réponses.
Peux tu stp me dire comment faire ça aussi m'indiquer les fausses déclaration ?
Merci bcp Michel
Peux tu stp me dire comment faire ça aussi m'indiquer les fausses déclaration ?
Merci bcp Michel
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
19 mars 2014 à 12:30
19 mars 2014 à 12:30
Peux tu stp me dire comment faire ça
c'est sur la ou les valeurs ce qui a (ont)déclenché la MEFC qu'il faut
Peux tu stp me dire comment faire ça aussi m'indiquer les fausses déclaration ?
en début d'aprem , j'ai faim :o)
c'est sur la ou les valeurs ce qui a (ont)déclenché la MEFC qu'il faut
Peux tu stp me dire comment faire ça aussi m'indiquer les fausses déclaration ?
en début d'aprem , j'ai faim :o)
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
19 mars 2014 à 12:49
19 mars 2014 à 12:49
:) bn app
Regarde ce que j'ai fais pour récupérer la couleur de la MFC mais le pb c'est que je récupère que le vert alors que la couleur change d'une cellule à l'autre :s
vert-->rouge-->rouge-->orange...
For Each c In plage
cpt = cpt + 1
If c.FormatConditions(1).Interior.ColorIndex = 3 Then 'rouge
c = 5
Else
If c.FormatConditions(1).Interior.ColorIndex = 43 Then 'vert
c = 1
Else
If c.FormatConditions(1).Interior.ColorIndex = 45 Then 'orange
c = 3
End If
End If
End If
tt = tt + c
Next c
Regarde ce que j'ai fais pour récupérer la couleur de la MFC mais le pb c'est que je récupère que le vert alors que la couleur change d'une cellule à l'autre :s
vert-->rouge-->rouge-->orange...
For Each c In plage
cpt = cpt + 1
If c.FormatConditions(1).Interior.ColorIndex = 3 Then 'rouge
c = 5
Else
If c.FormatConditions(1).Interior.ColorIndex = 43 Then 'vert
c = 1
Else
If c.FormatConditions(1).Interior.ColorIndex = 45 Then 'orange
c = 3
End If
End If
End If
tt = tt + c
Next c
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
19 mars 2014 à 14:22
19 mars 2014 à 14:22
pour essayer de s'en sortir
mettre un extrait de ton classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
mais une fois la moyenne calculée, tu colories bien la plage suivant la moyenne obtenue ?
mettre un extrait de ton classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
mais une fois la moyenne calculée, tu colories bien la plage suivant la moyenne obtenue ?
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
19 mars 2014 à 14:38
19 mars 2014 à 14:38
Voici le lien généré
https://www.cjoint.com/?0CtoIxgLRjp
J'ai mis que des lettres comme valeurs mais c'est le même principe.
Pour ta 2em question, j'arrive pas à le faire :s j'ai utilisé ça comme code:
For Each i In plage
If (1 <= moyenneDeCouleur <= 3) Then 'Colorer le fond des cellules cibles en vert
Range("L" & i).Interior.Color = RGB(153, 204, 0) '43
Range("L" & i).Interior = "Criticité faible"
Else
If (3 < moyenneDeCouleur <= 4) Then 'Colorer le fond des cellules cibles en orange
Range("L" & i).Interior.Color = RGB(255, 153, 0) '45
Range("L" & i).Interior = "Criticité moyenne"
Else
If (4 < moyenneDeCouleur) Then 'Colorer le fond des cellules cibles en rouge
Range("L" & i).Interior.Color = RGB(255, 0, 0) '3
Range("L" & i).Interior = "Criticité haute"
End If
End If
End If
Next i
https://www.cjoint.com/?0CtoIxgLRjp
J'ai mis que des lettres comme valeurs mais c'est le même principe.
Pour ta 2em question, j'arrive pas à le faire :s j'ai utilisé ça comme code:
For Each i In plage
If (1 <= moyenneDeCouleur <= 3) Then 'Colorer le fond des cellules cibles en vert
Range("L" & i).Interior.Color = RGB(153, 204, 0) '43
Range("L" & i).Interior = "Criticité faible"
Else
If (3 < moyenneDeCouleur <= 4) Then 'Colorer le fond des cellules cibles en orange
Range("L" & i).Interior.Color = RGB(255, 153, 0) '45
Range("L" & i).Interior = "Criticité moyenne"
Else
If (4 < moyenneDeCouleur) Then 'Colorer le fond des cellules cibles en rouge
Range("L" & i).Interior.Color = RGB(255, 0, 0) '3
Range("L" & i).Interior = "Criticité haute"
End If
End If
End If
Next i
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
19 mars 2014 à 16:05
19 mars 2014 à 16:05
Je veux bien t'aider mais il faudrait que sois cohérent: les couleurs arrivent n'importe comment dans la feuille "évaluation"
un coup la première des plages ans arrive rouge, une autre fois vert, allieurs orange...
donc tu me files un truc correct où je puisse bosser c'est à dire toujours la m^me couleur suivant le rang dans la plage ans"x"
puis, comme c'est assez complexe, sois patient
je n'ai pas compris pourquoi un classeur au format .xlsm.xls (j'ai 2007)
Donc,j' attend mais...
un coup la première des plages ans arrive rouge, une autre fois vert, allieurs orange...
donc tu me files un truc correct où je puisse bosser c'est à dire toujours la m^me couleur suivant le rang dans la plage ans"x"
puis, comme c'est assez complexe, sois patient
je n'ai pas compris pourquoi un classeur au format .xlsm.xls (j'ai 2007)
Donc,j' attend mais...
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
19 mars 2014 à 16:39
19 mars 2014 à 16:39
En fait j'ai plusieurs ligne dans mon fichier initial mais j'ai laissé d'une seule ligne pour faire le test (ligne n°5)
La plage de test de la colonne D-->K
Le choix des valeurs dans ces cellules (liste déroulante) change leurs couleurs (MFC)
L'objectif est de remplir automatiquement la cellule L de mon fichier par la couleur et la valeur correspondantes (que L5 dans notre exemple)
Ouvert à toute proposition
Ici le lien vers le fichier avec le bon format
https://www.cjoint.com/?0CtqMxv2paY
mille merci
La plage de test de la colonne D-->K
Le choix des valeurs dans ces cellules (liste déroulante) change leurs couleurs (MFC)
L'objectif est de remplir automatiquement la cellule L de mon fichier par la couleur et la valeur correspondantes (que L5 dans notre exemple)
Ouvert à toute proposition
Ici le lien vers le fichier avec le bon format
https://www.cjoint.com/?0CtqMxv2paY
mille merci
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
Modifié par michel_m le 19/03/2014 à 19:00
Modifié par michel_m le 19/03/2014 à 19:00
bon, je n'ai pas lu ton dernier lien(10) car occupé
dans la feuille cricité les valeurs dans validation de données sont dans cet ordre rouge, Orange, Vert renvoi d'une valeur 5,3,1
c'est dans cette ligne
evaluer_couleur = Choose(cptr, 5, 3, 1, 0, 0, 0) 'DONNER VALEUR AUX 3 DERNIERS
à toi de voir pour les validations à 4 et 6 données
s'il n'y a pas de criticitidé, tu peux laisser la cellule vide
Dans L5 voici ce que l'ai marqué pour prendre en compte la ligne
=evaluer_critic("=ligne()")
Michel
dans la feuille cricité les valeurs dans validation de données sont dans cet ordre rouge, Orange, Vert renvoi d'une valeur 5,3,1
c'est dans cette ligne
evaluer_couleur = Choose(cptr, 5, 3, 1, 0, 0, 0) 'DONNER VALEUR AUX 3 DERNIERS
à toi de voir pour les validations à 4 et 6 données
s'il n'y a pas de criticitidé, tu peux laisser la cellule vide
Option Explicit
'----
Function evaluer_critic(Lig) As String
Dim Col As Byte
Dim Total As Integer, Moyenne As Integer
For Col = 4 To 11
Total = Total + evaluer_couleur(Range("Ans" & Col - 3), Cells(5, Col))
Next
Moyenne = CInt(Total / 8)
Select Case Moyenne
Case Is <= 3
evaluer_critic = "Criticité faible"
Case Is <= 4
evaluer_critic = "Criticité moyenne"
Case Else
evaluer_critic = "Criticité haute"
End Select
End Function
'-----
Function evaluer_couleur(Ans_x As Range, indic As Range) As Byte
Dim Nbre As Byte
Dim T_ans(), cptr As Byte
T_ans() = Application.Transpose(Ans_x)
If IsEmpty(indic) Then
evaluer_couleur = 0
Exit Function
End If
For cptr = 1 To UBound(T_ans)
If indic = T_ans(cptr) Then
evaluer_couleur = Choose(cptr, 5, 3, 1, 0, 0, 0)
Exit For
End If
Next
End Function
Dans L5 voici ce que l'ai marqué pour prendre en compte la ligne
=evaluer_critic("=ligne()")
Michel
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
19 mars 2014 à 19:00
19 mars 2014 à 19:00
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
Modifié par michel_m le 20/03/2014 à 08:05
Modifié par michel_m le 20/03/2014 à 08:05
bonjour,
Je vais t'envoyer une modif de "evaluer_couleur" indépendant de l'ordre dans les plage ans_x
un peu de patience
je reste sur le 1° fichier
Je vais t'envoyer une modif de "evaluer_couleur" indépendant de l'ordre dans les plage ans_x
un peu de patience
je reste sur le 1° fichier
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
20 mars 2014 à 09:22
20 mars 2014 à 09:22
Voilà les codes modifiés
evaluer_couleur comporte 8 possibilités pour éventuelle évolution du nombre de variable . A de toi de vérifier si les couleurs sont les bonnes...
appel fonction colonne L
=evaluer_critic(LIGNE())
La maquette:
https://www.cjoint.com/?DCujvMECPsP
Option Explicit '---- Function evaluer_critic(Lig) As String Dim Col As Byte, Cas As Byte Dim Total As Integer, Moyenne As Integer 'ligne vide If Application.CountA(Range(Cells(Lig, 4), Cells(Lig, 11))) = 0 Then evaluer_critic = "" Exit Function End If For Col = 4 To 11 Cas = Col - 3 Total = Total + evaluer_couleur(Range("Ans" & Cas), Cas, Cells(5, Col)) Next Moyenne = CInt(Total / 8) Select Case Moyenne Case Is <= 3 evaluer_critic = "Criticité faible" Case Is <= 4 evaluer_critic = "Criticité moyenne" Case Else evaluer_critic = "Criticité haute" End Select End Function '----- Function evaluer_couleur(Ans_x As Range, cas_a As Byte, indic As Range) As Byte Dim Nbre As Byte Dim T_ans(), cptr As Byte Dim Nom As String T_ans() = Application.Transpose(Ans_x) If IsEmpty(indic) Then evaluer_couleur = 0 Exit Function End If For cptr = 1 To UBound(T_ans) If indic = T_ans(cptr) Then Select Case cas_a Case 1 '5=rouge, 3=orange, 1=vert, 0=rien ou NA evaluer_couleur = Choose(cptr, 5, 1, 0, 0, 0, 0, 0, 0) Case 2 evaluer_couleur = Choose(cptr, 5, 0, 1, 0, 0, 0, 0, 0) Case 3 evaluer_couleur = Choose(cptr, 5, 1, 0, 0, 0, 0, 0, 0) Case 4 evaluer_couleur = Choose(cptr, 5, 3, 1, 0, 0, 0, 0, 0) Case 5 evaluer_couleur = Choose(cptr, 5, 3, 1, 0, 0, 0, 0, 0) Case 6 evaluer_couleur = Choose(cptr, 5, 3, 1, 0, 0, 0, 0, 0) Case 7 evaluer_couleur = Choose(cptr, 1, 3, 5, 5, 5, 5, 0, 0) Case 8 evaluer_couleur = Choose(cptr, 1, 3, 5, 0, 0, 0, 0, 0) End Select Exit For End If Next End Function
evaluer_couleur comporte 8 possibilités pour éventuelle évolution du nombre de variable . A de toi de vérifier si les couleurs sont les bonnes...
appel fonction colonne L
=evaluer_critic(LIGNE())
La maquette:
https://www.cjoint.com/?DCujvMECPsP
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
20 mars 2014 à 13:14
20 mars 2014 à 13:14
Parfait Michel, C'est exactement ça sauf que quand je fais le test sur les autres lignes ça me prend toujours la valeur de la première ligne :s:s
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
20 mars 2014 à 14:48
20 mars 2014 à 14:48
JE VIENS D'ESSAYER SUR D'AUTRE LIGNES ET CA FONCTIONNE !!! :-((
JE T'ai POURTANT INDIQUER LA SYNTAXE
=evaluer_critic(LIGNE())
qu'est que c'est que s:s je n'ai jamais écrit ça dans mon code
Abandon de l'aide
JE T'ai POURTANT INDIQUER LA SYNTAXE
=evaluer_critic(LIGNE())
qu'est que c'est que s:s je n'ai jamais écrit ça dans mon code
Abandon de l'aide
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
20 mars 2014 à 14:58
20 mars 2014 à 14:58
Dzl Michel je sais que je t'embête mais dans le test If indic = T_ans(cptr) Then, la variable indic ne change pas d'une ligne à autre par ex si c'était "a" dans la cellule D5 et "b" dans D6 elle retourne a. :(
Pour la syntaxe que tu m'a indiquée, j'ai fais la même chose
Pour la syntaxe que tu m'a indiquée, j'ai fais la même chose
ecko772
Messages postés
9
Date d'inscription
mardi 18 mars 2014
Statut
Membre
Dernière intervention
20 mars 2014
20 mars 2014 à 15:10
20 mars 2014 à 15:10
C'est bon j'ai trouvé il faut changer "5" par "Lig" dans l'instruction
Total = Total + evaluer_couleur(Range("Ans" & Cas), Cas, Cells(5, Col))
Merci Michel
Total = Total + evaluer_couleur(Range("Ans" & Cas), Cas, Cells(5, Col))
Merci Michel