XL 2013 [ Résolu ] extraire le caractère le plus présent dans une chaîne de caractères

Tiger75

XLDnaute Nouveau
Bonjour,
Je suis débutant en VBA et je cherche un code qui me peut me permettre d'extraire un mot qui est le plus présent dans une chaîne de caractères en ignorant certains caractères dans une cellule.
Exemple :
Dans ma cellule :
pomme
OU
pomme
OU
orange
OU
orange
OU
poire
OU
pomme
pomme

je voudrai mettre pomme dans une variable et ne plus l'afficher dans ma chaine de caractère et ne pas prendre en compte OU comme mot

Merci d'avance
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonjour

Une possibilité en pièce jointe, avec une formule matricielle à valider avec Ctrl+maj+entrer, ne répondant que partiellement à ton besoin : Elle donne dans D1 le caractère le plus présent dans le terme dans A1, sans aucune élimination.

@ plus

P.S : B1 et D1 sont indépendants.
 

Pièces jointes

  • Tiger75.xlsx
    9.1 KB · Affichages: 57

Tiger75

XLDnaute Nouveau
Bonjour

Une possibilité en pièce jointe, avec une formule matricielle à valider avec Ctrl+maj+entrer, ne répondant que partiellement à ton besoin : Elle donne dans D1 le caractère le plus présent dans le terme dans A1, sans aucune élimination.

@ plus

P.S : B1 et D1 sont indépendants.
Bonjour,
Merci pour la rapidité de ta réponse, mais je cherche un code VBA ... mais merci quand même
 

CISCO

XLDnaute Barbatruc
Bonjour

Itou en éliminant certains caractères, mais toujours avec une formule matricielle. Pour ce qui est de la macro, vu mon niveau actuel en VBA, cela sera pour dans quelques mois...

@ plus
 

Pièces jointes

  • Tiger75bis.xlsx
    9.4 KB · Affichages: 28

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Une fonction: Function TopMot(xrg As String, ParamArray exclus()) As String
  • xrg est la chaine de recherche
  • exclus() est une liste de mots à exclure de la recherche
TopMot retourne :
  1. soit le mot le plus répété dans xrg
  2. soit un string vide s'il n'y a pas de mot dans la chaine de recherche (sauf les mots exclus)
  3. soit le string "+++" s'il y a plusieurs mots répétés de même fréquence max
Cette fonction est utilisable soit dans une feuille de calcul , soit en VBA.
  • sur une feuille Excel, le séparateur des paramètres est le point-virgule
  • en VBA, le séparateur des paramètres est la virgule

nota: la fonction est insensible à la casse
 

Pièces jointes

  • Tiger75- TopMot- v1.xlsm
    19.3 KB · Affichages: 47
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Tiger75, CISCO, mapomme,

En complément de l'excellent travail de mapomme.

Cette solution liste dans une ListBox les fréquences des mots de la plage sélectionnée :
Code:
Private Sub Combobox1_Change()
If ComboBox1.ListIndex = -1 Then ComboBox1 = 1
ActiveCell.Activate
If ActiveSheet.Name = Me.Name Then [F1] = Val(ComboBox1): Worksheet_SelectionChange Selection
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim n%, P As Range, d As Object, t, ncol%, i&, j%, x$, s, k%, a, b, c()
n = Val(ComboBox1)
[K1] = 0: ListBox1.ListFillRange = "" 'RAZ
Cells.FormatConditions.Delete 'RAZ MFC
If Application.CutCopyMode Then Exit Sub 'permet le copier-coller
Set P = Intersect(Selection, Me.UsedRange)
If P Is Nothing Then Exit Sub
P.FormatConditions.Add xlExpression, Formula1:="=1" 'création de la MFC
P.FormatConditions(1).Interior.ColorIndex = 1 'noir
P.FormatConditions(1).Font.ColorIndex = 2 'police blanche
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For Each P In P.Areas
  t = P.Resize(P.Rows.Count + 1) 'au moins 2 éléments
  ncol = UBound(t, 2)
  For i = 1 To UBound(t) - 1
    For j = 1 To ncol
      x = Replace(Replace(Replace(CStr(t(i, j)), ".", ""), ",", ""), "'", "' ")
      s = Split(Replace(x, Chr(10), " "))
      For k = 0 To UBound(s)
        If Len(s(k)) >= n Then d(s(k)) = d(s(k)) + 1
Next k, j, i, P
If d.Count = 0 Then Exit Sub
a = d.Items: b = d.Keys
ReDim c(UBound(a), 1) 'base 0
For i = 0 To UBound(a)
  c(i, 0) = a(i)
  c(i, 1) = b(i)
Next
With Feuil3.[A1].Resize(i, 2) 'CodeName
  .EntireColumn.ClearContents
  .Value = c
  .Sort .Columns(1), xlDescending, .Columns(2), , xlAscending, Header:=xlNo 'tri
  ListBox1.ListFillRange = .Address(External:=True)
End With
[K1] = d.Count
End Sub
Edit : ajouté une MFC (noire) pour bien marquer la plage sélectionnée.

Fichier joint avec 2 bases à étudier.

A+
 

Pièces jointes

  • Fréquences des mots(1).xlsm
    2.4 MB · Affichages: 295
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir Tiger75,

Suite à ton MP:
(...) dans ton code au lieu des "+++" est-il possible de mettre les plus mots qui reviennent le plus souvent s'il y a plusieurs mots répétés de même fréquence max (...)
j'aimerai afficher pomme et poire dans ce cas là.
mais si la fréquence max est 1 je veux garder ton "+++"

Voir la version v2.
 

Pièces jointes

  • Tiger75- TopMot- v2.xlsm
    20.8 KB · Affichages: 40

Discussions similaires

Statistiques des forums

Discussions
312 069
Messages
2 085 042
Membres
102 765
dernier inscrit
richdi