0
votes

VBA comptant des substrings dans une chaîne sur une gamme

J'ai travaillé sur une feuille de calcul dans Excel et j'essaie d'obtenir un nombre précis de sous-chaînes dans une chaîne sur une gamme. Je suis en train d'utiliser des colonnes C et D qui ont un texto que vous ajoutez le code suivant pour obtenir un certain nombre d'occurrences de mots particuliers et les totaliser dans la colonne H en utilisant une fonction publique. Je ne peux pas obtenir le code pour couvrir une plage et ramener la réponse. Peut-être qu'il y a une meilleure façon.

Option Compare Text

Function CountString(FullString As String, PartialString As String) As Integer

Dim cnt As Integer

cnt = 0
For i = 1 To Len(FullString)

If Mid(FullString, i, Len(PartialString)) = PartialString Then

cnt = cnt + 1

End If
Next i

CountString = cnt

End Function


3 commentaires

Pouvez-vous mieux expliquer ce que vous voulez dire avec "Je ne peux pas obtenir le code pour couvrir une gamme et ramener la réponse."?


Toutes mes excuses, je voulais dire comme dans cela s'applique à une cellule où je souhaite appliquer la recherche Sub String à la fois en C8: D8, par exemple et trouvez le mot sur une plage.


Ensuite, vérifiez mon code, qui devrait être exactement que ...


4 Réponses :


2
votes

Au lieu de votre boucle, j'utiliserais une seule instruction comme xxx

(de ici )


0 commentaires

3
votes
Set regEx = New RegExp
A="DogCatDogCatDogCatDogCatDogCatDogCatDogCatDogCatDogCatDogCat"
regEx.Pattern = "dog" 
regEx.IgnoreCase = True
regEx.Global = True
Set MyMatches = regEx.Execute(A)
Msgbox MyMatches.Count

9 commentaires

Mais cela répondra à 11 au lieu de 10 et 1 au lieu de 0 ... Devriez-vous supprimer le +1? :-)


@Corrado Barbero: Cela ne devrait pas ... Split renvoie un tableau à base de zéro. Je voulais poster exactement la même approche, mais j'ai trouvé cette réponse. Avez-vous une autre option des déclarations en haut de votre module? option base1 ? Je vous suggère de tester la fonction dans un nouveau module de test. Mais si dans votre cas (particulier), il revient de cette manière, vous vous adaptez simplement: CountString = Ubound (Splitstring (Fullstring, partialstring)) - 1 ...


Attendez une seconde, mon commentaire concernant le "+1" était pour une version du code ci-dessus qui s'est terminée par "+1" qui a maintenant été modifiée pour la supprimer.


Je suis confus, la solution ci-dessus (CatdogCat) fonctionne sans ajouter 1, même si Split crée un tableau à 0 base, car un élément vide supplémentaire est créé à la fin de la matrice ... Donc, lorsque vous trouvez 10 "séparateurs", 11 éléments sont créés, 0 à 10 ... J'ai testé dans un nouveau fichier vide sans aucune option


Cela a en réalité un sens, puisqu'un nouveau "séparateur" est considéré comme suivi d'un certain contenu. Mais c'est très déroutant.


@Corrado Barbero: Pas vraiment ... Si vous avez deux éléments séparés par une virgule, lorsque vous les divisez comme dans la fonction, pas l'élément de tableau est compté ! L'intervalle entre les éléments est compté, car le séparateur de chaîne doit être retourné ... :)


Merci faneduru, je suis un peu le type têtu ... Vous voulez dire que si nous compterions les éléments dont nous aurions besoin d'ajouter 1 en raison de la marée zéro, tandis que, comme nous comptons les séparateurs ... nous n'avons pas t faut. Est-ce?


@Corrado Barbero: Oui, c'est. Mais si vous ne me tagiez pas (@faneduru), je ne suis pas notifié que vous m'avez adressé ...


@FANEDURU: NEWBIE erreur :-)



1
votes

Tout le crédit pour le code suivant doit aller à @mark. Mais, si sur certaines installations, le code renvoie mal, veuillez utiliser la variante suivante:

    Sub countStringsInRangeBis()
       Dim sh As Worksheet, rng As Range, TotCount As Long, cel As Range, strSearch As Variant
       
       strSearch = Split("Dog,Cat", ",") 'or Array("Dog", "Cat")
       Set sh = ActiveSheet ' use here your sheet
       
       Set rng = sh.Range("C8:D8") 'use here whatever range you need
       For Each cel In rng
            TotCount = TotCount + CountStringArr(cel.Value, strSearch)
       Next
       Debug.Print TotCount
    End Sub


14 commentaires

Désolé de ne pas comprendre ici, j'essayais d'appliquer le processus à une gamme par exemple. C8: D8 plutôt qu'à une seule cellule, mais lorsque j'essaie de le faire, cela ne fonctionne que sur une seule cellule C8 par exemple. Soyez doux, ma tête est écrasée maintenant. :-)


