Pb de comptage de cellules non vides

vgendron

XLDnaute Barbatruc
Bonjour à tous

voici une colle qui se pose à moi.. et donc à vous :)

Dans le fichier joint j'ai une feuille "Saisie Sécurité" que j'ai pré-saisie pour l'exemple

la zone qui m'interrese est le tableau en zone A24:p28
vous voyez qu'il y a UN seul bonhomme avec
son TYPE en A24
son NOM dans les cellules fusionnées B24:C24
et son STATUT en D24

la macro ci dessous compte de deux manières le nombre de bonhommes
J'ai allégé la macro initiale pour ne garder que ce qui pose problème.
VB:
Sub pbcomptage()
Set PalSécu = Range("A24").Resize(5, 16) 'selection des groupes de sécu
        'PalSécu.Select
        On Error Resume Next 'permet de continuer si NbPalSécu est vide
        
        ManqueInfo = False
        Comptage1 = 0
        'attention. suppose que le tablo PalSécu soit toujours en A24:P28 !!
        For i = 1 To 13 Step 4
            For j = 24 To 28 Step 1
                If Cells(j, i) <> "" Then
                    If Cells(j, i + 1) = "" Or Cells(j, i + 3) = "" Then
                        ManqueInfo = True
                    Else
                        Comptage1 = Comptage1 + 1
                    End If
                End If
            Next j
        Next i
                 
        Comptage2 = PalSécu.SpecialCells(xlTextValues).Count / 3
        

        'la ligne précédente fonctionne sur le fichier source qui contient les formules pour mettre S en colonnes D - H - L et P
        'ne FONCTIONNE PLUS sur un fichier exporté. qui ne contient PLUS les formules
        'mais le .count considère pourtant que les colonnes D H L et P sont non vides !! ?? !!!
End Sub

donc. ici.. vous voyez que Comptage1 et Comptage2 donnent bien 1 bonhomme

maintenant.. si vous enregistrez la feuille avec le bouton "Enregistrer feuille"
cela créer un nouveau fichier qui ne contient QUE la feuille "Saisie Sécurité", les formules des colonnes D H L et P ont été supprimées (copier collage spécial valeur)

et maintenant, relancer la macro PbComptage sur CE nouveau fichier..
Comptage1 me donne toujours le bon résultat: 1
mais Comptage2 considère que les cellules qui contenaient une formule en D H L et P; ne sont finalement pas vides... d'ou un 22/3=7.6666

d'ailleurs.. si vous sélectionnez manuellement la zone A24:p28, dans la barre d'état d'Excel, en bas.. on voit effectivement qu'excel trouve 22: formule ou pas formule...

quelqu'un a une idée du pourquoi comment?

à l'origine, je voulais utiliser la méthode de comptage 2: beaucoup plus rapide puisqu'une seule ligne..
 

Pièces jointes

  • Pb Comptage Copier Coller.xlsm
    165 KB · Affichages: 48

vgendron

XLDnaute Barbatruc
hello Lone
yes pour VBnullstring. je teste ca
pour le step 1: c'est juste parce que lors du test en mode debugage.., la boucle a commencé à la valeur finale... pas compris pourquoi. ..mais on est bien d'accord. normalement. c'est totalement inutile.


en fait.. je me rend compte que c'est pas le test ="" qui pose problème dans ce cas précis..
mais j'avoue que j'ai déjà eu par le passé autre souci à cause de ce ="" lorsque la variable est vide
 

vgendron

XLDnaute Barbatruc
tiens. autre chose..
je viens de voir que si je revalide chaque cellule (double clic dans la cellule) des colonnes D H L et P..
le comptage2, me donne maintenant 1.33 = 4/3
le 4 étant dû au fait des deux cellules fusionnées...
alors. pourquoi dans un cas. la cellule fusionnées n'est vue comme une seule cellule et dans l'autre comme DEUX.. ???
arf.. les mystères d'excel sont parfois impénétrables...
 

Shakki

XLDnaute Occasionnel
Bonjour,

Je vais sans doute dire une grosse bêtise, mais pourquoi tu ne prends pas le problème à l'envers en enlevant les vides de la totalité de la plage.

VB:
comptage2 = 60 - PalSécu.SpecialCells(xlCellTypeBlanks).Count

A+
 

DoubleZero

XLDnaute Barbatruc
Bonjour à toutes et à tous,
... Je vais sans doute dire une grosse bêtise...
Je vais, sans doute, proposer une gr:oops:sse ânerie...
VB:
Option Explicit
Sub Cellules_non_vides_compter()
    Dim c As Range, compteur_1, compteur_2
    compteur_1 = 0: compteur_2 = 0
    For Each c In Range("a24:p28").SpecialCells(xlCellTypeConstants)
        If c <> "" Then compteur_1 = compteur_1 + 1
        If c = "" Then compteur_2 = compteur_2 + 1
        If c.MergeCells = True Then compteur_2 = compteur_2 - 1
    Next
    MsgBox compteur_1 - compteur_2
End Sub
A bientôt :)
 

Marcel32

XLDnaute Accro
Bonjour,

'la ligne précédente fonctionne sur le fichier source qui contient les formules pour mettre S en colonnes D - H - L et P
'ne FONCTIONNE PLUS sur un fichier exporté. qui ne contient PLUS les formules
'mais le .count considère pourtant que les colonnes D H L et P sont non vides !! ?? !!!
Ce qui est vrai puisque dans le fichier exporté elles contiennent "" que tu as copié/collé avec le copy/PasteSpecial. ;)
 

vgendron

XLDnaute Barbatruc
Hello à tous et merci pour vos idées !

@ Lone: je ne connaissais pas la propriété MergeArea --> ca va bien me servir pour plus tard

@Shakki: c'est loin d'etre une idiotie :
comptage2 = 60 - PalSécu.SpecialCells(xlCellTypeBlanks).Count
me donne bien le nombre de bonhommes.. à ceci prêt que si le nom n'est pas rempli, ET que je "force" un S en colonne D.. ca me donne toujours le nombre de bonhommes
j'ai creusé:
NbCell=PalSécu.count -->80 cellules: ignore la fusion des cellules
dans ta proposition: 60 = deux cellules fusionnées comptent pour une (c'est bien ce que je souhaite en fait)
mais... PalSécu.SpecialCells(xlCellTypeBlanks).Count considère les cellules fusionnées comme vide.. qu'elles soient saisies ou non....


@ Quant à l'annerie de Double Zero :)

For Each c In Range("a24:p28").SpecialCells(xlCellTypeConstants)
ne tient pas compte pas des cellules avec formule - Normal. c'est pas une constante

@Marcel32
Haaaaa.. Cette différence entre "" et vide....



Donc.. quand je mixe tout ca.. ca me donne

VB:
For Each c In PalSécu
        'MsgBox c.Address
        If c <> "" Then compteur_1 = compteur_1 + 1
Next c
    MsgBox compteur_1

Encore Merci à tous
 

Discussions similaires

Haut Bas