Compter nombre de valeurs entre plusieurs valeurs

everything is nominal

XLDnaute Nouveau
Bonjour,

Dans le cadre d'une étude statistique, je me retrouve avec un tableau qui contient des données en binaire et j'aimerais compter le nombre de "0" qui séparent mes "1". Cependant je dois faire ça sur plus de 3000 valeurs et je souhaiterais savoir s'il n'y aurais pas moyen de faire automatiquement.

pour vous donner un exemple voici à quoi cela ressemble :

100001001101

Et j'aimerais que excel me fasse une liste où il compte le nombre de "0" entre chaque "1", à savoir ici : 4;2;0;1

Ci-joint un fichier excel avec un échantillon de mes valeurs à compter.

Merci d'avance !
 

Pièces jointes

  • echantillon probleme excel.xlsx
    38 KB · Affichages: 42

david84

XLDnaute Barbatruc
Re : Compter nombre de valeurs entre plusieurs valeurs

Bonsoir et salut frérot,
un essai à améliorer via une fonction personnalisée (ne fonctionne que sur une sélection de lignes) :
Code:
Function NbZeroEntre1(Pl As Range) As String
Dim s, t, N As String, L As String, i&

s = Pl.Value

If TypeName(Pl.Value) <> "Variant()" Then NbZeroEntre1 = "0": Exit Function

For i = LBound(s) To UBound(s): N = N & s(i, 1): Next i

t = Split(N, "1")

If UBound(t) = 0 Then NbZeroEntre1 = "0": Exit Function

For i = LBound(t) To UBound(t)
  If Len(t(i)) > 0 Then L = L & Len(t(i)) & ";"
Next i

NbZeroEntre1 = Left(L, Len(L) - 1)
End Function
A+
 

job75

XLDnaute Barbatruc
Re : Compter nombre de valeurs entre plusieurs valeurs

Bonsoir everything is nominal, Jean-Claude, David,

Code:
Function Zeros$(r As Range)
'r doit être un vecteur colonne
Dim t, s, i&
t = Join(Application.Transpose(r), "")
s = Split(t, 1)
For i = 0 To UBound(s)
  s(i) = Len(s(i))
Next
Zeros = Join(s, ";")
If Left(Zeros, 1) = 0 Then Zeros = Mid(Zeros, 3)
If Right(Zeros, 2) = ";0" Then Zeros = Left(Zeros, Len(Zeros) - 2)
End Function
Fichier joint avec cette fonction en E6.

Bonne nuit.
 

Pièces jointes

  • echantillon probleme excel(1).xlsm
    24.4 KB · Affichages: 22

job75

XLDnaute Barbatruc
Re : Compter nombre de valeurs entre plusieurs valeurs

Bonjour le fil, le forum,

Pour éviter la valeur d'erreur quand la plage ne comporte qu'une cellule :

Code:
Function Zeros$(r As Range)
'r doit être un vecteur colonne
Dim t$, s, i&
If r.Count > 1 Then t = Join(Application.Transpose(r), "") Else t = r
s = Split(t, 1)
For i = 0 To UBound(s)
  s(i) = Len(s(i))
Next
Zeros = Join(s, ";")
If Left(Zeros, 1) = 0 Then Zeros = Mid(Zeros, 3)
If Right(Zeros, 2) = ";0" Then Zeros = Left(Zeros, Len(Zeros) - 2)
End Function
Fichier (2).

Bonne journée.
 

Pièces jointes

  • echantillon probleme excel(2).xlsm
    24.5 KB · Affichages: 26

david84

XLDnaute Barbatruc
Re : Compter nombre de valeurs entre plusieurs valeurs

Bonjour, salut Gérard,
que doit-on faire si dans l'exemple A2:A4 est sélectionné ? La valeur renvoyée est-elle 3 (puisque 3 zéro) ou 0 (puisque ces 0 ne sont pas séparés par un 1) ? Personnellement j'ai opté pour la seconde option...
j'aimerais compter le nombre de "0" qui séparent mes "1"
en attendant d'autres précisions (mais peut-être (sûrement même) ai-je tort).
A+
 

