1
votes

Comment compter les cellules jusqu'à ce qu'une valeur soit supérieure à 0?

Dans Excel, j'essaie de compter le nombre de jours jusqu'à ce qu'un rendez-vous soit disponible.

dans l'ensemble de données ci-dessous, je dois être en mesure de compter jusqu'à ce qu'une valeur soit atteinte autre que 0.

le résultat dont j'ai besoin est

  • Exemple 1 = 3
  • Exemple 2 = 5
  • Exemple 3 = 0

En anglais ordinaire, j'en ai besoin pour vérifier si cell = 0 si c'est le cas, puis le compter, et arrêter de compter lorsque la cellule n'est plus = 0

S'il existe une solution VBA qui serait mieux mais mal accepter tout ce qui fonctionne.

    Dim iCntr As Integer
    iCntr = 2
    Do While (Cells(iCntr, 3).Value) = 0
    Range("C13").Value = Application.WorksheetFunction.Count("C:C")
    Loop
End Sub

J'ai essayé plusieurs méthodes, mais la plus proche que j'ai obtenue était avec le VBA ci-dessous qui semble donner la bonne réponse avant de planter mon excel, donc je soupçonne qu'il compte quelque chose qu'il ne devrait pas ' t.

            Example1    Example2   Example3
May 13 2019    0           0          2
May 14 2019    0           0          0
May 15 2019    0           0          6
May 16 2019    6           0          0
May 17 2019    0           0          3
May 20 2019    3           7          0
May 21 2019    6           14         0
May 22 2019    6           0          1
May 23 2019    12          14         0
May 24 2019    7           0          0


3 commentaires

Qu'avez-vous essayé? Où es-tu coincé?


Avez-vous essayé d'utiliser une boucle while qui incrémente un compteur alors que la cellule d'une colonne est à 0?


Si vous avez une bonne tentative, modifiez-la dans la question elle-même. Entre autres choses, cela nous donnera une idée de la sortie prévue.


6 Réponses :


0
votes

Comme ceci:

Public Function count_zeroes(ByVal columnID As Long) As Long
    Dim i As Long: i = 1
    Dim cell As Range: Set cell = ActiveSheet.Cells(i, columnID)

    If Not IsEmpty(cell) Then
       Do Until cell <> 0 'we'll keep counting until cell <> 0 
           i = i + 1
           Set cell = ActiveSheet.Cells(i, columnID)
       Loop
    End IF

    count_zeroes = i - 1

End Function

 entrez la description de l'image ici


5 commentaires

Que se passe-t-il s'il y a des zéros jusqu'au bas de la colonne?


Eh bien, le type de données choisi pour cette raison même est Long et non Byte ni Integer . Une fois qu'il dépasse la valeur maximale de Long (ce qui est très peu probable dans la pratique), il se retrouverait dans un débordement


Le problème est que s'il y a des zéros (ou des blancs) tout en bas, finalement Cells (i, columnID) essaiera d'accéder à une cellule inexistante. Le débordement n'est pas le problème. C'est un cas de pointe, donc c'est un peu un appel de jugement s'il doit être traité.


Ah mon mauvais a oublié que les cellules vides sont traitées comme des zéros, ouais devraient être modifiées avec un simple isEmpty ()


Vous avez toujours la ligne Set cell = ActiveSheet.Cells (i, columnID) dans une situation où i pourrait être Rows.Count . De plus, le isEmpty n'est appliqué qu'à la cellule supérieure de la colonne. Un test rapide montre que votre code plante, par ex. sur une colonne qui a un seul 0 dans la première ligne et qui est entièrement vide en dessous.



0
votes

vous pouvez utiliser une formule de correspondance = IF (B2 <> 0,0, MATCH (0, B2: B20,1)) avec ordre croissant (modifier: ajouté si ce n'est pas le cas travailler si le premier jour est disponible)


0 commentaires

2
votes

Le moyen le plus simple est peut-être la formule suivante:

=IFERROR(MATCH(0,B:B,1)-MATCH(0,B:B,0)+1;0)

En supposant que nous ayons affaire à des données sur la colonne B.


0 commentaires

1
votes
Function DAYS_UNTIL_APPOINTMENT(ByVal OnThisRange As Range) As Byte
Dim rng As Range


For Each rng In OnThisRange
    If rng.Value <> 0 Then
        Exit For
    Else
        DAYS_UNTIL_APPOINTMENT = DAYS_UNTIL_APPOINTMENT + 1
    End If
Next rng
End Function
Please, note this only will work if you select 1 column of data. Also, I made it Byte type, so if the number of days is higher than 255, then it will raise an error. Just change it to Integer if you need it.

3 commentaires

Quelle est la motivation pour utiliser Byte ?


Selon Résumé des types de données (Visual Basic) , Byte consomme 1 octet et Integer consomme 4 octets. J'ai une habitude de travail (je ne sais pas si c'est correct en anglais) et là où je travaille, en raison du long processus de chronométrage, nous essayons de toujours nous ajuster. Je dois admettre que dans ce processus facile ne vaut pas vraiment la peine, mais comme je l'ai dit, j'y suis habitué parce que mon travail. C'est pourquoi j'ai ajouté plus tard une explication sur le changement en entier. J'espère que cela jette de la lumière.


Merci pour cela, cela fonctionne parfaitement. Je suis très nouveau sur VBA et étonnamment je n'avais pas encore rencontré de fonctions, mais cela m'a forcé à apprendre et m'a trouvé une leçon très précieuse, si jamais vous êtes en Irlande, je vous dois une pinte ha :) Merci encore



3
votes

Formule;

Par exemple 1 mais l'édition renvoie les exemples 2 et 3.

=MATCH(TRUE,INDEX($B$2:$B$11>0,0),0)-1


0 commentaires

0
votes

Encore une autre option utilisant une formule matricielle qui fonctionne n'importe où (du moins je pense que c'est le cas) ...

{=MIN(IF(B4:B13>0,ROW(B4:B13)-MIN(ROW(B4:B13)),""))}

 entrez la description de l'image ici p >

Assurez-vous de vous engager en utilisant Maj + Ctrl + Entrée


0 commentaires