A voir également:
- VBA Excel : Recherche conditionnelle couleur
- Liste déroulante excel - Guide
- Formule excel - Guide
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Mise en forme conditionnelle excel - Guide
8 réponses
Bonjour Eric,
Oui désolé, c'est un peu cavalier en effet, c'était ma première consultation sur des forums, je n'avais pas conscience de la qualité et la rapidité des réponses et je n'étais pas sûr de recevoir des réponses.
Je dois mettre en place mon nouveau système de plannication, restauration, transport et facturation la semaine prochaine.
Merci encore.
A toute fin utile, voilà le lien :
https://codes-sources.commentcamarche.net/#5
Au départ la fonction Application.Volatile True était inclus dans près d'1 milliers de fonction VBA à l'intérieur des fonctions VBA.
A chaque saisie, Excel recalculait toutes ces fonctions. Au finale, cela durait plusieurs minute.
En remplaçant Application.Volatile True par Application.Calculation = xlManual (en lieu et place), Excel recalcule 1 première fois et cela durée longtemps, puis il recalcule que les fonctions concernées par un changement (du moins c'est ce que j'ai constaté).
Par soucis de durée de calcul, je n'ai pas pris en compte votre solution. En y réfléchissant, j'ai imbrique la fonction index dans une fonction ColorCell() et j'ai calculé les N°ligne et Colonne dans d'autres cellule.
Le code de la fonction ColorCell est la suivant :
Function ColorCell(C As Object)
Application.Calculation = xlmanual
ColorCell = Abs(C.Interior.ColorIndex)
End Function
A bientôt
Hervé
Oui désolé, c'est un peu cavalier en effet, c'était ma première consultation sur des forums, je n'avais pas conscience de la qualité et la rapidité des réponses et je n'étais pas sûr de recevoir des réponses.
Je dois mettre en place mon nouveau système de plannication, restauration, transport et facturation la semaine prochaine.
Merci encore.
A toute fin utile, voilà le lien :
https://codes-sources.commentcamarche.net/#5
Au départ la fonction Application.Volatile True était inclus dans près d'1 milliers de fonction VBA à l'intérieur des fonctions VBA.
A chaque saisie, Excel recalculait toutes ces fonctions. Au finale, cela durait plusieurs minute.
En remplaçant Application.Volatile True par Application.Calculation = xlManual (en lieu et place), Excel recalcule 1 première fois et cela durée longtemps, puis il recalcule que les fonctions concernées par un changement (du moins c'est ce que j'ai constaté).
Par soucis de durée de calcul, je n'ai pas pris en compte votre solution. En y réfléchissant, j'ai imbrique la fonction index dans une fonction ColorCell() et j'ai calculé les N°ligne et Colonne dans d'autres cellule.
Le code de la fonction ColorCell est la suivant :
Function ColorCell(C As Object)
Application.Calculation = xlmanual
ColorCell = Abs(C.Interior.ColorIndex)
End Function
A bientôt
Hervé
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 303
29 déc. 2009 à 19:15
29 déc. 2009 à 19:15
Bonsoir
si couleur de la celllule non issue d'une MEFC
si couleur de la celllule non issue d'une MEFC
Function dire_couleur(lig As Long, col As Byte) dire_couleur = Cells(lig, col).Interior.ColorIndex End Function Sub test() MsgBox dire_couleur(5, 6) 'cellule F5 End Sub
Bonsoir Michel,
Merci pour votre réponse rapide.
Cette fonction prend telle en compte une plage de cellule?
Je ne vois que le n°ligne + n°colonne.
J'ai trouvé une solution en imbriquant la fonction Index() dans la fonction ColorCell().
Ca marche, c'est un peu lourd et excel met du temps à calculer.
En faite, j'ai un planning annuel de présence et d'activité de près de 120 personnes dans 6 ateliers différents et je souhaite obtenir les effectif journaliers des repas dans 9 lieux différents.
Pour l'année 2010, j'ai revu et simplifié le système en utilisation les couleurs (9) des cellules pour définir les lieux de restaurations.
J'y suis arrivé mais les fichiers sont lourds et le temps de calcul est long.
Est-il possible de simplifier ou d'accéler le calcul ?
Merci par avance.
Hervé
Merci pour votre réponse rapide.
Cette fonction prend telle en compte une plage de cellule?
Je ne vois que le n°ligne + n°colonne.
J'ai trouvé une solution en imbriquant la fonction Index() dans la fonction ColorCell().
Ca marche, c'est un peu lourd et excel met du temps à calculer.
En faite, j'ai un planning annuel de présence et d'activité de près de 120 personnes dans 6 ateliers différents et je souhaite obtenir les effectif journaliers des repas dans 9 lieux différents.
Pour l'année 2010, j'ai revu et simplifié le système en utilisation les couleurs (9) des cellules pour définir les lieux de restaurations.
J'y suis arrivé mais les fichiers sont lourds et le temps de calcul est long.
Est-il possible de simplifier ou d'accéler le calcul ?
Merci par avance.
Hervé
eriiic
Messages postés
24571
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
8 mai 2024
7 216
30 déc. 2009 à 00:18
30 déc. 2009 à 00:18
Bonsoir,
Je ne pense pas que ce soit la fonction de michel qui prenne du temps de calcul.
Je me suis attaqué au 2)
(et elle, elle risque de prendre du temps.... ;-) )
Rechercher dans une plage verticale une cellule de couleur x
syntaxe :
=RechercheVCouleur(couleur;plage;index_colonne[;occurence])
Ex:
=RechercheVCouleur(3;H2:H13;0)
=RechercheVCouleur(3;H2:H13;-2;3)
eric
Je ne pense pas que ce soit la fonction de michel qui prenne du temps de calcul.
Je me suis attaqué au 2)
(et elle, elle risque de prendre du temps.... ;-) )
Rechercher dans une plage verticale une cellule de couleur x
syntaxe :
=RechercheVCouleur(couleur;plage;index_colonne[;occurence])
Ex:
=RechercheVCouleur(3;H2:H13;0)
=RechercheVCouleur(3;H2:H13;-2;3)
Function RechercheVCouleur(couleur As Long, plage As Range, index_colonne As Long, Optional occurence As Long) As Variant ' recherche en vertical dans une 'plage' de largeur 1 colonne ' une cellule de couleur de fond 'couleur' ' ' Le retour dépend de la valeur de index_colonne : ' index_colonne = 0 : retourne l'index de la cellule dans la plage (sa position dans plage) ' index_colonne < 0 : retourne la valeur de la cellule située x cellules à gauche ' index_colonne > 0 : retourne la valeur de la cellule située x-1 cellules à droite ' ' occurence : paramètre optionel, pardéfaut=1 ' Ex : si occurence=5 et couleur=3 la 5ème cellule rouge sera recherchée ' si seulement 4 occurences dans la plage #N/A est retourné ' ' Dim c As Range, cpt As Long, ok As Boolean Application.Volatile If occurence < 1 Then occurence = 1 If plage.Columns.Count > 1 Then RechercheVCouleur = "#VALEUR!" For Each c In plage If c.Interior.ColorIndex = couleur Then cpt = cpt + 1 If cpt = occurence Then Select Case index_colonne Case Is < 0 RechercheVCouleur = c.Offset(0, index_colonne) ok = True Exit For Case 0 RechercheVCouleur = c.Row - plage.Row + 1 ok = True Exit For Case Else RechercheVCouleur = c.Offset(0, index_colonne - 1) ok = True Exit For End Select End If End If Next c If Not ok Then RechercheVCouleur = "#N/A" End Function
eric
Bonsoir Eric,
Merci pour votre réponse trés aboutie. C'est trés précieux.
Je vais examiner et tester plus tard votre code.
Egalement, j'ai imaginé pour gagner du temps de lancer le calcul uniquement sur ordre sot avec F9 soit avec un bouton lié à une macro afin que la personne (ou sa remplaçante) qui fera les saisies journalières n'oublie pas lancer le calcul avant toute édition.
Malheureusement, cette personne utilise d'autre fichier Excel pour d'autre application.
Elle devra penser :
- soit à lancer le calcul manuellement (source d'oublie et donc d'erreur de calcul)
- soit à changer les paramètres d'Excel en fonction des fichiers utilisés. (trop fastidieux)
Avez-vous une idée ?
Merci
A bientôt
Hervé
Merci pour votre réponse trés aboutie. C'est trés précieux.
Je vais examiner et tester plus tard votre code.
Egalement, j'ai imaginé pour gagner du temps de lancer le calcul uniquement sur ordre sot avec F9 soit avec un bouton lié à une macro afin que la personne (ou sa remplaçante) qui fera les saisies journalières n'oublie pas lancer le calcul avant toute édition.
Malheureusement, cette personne utilise d'autre fichier Excel pour d'autre application.
Elle devra penser :
- soit à lancer le calcul manuellement (source d'oublie et donc d'erreur de calcul)
- soit à changer les paramètres d'Excel en fonction des fichiers utilisés. (trop fastidieux)
Avez-vous une idée ?
Merci
A bientôt
Hervé
eriiic
Messages postés
24571
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
8 mai 2024
7 216
30 déc. 2009 à 07:00
30 déc. 2009 à 07:00
Bonjour,
lancer le calcul sur :
-imprimer
-enregistrer
-activation d'onglet
eric
PS: je n'ai pas fignolé le traitement d'erreur. Si tu demandes 3ème colonne à gauche et que tu es en B ça plante (entre autres...)
PS2 : si c'est cette partie qui est lente procède autrement.
Utilise des codes S1, S2, ... pour les salles et met une MFC (excel2007) ou une macro sur 'change' pour colorer les cellules. Ca sera plus rapide de compter tes codes par fonction excel.
lancer le calcul sur :
-imprimer
-enregistrer
-activation d'onglet
eric
PS: je n'ai pas fignolé le traitement d'erreur. Si tu demandes 3ème colonne à gauche et que tu es en B ça plante (entre autres...)
PS2 : si c'est cette partie qui est lente procède autrement.
Utilise des codes S1, S2, ... pour les salles et met une MFC (excel2007) ou une macro sur 'change' pour colorer les cellules. Ca sera plus rapide de compter tes codes par fonction excel.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonsoir,
Merci pour ton aide.
Pour les affectations S1, S2 etc.. dans le tableau c'est pas pratique car je l'ai utilisé en 2009.
Avec l'aide d'une personne grâce à un autre forum, j'ai changé la fonction Application.Volatile True par Application.Calculation = xlManual.
Et ça fonctionne beaucoup mieux.
Merci pour ton aide.
Hervé
Merci pour ton aide.
Pour les affectations S1, S2 etc.. dans le tableau c'est pas pratique car je l'ai utilisé en 2009.
Avec l'aide d'une personne grâce à un autre forum, j'ai changé la fonction Application.Volatile True par Application.Calculation = xlManual.
Et ça fonctionne beaucoup mieux.
Merci pour ton aide.
Hervé
eriiic
Messages postés
24571
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
8 mai 2024
7 216
31 déc. 2009 à 07:49
31 déc. 2009 à 07:49
j'ai changé la fonction Application.Volatile True par Application.Calculation = xlManual
Si c'est à l'intérieur de la fonction personnalisée c'est illogique.
Si elle a besoin d'être volatile ce n'est pas pour rien, le calcul manuel doit être mis à l'extérieur de la fonction.
Par ailleurs si tu t'adresses à plusieurs forums tu dois le dire et mettre les liens.
Par courtoisie et par efficacité.
eric
Si c'est à l'intérieur de la fonction personnalisée c'est illogique.
Si elle a besoin d'être volatile ce n'est pas pour rien, le calcul manuel doit être mis à l'extérieur de la fonction.
Par ailleurs si tu t'adresses à plusieurs forums tu dois le dire et mettre les liens.
Par courtoisie et par efficacité.
eric
eriiic
Messages postés
24571
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
8 mai 2024
7 216
31 déc. 2009 à 12:02
31 déc. 2009 à 12:02
Je reste sur le fait qu'Application.Calculation = xlmanual n'a rien à faire dans une fonction.
Puisque de toute façon le calcul sera toujours désactivé dès le premier appel, l'utilisateur devra lancer les calculs manuellement. Et ça sur tous les classeurs, je ne te raconte pas les risques d'erreurs !!!
Je le mettrai en manuel sur activation de la feuille concerné pour le rétablir sur désactivation de la feuille et sur enregistrement mais bon, c'est ton classeur...
eric
Puisque de toute façon le calcul sera toujours désactivé dès le premier appel, l'utilisateur devra lancer les calculs manuellement. Et ça sur tous les classeurs, je ne te raconte pas les risques d'erreurs !!!
Je le mettrai en manuel sur activation de la feuille concerné pour le rétablir sur désactivation de la feuille et sur enregistrement mais bon, c'est ton classeur...
eric