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
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
6 Réponses :
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
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.
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)
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.
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.
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
Formule;
Par exemple 1 mais l'édition renvoie les exemples 2 et 3.
=MATCH(TRUE,INDEX($B$2:$B$11>0,0),0)-1
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.