Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Trovare parte di testo in celle e contare quante volte compare

Ultimo Aggiornamento: 01/03/2018 18:34
Post: 8
Registrato il: 17/06/2016
Città: MILANO
Età: 45
Utente Junior
2013
OFFLINE
26/02/2018 09:34

Ciao a tutti!
Io avrei necessità di controllare se una serie di termini compare in una serie di celle; se poi questi termini compaiono, contare quante volte ci sono (e NON in quante celle). In realtà penso di aver già sistemato la prima parte, ma mi manca la seconda.

Con una formula come questa =CONTA.SE($A$1:$A$2;"*"&F2&"*") controllo se i termini che io ho messo ci sono, ma il risultato che ottengo è vedere in quante celle compaiono questi termini. Ad esempio un termine potrebbe ricorrere 2 volte in A1 e 5 in A2 e il risultato che otterrei sarebbe comunque 2 perché appunto i termini compaiono in 2 celle. Ciò che vorrei ottenere io sarebbe invece 7. Come posso fare secondo voi? Grazie mille!
Elio
Post: 2.707
Registrato il: 03/04/2013
Utente Veteran
Excel 2000 - 2013
OFFLINE
26/02/2018 10:19


... Come posso fare secondo voi? ...



Potresti iniziare con l'allegare un file (senza Dati sensibili) con alcuni Record significativi già inseriti e chiarissi ciò che desideri ottenere.



Giuseppe

Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 8
Registrato il: 17/06/2016
Città: MILANO
Età: 45
Utente Junior
2013
OFFLINE
26/02/2018 11:10

Ciao Giuseppe,
hai ragione chiedo scusa per la mancanza di contesto. Allego il file: in breve, ci sono 2 celle con del testo (A2 e A3); ho inserito in f2 e f3 alcuni termini che vorrei vedere se presenti nel testo. In particolare F3, "investimen", ricorre 3 volte ma il risultato che ho io in G3 è 2, ossia il numero di celle in cui questi termini compaiono. La mia domanda è: come faccio a contare quante volte i termini che contengono "investim" compaiono?
Grazie di nuovo
Post: 1.825
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
26/02/2018 11:26

Ciao
non ho visto il tuo file, ma provo a suggerirti quanto segue:

ponendo in A1 la stringa intera e in B1 la stringa da cercare:

=(Lunghezza(A1)-Lunghezza(Sostutuisci(A1;B1;"")))/Lunghezza(B1)

Ricordo che Substitute è "case sensitive" (ovvero distingue maiuscole da minuscole), Nel caso utilizzare Maiusc()

saluti
[Modificato da dodo47 26/02/2018 11:27]
Domenico
Win 10 - Excel 2016
Post: 2.060
Registrato il: 21/03/2008
Città: LOCATE VARESINO
Età: 76
Utente Veteran
2007 / 13
OFFLINE
26/02/2018 11:30

ciao
UDF da inserire in un modulo standar


Option Explicit
Function ContaTermini(ByVal cella As Range, STRtermini As String) As Long
Dim Ntermini() As String
Ntermini = Split(cella, STRtermini)
ContaTermini = UBound(Ntermini)
End Function



utilizzo nel tuo caso ess.
in B1=contatermini(A1;"investim")

plutoinvestim pippo pluto pippo pluto investim pippo pluto pippo investim pluto pippoinvestim 4
Ciao da locate
excel 2007 / 13
Post: 2.710
Registrato il: 03/04/2013
Utente Veteran
Excel 2000 - 2013
OFFLINE
26/02/2018 23:45

Buona sera, Eyah78;
se non hai ancora risolto, prima di proporti un Codice VBA, vorrei chiederti un paio di  chiarimenti:
-    Di quanti Record (Righe) stiamo parlando.
-    Quante sono le "Substring" da trattare; attualmente sono solo due.

