Calculer le nombre de ligne d'un tableau sans compter celles qui sont vide
Bonsoir à tous,
J'utilise un code pour me calculer le nombre de ligne correspondant à des règles dans un tableau qui débute à partir de la ligne 13.
'Détermination du nombre de ligne
IndexCode = Workbooks(FichierCode).Sheets(FeuilleControle).Cells(13, 3)
NbIndex = 0
Do While (IndexCode <> "")
NbIndex = NbIndex + 1
IndexCode = Workbooks(FichierCode).Sheets(FeuilleControle).Cells(13 + NbIndex, 3)
Loop
NbreLigne = NbIndexJe souhaiterai ajouter des lignes avec des titres mais sans quelles soient pris en compte dans le calcule mais je ne trouve pas comment faire.
J'ai essayé en faisant un For:
For i = 14 To NbIndex
QuestionVide = Workbooks(FichierCode).Sheets(FeuilleControle).Cells(i, 2)
If QuestionVide = "" Then
LigneVide = LigneVide + 1
End If
Next iPuis un calcule basique de soustraction:
NbreRegles = NbIndex - LigneVideMais le résultat n'est pas exacte....
En vous remerciant d'avance.
Bonjour,
Je propose une formule :
=NB.SI($C$14:$C$46;"Règle*")Sachant que le tableau devrait être structuré auquel cas, ça deviendrait :
=NB.SI(NOMTABLEAU[NOMCOLONNEC];"Règle*")Si vraiment (ce dont je doute) il y a besoin de passer par le code :
nbregles = application.countif([C14:C46], "Règle*")l'équivalent VBA du NB.SI d'excel.
Et pour gérer le problème d'accent grave du mot "Règle" (il est absent une fois), vous pouvez mettre "R?gle*" dans le NB.SI...
Edit : Et pour déterminer le nombre de vides : nbvides = application.countblank(range("refdelaplage")).
Cdlt,
Sur le tableau, j'ai indiqué le mot "Règle" mais ça ne commencera jamais par ca mais par exemple: "Ouvrir la fenetre", "Fermer le bureau à clé" etc...
De plus le nombre de règle peut changer pour ça que je fais une boucle tant que la cellule n'est pas vide.
Bonjour Xblade, bonjour 3GB,
Pourquoi ne pas simplement appliquer afin de connaître le nombre de références non vides ?
=NBVAL($B$14:$B$46)Je doute que le VBA soit adapter ici, des formules devraient suffire.
Bonne soirée.
Salut Ergotamine,
Oui je partage clairement ton avis et, dans ce cas, s'il s'agit uniquement de compter les non vides, NBVAL semble tout à fait adaptée ! à moins qu'il n'y ait des vides résultant d'une formule, auquel cas il vaudrait mieux avoir :
=LIGNES(C14:C46)-NB.VIDE(C14:C46)Et les équivalents de NBVAL et de cette formule sont :
nbval = application.counta(range("refplage"))et
nbnonvides = range("refplage").cells.count - application.countblank(range("refplage"))Edit : Et pour le nombre de vides ou de lignes variables, c'est pour cette raison (entre autres) qu'il vous faut un tableau structuré pour gérer dynamiquement les changements.
Cdlt,
Bon j'ai réussis en restant dans mon style de codage. Je ne suis pas très bien familiarisé avec le langage VBA ^^
Ce que j'ai mis en code:
'Détermination du nombre de règles
'Indexation des lignes
IndexCode = Workbooks(FichierCode).Sheets(FeuilleControle).Cells(14, 3)
NbIndex = 0
'Boucle pour determiner dynamiquement le nombre de ligne utilisé
Do While (IndexCode <> "")
NbIndex = NbIndex + 1
IndexCode = Workbooks(FichierCode).Sheets(FeuilleControle).Cells(14 + NbIndex, 3)
Loop
'Déterminer les lignes vide
For i = 13 To NbIndex + 12
QuestionVide = Workbooks(FichierCode).Sheets(FeuilleControle).Cells(i, 2)
If QuestionVide = "" Then
LigneVide = LigneVide + 1
End If
Next i
'Formule de soustration
NbreRegles = NbIndex - LigneVideJe contourne un peu le problème en me basant sur la 2eme colonne vide pour les titres et la 3eme colonne pleine avec les règles.
Si vous avez une methode plus simple et détaillé pour que je puisse comprendre, je suis preneur pour ma culture.
Re,
Attention, il parait que l'abus de boucles est mauvais pour la santé
Ici, il faut déterminer la dernière ligne à l'aide de la méthode end. C'est une opération qui est incontournable car constamment utilisée. Il faut que vous l'appreniez et la compreniez.
Ensuite, on utilise des fonctions (dans ce cas, les fonctions excel, notamment NB.VIDE sous sa forme anglaise).
Sub test()
'Détermination du nombre de règles
'Indexation des lignes
'pas de variable FichierCode : ici pas nécessaire
'pas de variable FeuilleControle : idem
with Sheets("TEST") '<<< IMPORTANT : ON TRAVAILLE AVEC LA FEUILLE "TEST" (alors, on pointe les cellules qui y appartiennent)
'>>>PREALABLE : Détermination de la dernière ligne non vide
DernLig = .cells(.rows.count, 3).end(xlup).row
'---DETAILS :
'.rows.count renvoie le numéro de la dernière ligne de la feuille (car c'est le nombre de lignes)
'.cells(.rows.count, 3) renvoie donc la dernière cellule en colonne C
'.cells(.rows.count, 3).end(xlup) renvoie la première cellule obtenue en faisant un déplacement massif (méthode end équivaut à ctrl + fleche, xlup est un paramètre indiquant vers en haut)
'.cells(.rows.count, 3).end(xlup).row renvoie la ligne de cette dernière cellule non vide obtenue après le déplacement depuis tout en bas
'>>>---NOMBRE CELLULES---<<<
'>>>1ère méthode : par soustraction
NbIndex = DernLig - 14 + 1 '14 pour la ligne de départ, +1 pour inclure la ligne de départ dans le décompte
'>>>2è méthode (RECOMMANDEE) : en comptant les cellules de la plage
NbIndex = .range("C14:C" & DernLig).cells.count 'littéralement : compte les cellules de la plage "C14:CDernLig"
'>>>-----TROUVER CELLULES UTILISEES-----<<<
'>>>1ere methode : utilisation de counta (si et seulement si aucune chaine vide due à une formule)
Nbval = application.counta(.range("C14:C" & DernLig))
'>>>2e methode : soustraction entre nombre de cellules et nombre vides (via countblank)
nbvides = application.countblank(.range("C14:C" & DernLig))
nbval = .range("C14:C" & DernLig).cells.count - nbvides
end with
end subEn résumé :
Sub cptval()
with Sheets("TEST")
dl = .cells(.rows.count, 3).end(xlup).row
nbregles = .range("C14:C" & dl).cells.count - application.countblank(.range("C14:C" & dl))
end with
end subPar ailleurs, comme je l'ai dit plus haut, il faut absolument que vous mettiez vos données sous forme de tableau structuré. Ca vous permettra de grandement faciliter les choses. Le code deviendrait alors :
Sub cptval()
nbregles = range("nomtableau[nomcolC]").cells.count - application.countblank(range("nomtableau[nomcolC]"))
end subEnfin, c'est bien d'utiliser des variables mais il faut essayer de ne pas non plus en abuser car ça peut créer une certaine confusion à la lecture du code et il vaut mieux s'en passer lorsqu'elles n'ont pas d'utilité. Donc FichierCode et FeuilleControle peuvent être sacrifiées sans remord :).
Cdlt,
Pour le besoin de mon tableau, la boucle For est indispensable car j'envoie le contenu de chaque cellule sur différent tableau en fonction de certains critères.
En tout cas, merci beaucoup pour la proposition et l'explication, je vais pouvoir l'assimiler pour d'autres besoins :-D