J'ai également gêné d'utiliser des heures d'heures et d'heures hier, mais donnez-moi seulement un nombre d'une par cellule, quel que soit le nombre d'occurrences de la chaîne sous une cellule. Grrrrrrr


@ vbvirg20: Avez-vous besoin le nombre total de comptes sur la plage totale ? Pas pour chaque valeur de cellule? Vous n'avez présenté que la fonction comptant les événements dans une chaîne ...


@ VBVirg20: Veuillez vérifier le code mis à jour, indiquant comment compter les occurrences dans une plage. Veuillez confirmer que cela fait ce dont vous avez besoin.


Je pensais que je l'ai compris, mais je ne l'ai pas fait. Pourriez-vous partager la deuxième ligne de la fonction.


@ vbvirg20: cette ligne ne fait rien pour 99 ordinateurs de 100, mais si vous regardez à un commentaire ci-dessus (Corrado Barbero), je pensais au départ que c'était vous, plaint que, dans son cas, la fonction (sans la ligne ajoutée) renvoie une nouvelle occurrence . Je pense qu'il hache Base d'option 1 en haut du code du module. Mais j'ai ajouté la ligne de discussion afin d'éviter également une telle situation, le cas échéant, je n'ai pas compris le prochain numéro: Le code fait-il ce dont vous avez besoin ou non ?


@ vbvirg20: la signification de cette ligne serait: si le résultat calculé pour une chaîne doit être 1 est 2 (pour le cas que j'ai mentionné ci-dessus), diminue ensuite le résultat calculé avec une unité ... En d'autres termes, il est une sorte d'étalonnage.


Cela fonctionne comme un rêve, merci beaucoup pour votre temps et votre aide :-)


Une autre question, si je voulais changer cela en un tableau de mots, je changerais simplement la fonction de Fullstring en tant que chaîne et partielle à la chaîne en variantes et changez strSearch = arrêté ("chien", "chat") ??


@ VBVirg20: Il y aurait deux approches: 1. Envoyez chaque élément de tableau à la fonction tel quel ou 2. Je peux adapter la fonction pour accepter un tableau comme argument. Que préfères-tu?


@ vbvirg20: Mais avez-vous besoin de compter les deux ensemble. Est-ce que ma compréhension est correcte? Sinon, comment interpréteriez-vous le répartition éventuel pour être retourné? Et maintenant, je peux voir que vous avez changé d'avis et non cochées la case à cocher acceptée . Est-ce quelque chose de mal avec la réponse tel qu'il était, faisant référence à votre question?


@ VBVirg20: Vous avez essayé de modifier ma réponse, essayant d'insérer votre code (faux) ne fonctionne pas. Ce n'est pas une façon normale d'agir. Si vous avez quelque chose que vous ne comprenez pas, vous supposez que le code ci-dessus a un bogue, veuillez éditer votre question, postez le code que vous appréciez n'est pas bien traité par le code et que vous m'agitez ici pour vous aider. Vous n'avez pas confirmé, au moins, que le comptage doit être fait pour les deux ensemble, même si je l'ai posé à ce sujet. Votre code devrait soulever une erreur sur la ligne totcount = "0" , puisque totcount est déclaré comme long ... pas besoin de Sélectionnez n'importe quoi dans votre code!


Ah bien d'excuses excuses de ma faute et merci pour le conseil. Je vais aller et tester en conséquence.


J'ai testé à l'aide du code d'origine, mais je n'ai pas pu l'amener à fonctionner avec la plage correcte, par exemple C2: E4000, s'il y avait 2 cordes qui ont dit chien dans chaque rangée, car il a plus poussé dans la feuille de calcul quand je ne trouve que quelque chose vient de se rendre négatif numérotage. Je pense à une erreur utilisateur en mon nom.



-1
votes

Nombre de substrings (dans une plage)
Function countString(SourceString As Range, _
                     ByVal SubString As String, _
                     Optional ByVal ignoreCase As Boolean = False) _
         As Long
    
    Dim Data As Variant, Curr As Variant
    Dim i As Long, j As Long, Result As Long, iCase As Long
    
    If ignoreCase Then iCase = 1
    
    Data = SourceString.Value
    If IsArray(Data) Then
        GoSub CaseArray
    Else
        GoSub CaseValue
    End If
    
    countString = Result
    
    Exit Function

CaseArray:
    For i = 1 To UBound(Data)
        For j = 1 To UBound(Data, 2)
            Curr = Data(i, j): GoSub countValue
        Next j
    Next i
    Return

CaseValue:
    Curr = Data: GoSub countValue
    Return

countValue:
    If Not IsError(Curr) Then
        Result = Result + UBound(Split(Curr, SubString, , iCase))
 '       Result = Result + (Len(Curr) _
               - Len(Replace(Curr, SubString, "", , , iCase))) / Len(SubString)
    End If
    Return
  
End Function


0 commentaires