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.
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 SubSi 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 FunctionSi 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 FunctionSupposons 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 subRange("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 FunctionMalheureusement, il me compte "0" quoi qu'il arrive.
Certainement une erreur de la syntaxe de ma part.
Si tu peux me corriger,
Merci, G.
Pas besoin du fichier pour savoir:
Function fonctionPPN(ByVal chaine As Variant) As Integer
'.......
fonctionP = Len(texte) - Len(Replace(texte, ";", "")) + 1
End FunctionLa 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 FunctionSi 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 FunctionFunction 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 FunctionSi le dernier caractère est un ";" alors on ne fait pas +1, sinon on fait +1
Ca marche niquel, merci beaucoup !
G.