Ho testato il tuo esempio con un Codice VBA vergognosamente contorto ma se il risultato finale è corretto potrei cercare di migliorarlo; dal tuo esempio il mio risultato sarebbe 5 (3 "investim" e 2 "comun"), non so se questo sia compatibile con le tue aspettative.


A disposizione.

Buona serata.

Giuseppe

Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 9
Registrato il: 17/06/2016
Città: MILANO
Età: 45
Utente Junior
2013
OFFLINE
27/02/2018 12:18

Ciao a tutti! e grazie per le vostre risposte utilissime :)
In realtà, ho risolto solo per metà.

Con questa formula
=SE(CONTA.SE($A$2;"*"&F2&"*");(LUNGHEZZA($A$2)-LUNGHEZZA(SOSTITUISCI($A$2;$F2;"")))/LUNGHEZZA(F2);"0")

sono riuscito a far si che il risultato che ottengo è che conto quante volte un termine appare nel testo (se presente).

Il problema, come appunto anticipava Giuseppe è che ho potenzialmente centinaia di righe in cui è presente del testo e magari una decina di "substrings" da controllare.

Io ho provato questa soluzione ad esenpio

=SE(CONTA.SE($A$2:$A$100;"*"&F2&"*");(LUNGHEZZA($A$2:$A$100)-LUNGHEZZA(SOSTITUISCI($A$2:$A$100;$F2;"")))/LUNGHEZZA(F2);"0")

ma non funziona perché mi ritorna solo una parte di risultati e non capisco dove sia il problema.

Per completezza d'informazione l'utilizzo sarebbe questo: dopo aver estratto e messo in un excel il contenuto di ogni pagina di un sito web (magari appunto con centinaia di testi scritti), devo controllare se e quante volte una serie di termini (appunto le "substrings") compare in una qualunque delle pagine.

Spero che questa indicazione possa essere utile.
Grazie di nuovo
Post: 3.197
Registrato il: 28/06/2011
Città: AGORDO
Età: 70
Utente Master
2013
OFFLINE
27/02/2018 14:29

Premesso che può contare una parola singola
Premesso che (fondi comuni) non è uguale a (fondi comune)
Premesso che maiuscole sono differenti dalle minuscole
Ex i Tuoi dati in colonna G vai in Testo in colonna dividi delimitato per spazio
Riesco contare quante volte è presente in una cella ed il totale
Spero che nelle frasi non ci sia più di mille parole, oppure modifica le formule
[Modificato da raffaele1953 27/02/2018 14:32]
Excel 2013
Post: 10
Registrato il: 17/06/2016
Città: MILANO
Età: 45
Utente Junior
2013
OFFLINE
28/02/2018 19:15

Ciao Raffaele,
grazie mille per la tua proposta! Di sicuro potrebbe essere una possibilità. Quello che mi frena un secondo dall’applicarla è che i testi in alcuni possono essere anche molto lunghi (magari 3000 parole) e quindi avere migliaia di colonne e centinaia di righe potrebbe essere difficile da gestire. Però sicuramente se non riesco a trovare una soluzione diversa proverò questa
Grazie di nuovo :)
Elio
Post: 2.720
Registrato il: 03/04/2013
Utente Veteran
Excel 2000 - 2013
OFFLINE
01/03/2018 01:06

Visto che sono piuttosto curioso, solo per mio sfizio personale, ho eseguito alcuni Test.

Come puoi vedere i "Substring" sono solo 5 e i Record solo 2.

I tempi di risposta per ottenere i risultati indicati nell'immagine allegata sono di 2 secondi; non chiedermi quanto servirebbe per elaborare:


... centinaia di righe in cui è presente del testo e magari una decina di "substrings" da controllare.



ma, per elaborare 150 Record potresti considerare 1 minuto e 30 secondi; non è un tempo da record ma forse giusto il tempo di bere un caffè.



Giuseppe

Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 3.208
Registrato il: 28/06/2011
Città: AGORDO
Età: 70
Utente Master
2013
OFFLINE
01/03/2018 01:40

