2010-11-15 17 views
1

J'ai une grande liste de chaînes de texte. Je sais que certaines chaînes se produisent plus d'une fois dans cette liste. La fréquence avec laquelle les chaînes se produisent se trouve dans la colonne suivante.Comment lister toutes les positions d'une variable dans une liste?

Maintenant, disons que la chaîne de texte "bonjour" se produit 17 fois. Comment pourrais-je obtenir toutes les positions de ce texte dans la liste?

Toute aide est appréciée.

+0

Quel genre de liste utilisez-vous? Depuis que vous dites "colonne", je suis maintenant suspect que ce peut être un ListBox, est-ce exact? –

+0

Bonjour Tony, c'est juste une colonne avec des chaînes de texte. Chaque cellule de cette colonne contient 1 chaîne. – Pieter

Répondre

1

Asuming que toutes vos chaînes sont dans une colonne, vous pouvez ajouter une deuxième colonne avec leur position (numéro de ligne) et faire un tableau croisé dynamique sur les cordes affichant les chefs d'accusation. Pour obtenir la position d'une chaîne qui vous intéresse, utilisez la fonction de zoom de la table pivotante (double-cliquez sur le nombre à côté d'une chaîne) pour créer une nouvelle feuille avec tous les détails dossiers - et la position est affichée

espoir qui aide

Bonne serrure

EDIT après les commentaires échangés:

Je pencherais pour une solution qui scanne vos données seulement 1 fois et non récursive , copie valeurs à une ing seconde feuille:

for each string in sourcetable 
    if found in targettable 
     increase targettable.counter by 1 (remark: in column_2) 
    else 
     put sourcetable.string at end of targettable 
     put "1" in targettable.counter (remark: occurence = 1 in column_2) 
    endif 
    put sourcetable.index into targettable.column(counter+2) 
next 

jusqu'à présent métacode .... avez-vous besoin de plus d'aide au code VBA en fait cela?

EDIT 2

OK .... fait une & rapide sale ....

Sub CountString() 
Dim S As Range, T As Range, Idx As Long, Jdx As Long 

    Set S = Worksheets("Sheet1").[A2] ' first row is header 
    Set T = Worksheets("Sheet2").[A2] ' first row is header 
    Idx = 1 

    Do While S(Idx, 1) <> "" 
     Jdx = FindInRange(T, S(Idx, 1)) 
     If T(Jdx, 1) = "" Then 
      T(Jdx, 1) = S(Idx, 1) 
      T(Jdx, 2) = 1 
      T(Jdx, 3) = Idx 
     Else 
      T(Jdx, 2) = T(Jdx, 2) + 1 
      T(Jdx, T(Jdx, 2) + 2) = Idx 
     End If 
     Idx = Idx + 1 
    Loop 
End Sub 

Function FindInRange(R As Range, A As String) As Long 
Dim Idx As Long 

    Idx = 1 
    Do While R(Idx, 1) <> "" 
     If R(Idx, 1) = A Then 
      Exit Do 
     End If 
     Idx = Idx + 1 
    Loop 
    FindInRange = Idx 
End Function 

testé avec 500 mots de "Lorem ipsum" - prend supérieure à 1 seconde sortie en sheet_2 ressemble

String  Count Position ...               
Lorem  1  1               
ipsum  6  2  45  65  232  323  462     
dolor  5  3  42  214  321  335       
sit   6  4  79  148  249  295  415     
amet   6  5  80  149  250  296  416     
consectetur 8  6  117  288  298  396  457  473  486 
adipiscing 3  7  180  402           

espoir qui aide

+0

Salut Mike, merci pour votre suggestion, mais ma liste a des milliers d'entrées .. Je suis vraiment à la recherche d'un moyen de le faire automatiquement plutôt que manuellement. – Pieter

+0

OK ... donc si un pivot que vous créez une fois puis rafraichissez (d'une pression sur une touche) ne fait pas l'affaire, comment voulez-vous l'avoir fait? vous entrez une chaîne dans une zone de saisie et voulez un résultat du formulaire "trouvé ### fois", ou vous voulez une chaîne de liste/compte .... pouvez-vous élaborer un peu? – MikeD

+0

Disons simplement que la colonne A se compose de quelques milliers de chaînes, qui peuvent être uniques ou non à cette colonne. Leur position dans la colonne doit cependant être préservée, donc le tri n'est pas une option. La colonne B montre la quantité de fois où la chaîne particulière de cette ligne se trouve dans la colonne A. Ma solution idéale serait, avec les paramètres de A et B, de trouver une liste dans les colonnes C à n, où chaque élément de cette liste est égale aux numéros de ligne de toutes les chaînes égales à celui de A. Espérons que cela est clair .. désolé pour le formatage, les commentaires ne permettent pas de paragraphes .. – Pieter

1

Pieter,

Check out this post of Stack Overflow. J'ai également essayé d'ajuster leur code d'échantillon pour correspondre à votre cas, je suis désolé cependant que cela peut ne pas compiler, je ne peux pas le tester pour le moment et mon VBA est un peu rouillé, mais vous avez l'idée.

Function CheckValues1(byval columnToCheck as Integer, byval stringToFind as String) as Integer() 
    dim rwIndex As Integer 
    dim index as Integer 
    dim occurrences() As Integer 
    index = 0 

    For rwIndex = 0 to Cells(Rows.Count, columnToCheck).End(xlUp).Row 

     ReDim Preserve occurrences(0 to index) 

     If Cells(rwIndex, columnToCheck).Value = stringToFind Then 
      occurrences(index) = rwIndex 
      index = index + 1 
     End If 

    Next rwIndex 

    dim output as String 
    output = output & (Len(occurrences)-1) & " occurrences found." & vbcrlf & vbcrlf 
    For index = 0 to LBound(occurrences) 

     output = output & "Line: " & index & vbcrlf 

    Next index 
    MsgBox output 

End Sub 

Cette fonction retourne un tableau de toutes les occurences pour lesquels vous pouvez gérer mais votre comme. Vous avez juste besoin de passer dans la chaîne que vous recherchez et le numéro de colonne à rechercher à l'intérieur.

J'espère que cela aide!

Tony

+0

Merci pour cette réponse étendue. Pour l'instant ça ne marche pas encore (j'obtiens une erreur # value!) Mais je vais continuer à bricoler et à rapporter demain. – Pieter

+0

Salut Tony, essayé de faire ce travail mais en vain .. Dans ma feuille de calcul, j'ai entré = CheckValues1 (7, G1); les cordes sont dans la colonne G. Mes compétences VBA ne sont en aucun cas suffisantes, donc j'apprécierais vos idées à ce sujet: autant que je peux voir le programme passe par toutes les cellules de la colonne et vérifie si leur valeur est égale à la cellule actuelle. Mais que se passe-t-il si c'est vrai? Faux? Où le programme donne-t-il instruction à la fonction d'imprimer le tableau des positions? Et que fait 'occurances (index)'? Merci. Ps: J'ai supprimé le '=' après le '<>' dans le code. – Pieter

+1

Bonjour Pieter, je suis désolé mais j'ai du mal à fournir suffisamment d'informations. Mes compétences VBA ne vont pas plus loin que l'accès, je n'ai jamais utilisé Excel avec VBA. Occurrences (index) ajoute essentiellement le numéro de ligne au tableau des occurrences. J'ai ajouté le code à imprimer à une boîte de message pour montrer votre comment. –