Compteur éléments entre séparateur_ macro

Bonjour à tous,

=SI(ESTTEXTE(B1),SOMMEPROD((NBCAR(B1)-NBCAR(SUBSTITUE(B1,"|",""))+1)),0)

Je cherche à transformer cette fonction en macro, j'ignore si c'est faisable.

Elle permet de compter le nombre de "packs" entre séparateurs dans une même cellule.

J'aimerais unifier le traitement de mon gros fichier excel de 600 mo en un "Call" de macro.

Il me manque cependant cette partie.

Merci par avance si quelqu'un a une idée.

Cdt,

F.

10test-2.xlsx (9.97 Ko)

Hello, voilà une proposition

Function fonctionP(ByVal chaine As Variant) As Integer
If TypeName(chaine) = "String" Then
    fonctionP = Len(chaine) - Len(Replace(chaine, "|", "")) + 1
Else
    fonctionP = 0
End If
End Function

Sub appeler()
Dim resultat as Integer
'Debug.Print fonctionP(12)
resultat = fonctionP(12)

End Sub

Si tu as un problème pour faire l'appel à la fonction fais moi signe

Salut, merci pour ta réponse.

J'appelle la fonction comme ceci pour le même fichier,

Mais il me compte "0".

Je précise également que si possible, le nombre de caractères et leur organisation (espace, [ ], ...), qui peut être aléatoire, ne doit pas géner au compte des "packs" entre |, mais je pense que ta fonction considère ce détail.

Sub appeler()
i = 2
    Dim resultat As Integer
    'Debug.Print fonctionP(12)
    resultat = fonctionP(12)
    Sheets(1).Cells(i, 3).Value = resultat
End Sub

Function fonctionP(ByVal chaine As Variant) As Integer
    If TypeName(chaine) = "String" Then
        fonctionP = Len(chaine) - Len(Replace(chaine, "|", "")) + 1
    Else
        fonctionP = 0
    End If
End Function

Si tu peux me corriger,

En attendant je continue dessus

G.

Function fonctionP(ByVal chaine As Variant) As Integer
Dim texte As String: texte = CStr(chaine)
fonctionP = Len(texte) - Len(Replace(texte, "|", "")) + 1
End Function

Supposons que des données à analyser sont en colonne A (ie colonne 1)

Supposons que tu souhaites stocker le résultat en colonne B (ie colonne 2)

Sub balayage()
Dim i as integer
For i = 1 to 9999
Range("B" & i) = fonctionP(Range("A" & i))
next i
End sub

Range("B" & i) va générer Range("B1") puis Range("B2") puis Range("B3") etc...

Hello,

Merci, cela fonctionne bien sur le format indiqué.

Je me pose cette question :

- J'ai tenté sur un format de "packs" différents, mais avec un séparateur ";". = XX444444444444;XX444444444;

Donc j'ai ajusté la fonction comme il faudrait pour compter de la même façon.

Fichier : ci-joint.

Sub compteur_extensions_surPN()
    Dim i As Integer
        For i = 1 To Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
        Range("B" & i) = fonctionPPN(Range("A" & i))
        Next i
End Sub

Function fonctionPPN(ByVal chaine As Variant) As Integer
    Dim texte As String: texte = CStr(chaine)
        fonctionP = Len(texte) - Len(Replace(texte, ";", "")) + 1
End Function

Malheureusement, il me compte "0" quoi qu'il arrive.

Certainement une erreur de la syntaxe de ma part.

Si tu peux me corriger,

Merci, G.

8g2.xlsx (8.75 Ko)

Pas besoin du fichier pour savoir:

Function fonctionPPN(ByVal chaine As Variant) As Integer
'.......
fonctionP = Len(texte) - Len(Replace(texte, ";", "")) + 1
End Function

La fonction s'appelle fonctionPPN, et tu modifies la valeur de fonctionP, pas de fonctionPPN. Fin ^^

Sub compteur_extensions_surPN()
    Dim i As Integer
        For i = 1 To Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
        Range("B" & i) = fonctionPPN(Range("A" & i))
        Next i
End Sub

Function fonctionPPN(ByVal chaine As Variant) As Integer
    Dim texte As String: texte = CStr(chaine)
        fonctionPPN= Len(texte) - Len(Replace(texte, ";", "")) + 1
End Function
 

Raah

j'avais pas vu.

oui, j'ai renommé pour savoir ce que faisait la fonction, car j'appelle 20 macros dans un grand Sub.

Merci merci !!


Du coup, cela fonctionne bien désormais, par contre, sais-tu s'il est possible de corriger ceci :

Des fois, car la données n'est pas forcément super propre, j'ai une cellule qui se termine par un séparateur, et des fois non.

Du coup, pour deu cellules contenant les mêmes chaines, l'une avec séparateur au bout, l'autre non, il ne va pas compter le même résultat.

XX3333333333;CC55555555555555; = 3

XX3333333333;CC55555555555555 = 2

J'avais eu le même soucis avec la formule dans tableur :

'=SI(ESTTEXTE(E2),SOMMEPROD((NBCAR(E2)-NBCAR(SUBSTITUE(E2,"|",""))+1)),0)
Sub compteur_extensions_surPN()
    Dim i As Integer
        For i = 1 To Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
        Range("B" & i) = fonctionPPN(Range("A" & i))
        Next i
End Sub

Function fonctionPPN(ByVal chaine As Variant) As Integer
    Dim texte As String: texte = CStr(chaine)
        fonctionPPN = Len(texte) - Len(Replace(texte, ";", "")) + 1
End Function

Si ca peut aider, voici des éléments de fonction qui m'ont permis de cibler des éléments dans les chaines, par packs, en surmontant le soucis des séparateurs irréguliers.

Peut-être y a t'il un morceau de syntaxe utile.

G.

Sub nettoie()
 Dim i As Long

    For i = 2 To Sheets(1).Range("C" & Rows.Count).End(xlUp).Row
    Sheets(1).Cells(i, 4).Value = CleanText(Sheets(1).Cells(i, 3))
    Next i

 End Sub

Public Function CleanText(sText As String) As String
    Dim tbl1 As Variant, tbl2 As Variant, i As Long, x As String
        tbl1 = Split(Trim(sText), "|")
        x = ""
        For i = 0 To UBound(tbl1)
            tbl2 = Split(Trim(tbl1(i)), " ")
            x = x & tbl2(UBound(tbl2)) & ";"
        Next i
        CleanText = Replace(Replace(x, "[", ""), "]", "")
    End Function
Function fonctionPPN(ByVal chaine As Variant) As Integer
    Dim texte As String: texte = CStr(chaine)
        fonctionPPN = Len(texte) - Len(Replace(texte, ";", ""))
        fonctionPPN = IIf(Right(texte, 1) = ";", fonctionPPN, fonctionPPN + 1)
End Function

Si le dernier caractère est un ";" alors on ne fait pas +1, sinon on fait +1

Ca marche niquel, merci beaucoup !

G.

Rechercher des sujets similaires à "compteur elements entre separateur macro"