Compter le nombre de voyelles grâce à des Array?
Bonjour à tous,
Novice en VBA, je bute sur un problème que je me suis adressée à moi-même.... donc peut être insoluble mais j'aimerais bien avoir l'avis de personnes plus expérimentées.
Il s'agit de créer une fonction VOWEL qui compte le nombre de voyelles d'une cellule. Par exemple si j'ai en C4 "Exemple", la fonction VOWEL(C4) doit renvoyer 3. Je sais comment résoudre le problème avec des combinaisons de Len et de Len(Replace) ainsi qu'avec des fonctions Mid, mais j'aimerais savoir si c'est possible de résoudre le problème avec des Array. (afin de m'entraîner à utiliser des Array).
J'ai voulu écrire ce code, qui bien sûr ne marche pas, et j'aimerais savoir pourquoi. En gros mon idée était de créer une array qui me donnerait pour chaque voyelle (version majuscule et minuscule) le nombre de fois qu'elle apparaît dans la cellule sélectionnée. Ceci me permettrait de choisir les lettres que je veux et d'adapter plus facilement ma fonction si par exemple je décidais d'enlever certaines voyelles etc.
Function VOWEL(SelectedRange As Range)
Dim MyArray As Variant
Dim MyArrayCount As Variant
Dim i As Integer
MyArray = Array("A", "a", "e", "E", "i", "I", "O", "o", "U", "u", "Y", "y")
For Each i In MyArray
MyArrayCount(i) = Len(SelectedRange) - Len(Replace(SelectedRange, "i", ""))
Next i
VOWEL = WorksheetFunction.Sum(MyArrayCount)
End Function
Le problème, c'est que j'ai l'impression de m'embrouiller totalement entre mes deux tableaux, je ne sais même pas si c'est censé être un tableau à une entrée, à plusieurs entrées, deux tableaux....bref je suis perdue et n'ai pas tellement l'esprit informatique .. toute aide et explication serait donc précieuse !
Merci d'avance !
Bonsoir,
à â é è ê ë î ï ô ù ?
et œ æ ? (à compter pour 2 ?)
Ceci pour le français (si tu envisages des textes d'autres langues latines, il y a d'autres voyelles accentuées... mais il faudrait peut-être en ajouter pour prendre en compte la présence éventuelle de mot empruntés... ?)
Peut-être serait-il plus pratique de travailler avec les codes ?
Cordialement.
Bonsoir
Une proposition sans Array.
Function VoW%(Z$)
Dim AllC$, i%, iTT
Application.Volatile
AllC = "[AaEeIiOoUuYy]"
For i = 1 To Len(Z)
iTT = IIf(Mid(Z, i, 1) Like AllC, iTT + 1, iTT)
Next
VoW = iTT
End FunctionIci la fonction ne renvoie que le nombre total de voyelles.
Pour avoir le détails de chaque voyelle dans un tableau on peux effectivement utiliser un array a 2 dimension qui renverra en petit tableau avec le nombre de chaque caractère...
A+
[EDIT] Ferrand, Sorry...
Salut Galopin
Je tiens à mes accents !
Function NBVOY(tx As String) As Integer
Dim Tcar(1 To 255) As Integer, i%
Application.Volatile
If tx <> "" Then
Do
Tcar(Asc(tx)) = Tcar(Asc(tx)) + 1
tx = Right(tx, Len(tx) - 1)
Loop While Len(tx) > 0
For i = 1 To 255
If Tcar(i) > 0 Then
Select Case i
Case 1 To 139
Select Case i
Case 65, 69, 73, 79, 85, 89, 97, 101, 105, 111, 117, 121
Case Else
Tcar(i) = 0
End Select
Case 140 To 191
Select Case i
Case 140, 156
Tcar(i) = Tcar(i) * 2
Case Else
Tcar(i) = 0
End Select
Case Else
Select Case i
Case 198, 230
Tcar(i) = Tcar(i) * 2
Case 199, 208, 209, 215, 216, 222, 223, 231, 240, 241, 247, 248, 254
Tcar(i) = 0
End Select
End Select
End If
Next i
End If
NBVOY = WorksheetFunction.Sum(Tcar)
End FunctionCordialement.
Bonjour à tous,
Et une nouvelle fonction.
Cdlt.
Public Function COUNT_VOWELS(strText As String) As Integer
Const vowels As String = "aàâeéèëêiîïoôuûùy"
'œ æ
Dim I As Long
For I = 1 To Len(strText)
If InStr(1, vowels, Mid$(strText, I, 1), vbTextCompare) Then _
COUNT_VOWELS = COUNT_VOWELS + 1
Next I
End Functionbonsoir,
Cette autre exemple renvoie le détail pour chaque caractères : Je n'ai utilisé que les voyelles non accentuées mais (moyennant quelques retouches sur le dimensionnement de Arr) on pourrait détailler la totalité de l'alphabet minuscule, majuscule, caractères accentués ou pas, espaces, ponctuation ou nombre dans toute une phrase ça ne ferait pas de différence...
La macro dispatche le contenue de la cellule A1en colonne GH
Option Explicit
Option Compare Binary
Sub VoW()
Dim S$, Z$, i%, ii%, Arr(1 To 12, 1 To 2)
S = [A1]
Z = "AaEeIiOoUuYy"
For i = 1 To 12
Arr(i, 1) = Mid(Z, i, 1)
Next
For i = 1 To Len(S)
For ii = 1 To 12
If Mid(S, i, 1) = Arr(ii, 1) Then Arr(ii, 2) = Arr(ii, 2) + 1
Next
Next
Range("G1:H12") = Arr
End SubA+
12 voyelles non accentuées, 49 accentuées, 4 ligatures à compter double.
Function NBVOC(tx As String) As Integer
Dim Txx() As Integer, n%, i%
Application.Volatile
If tx <> "" Then
n = Len(tx): ReDim Txx(1 To n): tx = LCase(tx)
For i = 1 To n
Select Case Asc(Mid(tx, i, 1))
Case 97, 101, 105, 111, 117, 121, 224 To 229, 232 To 239, 242 To 246, 249 To 253, 255
Txx(i) = 1
Case 156, 230
Txx(i) = 2
End Select
Next i
Else
NBVOC = 0: Exit Function
End If
NBVOC = WorksheetFunction.Sum(Txx)
End FunctionPlus compactée...
Super, merci beaucoup, c'est exactement ce que je cherchais ! La formule sans Array est un peu plus élégante, mais celle-là me permet d'avoir le détail.
Très bonne soirée
galopin01 a écrit :bonsoir,
Cette autre exemple renvoie le détail pour chaque caractères : Je n'ai utilisé que les voyelles non accentuées mais (moyennant quelques retouches sur le dimensionnement de Arr) on pourrait détailler la totalité de l'alphabet minuscule, majuscule, caractères accentués ou pas, espaces, ponctuation ou nombre dans toute une phrase ça ne ferait pas de différence...
La macro dispatche le contenue de la cellule A1en colonne GH
Option Explicit Option Compare Binary Sub VoW() Dim S$, Z$, i%, ii%, Arr(1 To 12, 1 To 2) S = [A1] Z = "AaEeIiOoUuYy" For i = 1 To 12 Arr(i, 1) = Mid(Z, i, 1) Next For i = 1 To Len(S) For ii = 1 To 12 If Mid(S, i, 1) = Arr(ii, 1) Then Arr(ii, 2) = Arr(ii, 2) + 1 Next Next Range("G1:H12") = Arr End SubA+