RODAVAFLO
Messages postés10Date d'inscriptiondimanche 19 octobre 2008StatutMembreDernière intervention21 octobre 2009
-
27 juin 2009 à 11:40
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
30 juin 2009 à 15:23
Bonjour,
La formule Nb.si permet de déterminer le nombre de cellules qui répondent à un critère dans une plage définie. J'aimerais pouvoir avoir une possibilité de critère que simplement une valeur. Par exemple, j'aimerais, dans une plage donnée, connaître :
le nombre de cellules qui sont de type date
le nombre de cellues qui sont de type texte
La fonction nb.si ne me permet pas de définir mes critères comme cela, donc je dois créer une formule qui permet, en fonction d'une plage sélectionnée de donner le nombre de cellules qui répondent à mon critère. J'avais donc envie de créer une formule du type Nb.si.texte ou Nb.si.date. Le problème, c'est que je coïnce dans la rédaction du programme de la fonction. Il faut que je puisse déterminer quelle est, pour une place sélectionnée :
les indices col et li de la première cellule
les indies col et li de la dernière cellule
Ex : si ma plage est A10:B50, A10:B50 est l'information que je rentrerai dans la formules, mais dans le développement, il faut que je trouve que ma ligne 1 est 10, ma dernière ligne est 50, ma col 1 est A et ma dernière colonne est B. A partir de là, je pourrai passer en revue toutes les cellules de la plage et faire des tests sur leur format pour voir celles qui répondent à mon critère.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 30 juin 2009 à 15:23
Bonjour,
RODAVAFLO > La solution que tu proposes est probablement la seule correcte, car en effet il n'existe pas beaucoup de méthode pour savoir si une chaîne est du texte sans faire une batterie de test... Je ne détaillerai pas plus, mais en qlq mots, lorsque j'utilise Cellule.numbreformat je fais appel à une "instruction" du VBA (c.a.d. propre à Excel), qu'alors Isdate est une instruction du VB (=identique à toutes les plateformes de programmation VBE et VB6)...
Pour déterminer les indices de la plage, voici un exemple à étudier :
Function essai(Plage As Range)
MsgBox "premiere cellule : ligne=" & Plage.Row & " / colonne=" & Plage.Column
MsgBox "nb de ligne selectionnée =" & Plage.CurrentRegion.Rows.Count
MsgBox "nb de colonne selectionnée =" & Plage.CurrentRegion.Columns.Count
End Function
Il existe d'autres façons de faire... Ici on récupère l'indice (chiffré) de la colonne et de la ligne de la première cellule constituant la plage, puis le nombre de ligne et de colonne de la plage... On doit additionner le tout pour obtenir la dernière cellule... en faisant attention de retirer 1 car on parle d'indice...
En principe on peut accèder à ce que l'on veut ensuite avec Cells... On peut également faire en sorte de se balader dans la plage qu'en coordonnées relatifs... bon ensuite c'est un cours complet... mais tu as normalement assez d'indices pour savoir vers quoi chercher...
RODAVAFLO
Messages postés10Date d'inscriptiondimanche 19 octobre 2008StatutMembreDernière intervention21 octobre 2009 29 juin 2009 à 22:27
Génial, ça marche. J'opte pour la solution 2, elle est simple et limpide.
Par contre, j'ai voulu faire pareil mais cette fois, avec le type de format texte et ça marche pas.
IsText(cellule.value) : ca marche pas
cellule.istext non plus
Je sais qu'il existe la formule "Type" qui renvoit comme réponse 2 si la cellule est de type texte, mais je n'arrive pas non plus à l'appliquer.
RODAVAFLO
Messages postés10Date d'inscriptiondimanche 19 octobre 2008StatutMembreDernière intervention21 octobre 2009 29 juin 2009 à 23:10
Faut pas essayer de comprendre, mais j'ai trouvé
Function NbSiTexte(Plage As Range) As Integer
Dim Cellule As Range
NbSiTexte = 0
For Each Cellule In Plage
If Application.WorksheetFunction.IsText(Cellule.Value) Then NbSiTexte = NbSiTexte + 1
Next
End Function
Il y a tout de même quelque chose qui m'intrigue. Comment peut-on faire pour déterminer les indices ligne colonne des première et dernière cellule de "Plage"