job75

XLDnaute Barbatruc
Re : Compter nombre de valeurs entre plusieurs valeurs

Re,

Ceci fonctionne que la plage soit un vecteur ligne, un vecteur colonne ou une cellule unique :

Code:
Function Zeros$(r As Range)
Dim a, t$, i&
a = Application.Transpose(r)
On Error Resume Next
If IsError(UBound(a, 2)) Then Else a = Application.Transpose(a)
t = r: t = Join(a, "")
On Error GoTo 0
a = Split(t, 1)
For i = 0 To UBound(a)
  a(i) = Len(a(i))
Next
Zeros = Join(a, ";")
If Left(Zeros, 1) = 0 Then Zeros = Mid(Zeros, 3)
If Right(Zeros, 2) = ";0" Then Zeros = Left(Zeros, Len(Zeros) - 2)
End Function
Fichier (3), pour le fun j'ai mis des données aléatoires.

A+
 

Pièces jointes

  • echantillon probleme excel(3).xlsm
    27.8 KB · Affichages: 25

everything is nominal

XLDnaute Nouveau
Re : Compter nombre de valeurs entre plusieurs valeurs

Bonjour,

Merci à tous pour vos réponses, c'est exactement cela que je cherchais ! je vais pouvoir faire mon travail en un temps records grâce à vous !

Pour répondre à David84, la réponse aurait été 3, le but est effectivement de compter les "0" jusqu'à ce que un "1" apparaisse.

Merci infiniment de votre aide et bonne journée !


P.S: pour vous remercier, voici une vidéo de deux hamsters qui font une démonstration des lois de la physique dans un tourniquet

https://www.youtube.com/watch?v=bTp-rl2F52o
 

job75

XLDnaute Barbatruc
Re : Compter nombre de valeurs entre plusieurs valeurs

Re,

Pour finir, il est sans doute mieux de supprimer les résultats nuls (pour les 1 consécutifs) :

Code:
Function Zeros$(r As Range)
Dim a, t$, i&
a = Application.Transpose(r)
On Error Resume Next
If IsError(UBound(a, 2)) Then Else a = Application.Transpose(a)
t = r: t = Join(a, "")
On Error GoTo 0
a = Split(t, 1)
For i = 0 To UBound(a)
  a(i) = Len(a(i))
Next
Zeros = Join(a, ";")
Zeros = Replace(Zeros, ";0", "") 'supprime les résultats nuls
If Left(Zeros, 1) = 0 Then Zeros = Mid(Zeros, 3)
End Function
Fichier (4).

A+
 

Pièces jointes

  • echantillon probleme excel(4).xlsm
    27.7 KB · Affichages: 28

david84

XLDnaute Barbatruc
Re : Compter nombre de valeurs entre plusieurs valeurs

En tenant compte des informations communiquées et de l'utilisation appropriée de Transpose (à partir du moment où la sélection opérée est en dessous des limites de cette fonction) :
Code:
Function Nb0(Pl As Range) As String
Dim s, t, u, v As String, i&

If Pl.Columns.Count > 1 Then
  s = Application.Transpose(Application.Transpose(Pl.Value))
Else
  If Pl.Rows.Count > 1 Then
    s = Application.Transpose(Pl.Value)
  Else
    If Pl.Value = 0 Then Nb0 = 1 Else Nb0 = vbNullString
    Exit Function
  End If
End If

u = Join(s, ""): t = Split(u, "1")

For i = LBound(t) To UBound(t)
  If Len(t(i)) > 0 Then v = v & Len(t(i)) & ";"
Next i

If InStr(v, ";") > 0 Then Nb0 = Left(v, Len(v) - 1)
End Function
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 677
Messages
2 090 822
Membres
104 677
dernier inscrit
soufiane12