Ciao GiuseppeMN (un saluto e "se Voui" ridammi la mail Skype)

Mi fatte incavolare, con le Vostre risposte/domande
Tu conosci i limiti di Excel 2003 (max 256 colonne). Tu conosci i limiti di Excel 2007?
Se non erro (oltre 16.384 colonne) eppure Tu usi 2013 (quali problemi hai ???)
Excel 2013
Post: 11
Registrato il: 17/06/2016
Città: MILANO
Età: 45
Utente Junior
2013
OFFLINE
01/03/2018 17:44

Ciao Giuseppe,
quello che hai messo tu in figura potrebbe essere ciò di cui ho bisogno io. Mi puoi dire come ci sei arrivato per favore?
Grazie mille!

Ah il tempo non sarebbe un problema...al limite lo lascio lì a macinare
Elio
[Modificato da Eyah78 01/03/2018 17:45]
Post: 2.724
Registrato il: 03/04/2013
Utente Veteran
Excel 2000 - 2013
OFFLINE
01/03/2018 18:07

Ripeto, il Codice VBA andrebbe rivisto, ma per il momento è questo:
Option Explicit
Option Compare Text
Option Base 1

Sub Test_Matrice()
Application.ScreenUpdating = False
Dim sSplit() As String
Dim y As Long, k As Long, NRc As Long, Cln As Long, ClX As Long
Dim Sbs As Byte
Dim Qst As Integer, x As Integer
Dim Rcr1 As String, Rcr2 As String
Dim LRcr1 As Byte, LRcr2 As Byte
Dim Mtrx()

    Sbs = Range("F" & Rows.Count).End(xlUp).Row - 1
ReDim Mtrx(Sbs, Sbs)
    For y = 1 To Sbs
        Mtrx(y, 1) = Cells(y + 1, 6)
        Mtrx(y, 2) = Len(Cells(y + 1, 6))
    Next y
    
    NRc = Range("A" & Rows.Count).End(xlUp).Row
        For y = 2 To NRc
            Cln = Cells(y, Columns.Count).End(xlToLeft).Column
                If ClX < Cln Then ClX = Cln
        Next y
            If ClX < 9 Then ClX = 9
        Range(Cells(2, 9), Cells(NRc, ClX)).ClearContents
        
    For y = 2 To NRc
        k = 9
        Cln = 9
            sSplit = Split(Cells(y, 1).Value, " ")
        For k = LBound(sSplit) To UBound(sSplit)
            Cells(y, Cln) = sSplit(k)
                Cln = Cln + 1
        Next k
    Next y
        
        For y = 2 To NRc
            Cln = Cells(y, Columns.Count).End(xlToLeft).Column
                If ClX < Cln Then ClX = Cln
        Next y
            If ClX < 9 Then ClX = 9
            
    Range(Cells(1, 7), Cells(Sbs + 1, 7)).ClearContents
    
    For k = 2 To NRc
        Cln = Cells(k, Columns.Count).End(xlToLeft).Column
            For y = 9 To Cln
                    Cells(k, y).Select
                For x = 1 To Sbs
                    Cells(k, y).Select
                    If Left(Cells(k, y).Value, Mtrx(x, 2)) = Mtrx(x, 1) Then
                        Cells(x + 1, 7).Value = Cells(x + 1, 7).Value + 1
                            Qst = Qst + 1
                    End If
                Next x
            Next y
    Next k
        Range(Cells(2, 9), Cells(NRc, ClX)).ClearContents
Application.ScreenUpdating = True
        Cells(1, 7).Value = Qst
End Sub



Buona serata.

Giuseppe

Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 12
Registrato il: 17/06/2016
Città: MILANO
Età: 45
Utente Junior
2013
OFFLINE
01/03/2018 18:34

wow!
grazie mille! Lo provo e ti so dire come va.
Grazie di nuovo intanto
Elio
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 12:08. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com