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 Function

Ici 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 Function

Cordialement.

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 Function

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 Sub

A+

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 Function

Plus 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 Sub

A+

Rechercher des sujets similaires à "compter nombre voyelles array"