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
4 Réponses :
Au lieu de votre boucle, j'utiliserais une seule instruction comme (de ici ) p> p>
Set regEx = New RegExp A="DogCatDogCatDogCatDogCatDogCatDogCatDogCatDogCatDogCatDogCat" regEx.Pattern = "dog" regEx.IgnoreCase = True regEx.Global = True Set MyMatches = regEx.Execute(A) Msgbox MyMatches.Count
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 code> code> des déclarations en haut de votre module? option base1 code>? 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 Code> ...
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é b>! 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 :-)
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
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 b>? 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 code> 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 B>?
@ 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 B>. 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" code>, puisque
totcount code> est déclaré
comme long code> ... pas besoin de Sélectionnez B> 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.
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
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 ...