Conta stringhe



  • Conta stringhe
    di Rita (utente non iscritto) data: 16/10/2013 10:39:38

    Ciao a tutti
    esempio, in a1 ho una stringa con diverse parole, volevo sapere se esiste un modo per sapere se specificando una di queste c'e' la possibilita' di sapere quante volte la stringa si ripete e da che posizioni partono
    es.
    in a1 pippo pluto topolino pippo topolino
    se voglio cercare pippo mi dovrebbe restituire due ed eventualmente la posizione da cui partono (es. 1 e 22 vedi esempio)
    grazie anticipatamente



  • di Grograman (utente non iscritto) data: 16/10/2013 11:04:34

    Oggi sono pigro, non è mia, ma di un certo "Terry Kreft":

    in A1 metti la tua stringa, la sintassi in B1 diventa "=HowMany(A1;"pluto")"
     
    Function HowMany(Optional ByVal String1, Optional ByVal String2, Optional ByVal Compare As VbCompareMethod = vbBinaryCompare) As Integer
     
      Dim intStart As Integer
      Dim intCount As Integer
      Dim intInstr As Integer
     intCount = 0
     
      intStart = 1
     intInstr = InStr(intStart, String1, String2, Compare)
     
      Do While intInstr > 0
        intCount = intCount + 1
        intStart = intInstr + Len(String2)
        intInstr = InStr(intStart, String1, String2, Compare)
      Loop
     HowMany = intCount
     
    End Function



  • di Vecchio Frac data: 16/10/2013 11:14:00

    Eccoti un piccolo trucco con Len per contare le sottostringhe di una stringa data.
    La puoi inserire in una Function che accetti come ingresso sia la stringa intera che la sottostringa da cercare.
    Sul numero della posizione occupata da ogni sottostringa, te la puoi cavare con un piccolo ciclo Do.

    Oppure, utilizzando le RegEx, avresti un metodo più elegante e potente per fare tutto ciò.
    Se ti interessa posso anche mettere giù il codice necessario.
     
    'restituisce solo il numero di sottostringhe in una stringa data
    Len(Replace(stringa, testocercato, testocercato &  "*")) - Len(stringa)
    
    
    'questa versione restituisce anche la posizione delle sottostringhe nella stringa
    Function conteggio(stringa As String, sottostringa As String) As String
    Dim i As Long, count As Long, s As String
    
        i = InStr(stringa, sottostringa)
        Do While i
            count = count + 1
            s = s & i & ", "
            i = InStr(i + 1, stringa, sottostringa)
        Loop
        
        If count > 0 Then
            s = Left(s, Len(s) - 2)
            conteggio = count & " [" & s & "]"
        Else
            conteggio = "[Not found]"
        End If
    End Function






  • di Vecchio Frac data: 16/10/2013 11:15:11

    @Grò
    Scuoti la pigrizia e studia un metodo con le RegEx ^_^





  • di rita (utente non iscritto) data: 16/10/2013 11:16:16

    Ti ringrazio sembra funzionare
    una domanda
    in string1 inserisco la cella dove cercare e in compare cosa cercare
    ma string2 a che serve?
    seconda domanda
    per poter vedere da che posizione partono?



  • di RITA (utente non iscritto) data: 16/10/2013 11:18:34

    GRAZIE A TUTTI
    VECCHIO FRAC E' PROPRIO QUELLO CHE MI SERVE


  • occorrenze e posizioni
    di canapone data: 16/10/2013 11:18:52

    Ciao a tutti,

    uso le formule (ma viva il Vba!)

    In A2 la stringa, in B2 la sottostringa, in C2 per contare le occorrenze

    =(LUNGHEZZA(A2)-LUNGHEZZA(SOSTITUISCI(A2;B2;"")))/LUNGHEZZA(B2)

    Per le posizioni in D2 copiando la formula a sinistra.

    =SE.ERRORE(TROVA($B$2;$A$2;SE(RIF.COLONNA(A$1)<=$C$2;RIF.COLONNA(A$1);0));"")

    Allego un esempio


  • errore
    di canapone data: 16/10/2013 11:24:25


    Chiedo scusa, ma ho condiviso una formula - quella delle posizioni- che non funziona come pensavo.

    Se mi viene in mente qualcosa la pubblico.

    Un saluto agli amici del Forum



  • di Grograman (utente non iscritto) data: 16/10/2013 11:25:11

    :(

    Non le conosco le regex :(

    Ma sto per (sempre quando sconfiggo la pigrizia) comparmi un tomo di John walkenbach che spero mi dia una mano a imparare il vba :)


  • corretto formule posizione
    di canapone data: 16/10/2013 11:35:58

    Ciao a tutti,

    ho corretto le formule per le posizioni e riallegato file con esempi.

    In D2 (ho lasciato la vecchia formula, migliorabile)

    =SE.ERRORE(TROVA($B2;$A2;SE(C2>=1;1;0));"")

    in E2 e a destra

    =SE.ERRORE(TROVA($B2;$A2;SE(RIF.COLONNA(B$1)<=$C2;D2+1;0));"")

    Se servisse.

    Saluti



  • di Vecchio Frac data: 16/10/2013 11:46:17

    Ottimo canapone, l'esperto di formule è sempre benvenuto ^_^

    Per tutti, allego un esempietto con le regex, che sono delle cose orride da masticare ma che si rivelano molto potenti. Se serve, suggerisco il sito regexpal.com per esperimenti e studio (c'è una guida), anche se è tutto in inglese. Non è compatibile 100% con le espressioni regolari di VBA, ma è abbastanza affidabile (sul sito del mio amico nick r "E90E50" trovate moltissimi esempi e spiegazioni in italiano).
     
    Function conteggio_byregex(stringa As String, sottostringa As String) As String
    Dim re As Object, match As Variant, matchcoll As Variant
    Dim s As String
        
        Set re = CreateObject("VBScript.RegExp")
        re.Pattern = "(" & sottostringa & ")"
        re.IgnoreCase = True
        re.Global = True
        
        Set matchcoll = re.Execute(stringa)
        
        ReDim res(1, matchcoll.count) As Variant
        
        s = matchcoll.count
        
        If matchcoll.count > 0 Then
            s = s & " ["
            For Each match In matchcoll
                s = s & match.firstindex + 1 & ", "
            Next
            s = Left(s, Len(s) - 2) & "]"
        End If
        
        conteggio_byregex = s
    End Function






  • di Grograman (utente non iscritto) data: 16/10/2013 13:24:31

    Più che esperto è un mostro, dai miei appunti:


     
    ELENCO UNIVOCO BY CANAPONE
    
    =SE(VAL.ERRORE(INDICE($A$1:$A$8;PICCOLO(SE(VAL.NUMERO(CONFRONTA(RIF.RIGA($A$1:$A$8);CONFRONTA($A$1:$A$8;$A$1:$A$8;0);0));CONFRONTA($A$1:$A$8;$A$1:$A$8;0);"");RIGHE($A$1:A1))));"";INDICE($A$1:$A$8;PICCOLO(SE(VAL.NUMERO(CONFRONTA(RIF.RIGA($A$1:$A$8);CONFRONTA($A$1:$A$8;$A$1:$A$8;0);0));CONFRONTA($A$1:$A$8;$A$1:$A$8;0);"");RIGHE($A$1:A1))))
    



  • di Vecchio Frac data: 16/10/2013 14:12:46

    Lo è ^_^
    La formula è troppo lunga e non si vede tutta.
    Per copincollarla ho dovuto inventarmi di selezionare anche la riga vuota sottostante :P





  • di RITA (utente non iscritto) data: 16/10/2013 14:14:06

    In ogni caso grazie a tutti