Autres Compter Nb>1 dans cell. (UDF)

zebanx

XLDnaute Accro
Bonjour à tous,

Une fonction CCval permet d'additionner sur un range un nombre de chiffres correspondant à une référence.

Par exemple
A1 = 7T2F
A2 = 7T
A3 = 7T

CCval(A1:A3;"T") = 21
CCval(A1:A3;"F") = 2

Je n'arrive cependant pas à corriger le code pour prendre plus de 1 chiffres avant chaque lettre. On devrait être limité à 2 chiffres mais 3 chiffres ne sont pas à exclure.

Auriez-vous une solution svp à me proposer ?
Comme habituellement, un petit fichier d'accompagnement.

Vous en remerciant par avance.

zebanx

VB:
Function CCval(xPlage As Range, xref)
    '-- CompteCarValeur(Ref)
  For Each xcell In xPlage
        xi = Split(xcell, xref)
        If UBound(xi) > 0 Then
        xn = CDbl(Mid(xcell, Len(xi(0)), 1))                '-ok si un seul chiffre
        xCpt = xCpt + xn
        End If
    Next xcell
CCval = xCpt
End Function
 

Pièces jointes

  • XLD_demande sur split.xlsm
    19.9 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonjour zebanx,

Ce n'est guère compliqué :
VB:
Function CCval(xPlage As Range, xref)
Dim c As Range, i%
For Each c In xPlage
    i = InStr(c, xref)
    If i Then
        For i = i - 1 To 1 Step -1
            If Not IsNumeric(Mid(c, i, 1)) Then Exit For
        Next i
        CCval = CCval + Val(Mid(c, i + 1))
    End If
Next c
End Function
A+
 

zebanx

XLDnaute Accro
Bonjour Job75

C'est une très bonne formule pour baliser jusqu'au prochain caractère non numérique qui m'échappait et je t'en remercie vivement.

Un point remarqué (sans conséquence) sur le fichier initial avec une cellule vide en L17 (c'était comme ça au départ), l'UDF additionne des chiffres.
Cf. le fichier.

Encore merci pour ta célérité et la qualité de ta réponse
bonne journée
 

Pièces jointes

  • XLD_split_répondu.xlsm
    22.4 KB · Affichages: 5

job75

XLDnaute Barbatruc
Un point remarqué (sans conséquence) sur le fichier initial avec une cellule vide en L17 (c'était comme ça au départ), l'UDF additionne des chiffres.
VB:
Function CCval(xPlage As Range, xref)
If xref = "" Then CCval = "": Exit Function
Dim c As Range, i%
For Each c In xPlage
    i = InStr(c, xref)
    If i Then
        For i = i - 1 To 1 Step -1
            If Not IsNumeric(Mid(c, i, 1)) Then Exit For
        Next i
        CCval = CCval + Val(Mid(c, i + 1))
    End If
Next c
End Function
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, zebanx, job75

zebanx
J'étais parti là-dessus (à partir de ton code initial)
VB:
Function CCval(xPlage As Range, xref)
    '-- CompteCarValeur(Ref)
  For Each xcell In xPlage
        xi = Split(xcell, xref)
        If UBound(xi) > 0 Then
        xn = Val(xi(0))
        xCpt = xCpt + xn
        End If
    Next xcell
CCval = xCpt
End Function
Si en A1 et A2, on a
123T25B
77T2F
=Ccval(A1:A2;"T") renvoie 200.
 
Dernière édition:

zebanx

XLDnaute Accro
Bonsoir Staple1600.

Je te remercie pour ta proposition.
Malheureusement comme tu le verras sur le fichier, il y a des problèmes pour d'autres valeurs.
Si tu trouves avec SPLIT, j'en serai ravi mais ça me parait (bien plus) compliqué que cela pour aller rechercher les caractères comme l'audacieuse fonction de JOB a su le faire avec INSTR.
Ca ne veut pas dire que je ne chercherais pas non plus quand j'aurais un petit moment. Par défi par rapport à l'utilisation de SPLIT parce que j'aime bien ces deux fonctions. Mais la fonction trouvée par JOB75 fait superbemement le job et sa construction remarquable.
A moins que tu ne trouves d'ici là. ;)

Bonne soirée
 

Pièces jointes

  • XLD_réponses.xlsm
    19.8 KB · Affichages: 1

zebanx

XLDnaute Accro
Bonjour Staple1600, Job75, le forum

La suite de la suite.
Ci-joint un fichier contenant une autre proposition en utilisant SPLIT.
La méthode est beaucoup plus longue dans sa rédaction du fait que les chaines de textes n'ont pas de séparateurs.
Ce que le code de JOB75 (encore merci!) traite de manière très subtile par INSTR().

En résumé:
- Méthode JOB75 : Instr() avec retour arrière jusqu'à ce qu'on trouve un caractère non numérique
- Méthode SPLIT : Double utilisation de SPLIT avec une fonction supplémentaire ajoutant un caractère "|" après chaque valeur alpha.

A noter également que par besoin, il me fallait traiter le cas des décimales donc ne pas s'arrêter à un ".".
Le fichier ci-joint complète la méthode de JOB75 sur ce sujet par rapport au code original fourni.

Bonne journée
 

Pièces jointes

  • XLD_réponses.xlsm
    31.8 KB · Affichages: 1

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 896
Membres
101 833
dernier inscrit
sandra25