Condividi tramite

ricerca termini ricorrenti in excel/word

Anonimo
2014-07-19T16:45:48+00:00

Salve,

chiedo scusa per la domanda forse banale: esiste una funzione/formula in excel (ma per il mio obiettivo basterebbe anche word) che mi permetta, dopo aver esportato una serie di dati in excel, di ottenere un elenco o classificazione di termini piu' ricorrenti all'interno delle celle senza la necessità di dare io stesso un input di ricerca?

Mi spiego meglio, data l'esportazione di una serie di dati all'interno delle celle che conterranno quindi delle semplici descrizioni senza una precisa schematizzazione, avrei bisogno di individuare quali sono i termini piu' ricorrenti all'interno delle descrizioni stesse.

Grazie mille della disponibilità.

VL

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2014-07-22T05:55:07+00:00

    Salve Andy,

    grazie mille per la disponibilità, sto testando entrambe le strade fornite da te e Norman ma non ne vengo ancora a capo, sicuramente a causa di una mia ignoranza in materia di macro e visual basic... nel caso del codice da te fornito, e leggendo l'intro al link che mi hai indicato deduco che il codice va scritto nel modulo "questa cartella di lavoro" (correggimi se sbaglio), ad ogni modo eseguendo il codice su una decina di celle di prova mi compare l'errore "indice non incluso nell'intervallo", c'è qualcosa che sto sbagliando? grazie ancora

    In questo caso è preferibile copiare il codice in un modulo generale.

    L'errore che segnali è dovuto al fatto che sul tuo file non esiste il Foglio4 sul quale io ho previsto che la macro lavorasse. E' necessario fare dei piccoli adattamenti alle prime righe del codice, ecco le righe sulle quali devi intervenire:

    With ThisWorkbook.Worksheets("Foglio4")

    sostituisci Foglio4 con il nome del foglio del tuo file nel quale si trovano le parole da analizzare

    Set rSource = .Range("A1:A100")     ' intervallo da analizzare

    sostituisci A1:A100 con l'intervallo di celle (nel foglio indicato precedentemente) contenente le parole da analizzare

    Set rTarget = .Range("E1")          ' risultati

    infine, sostituisci E1 con la cella di destinazione dei risultati (che si trova sempre nello stesso foglio indicato precedentemente, ma che può essere modificato agevolmente in base alle tue esigenze). Tieni presente che i risultati utilizzeranno due colonne, la prima per le parole e la seconda per la relativa frequenza, scrivendo E1 saranno sovrascritte le colonne E ed F,

    La risposta è stata utile?

    0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2014-07-21T06:37:52+00:00

    Salve,

    chiedo scusa per la domanda forse banale: esiste una funzione/formula in excel (ma per il mio obiettivo basterebbe anche word) che mi permetta, dopo aver esportato una serie di dati in excel, di ottenere un elenco o classificazione di termini piu' ricorrenti all'interno delle celle senza la necessità di dare io stesso un input di ricerca?

    Mi spiego meglio, data l'esportazione di una serie di dati all'interno delle celle che conterranno quindi delle semplici descrizioni senza una precisa schematizzazione, avrei bisogno di individuare quali sono i termini piu' ricorrenti all'interno delle descrizioni stesse.

    Grazie mille della disponibilità.

    VL

    La macro allegata crea una lista delle parole utilizzate nell'intervallo di tuo interesse ordinandole in base alla frequenza che si verificano.

    Se non hai mai utilizzato le macro leggi prima qui.


    Sub WordFrequency()

    Dim rSource As Range, rTarget As Range

    Dim i As Long

    Dim v As Variant, vRes As Variant

      '--- change the addresses below to match your data

      With ThisWorkbook.Worksheets("Foglio4")

        Set rSource = .Range("A1:A100")     ' intervallo da analizzare

        Set rTarget = .Range("E1")          ' risultati

      End With

      With CreateObject("Scripting.Dictionary")

        For Each v In rSource.Value

          v = Split(v, " ")

          For i = 0 To UBound(v)

            If Len(v(i)) Then .Item(v(i)) = .Item(v(i)) + 1

          Next

        Next

        vRes = WorksheetFunction.Transpose(Array(.Keys, .Items))

        With rTarget.Resize(, 2)

          .Value = Array("Word", "Frequency")

          'With .Offset(1).Resize(UBound(vRes, 1), 2)

          With .Offset(1).Resize(UBound(vRes, 1))

            .Value = vRes

            .Sort .Cells(1, 2), xlDescending, Header:=xlNo

          End With

        End With

      End With

    End Sub


    La risposta è stata utile?

    0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2014-07-21T06:16:22+00:00

    chiedo scusa per la domanda forse banale: esiste una funzione/formula in excel (ma per il mio obiettivo basterebbe anche word) che mi permetta, dopo aver esportato una serie di dati in excel, di ottenere un elenco o classificazione di termini piu' ricorrenti all'interno delle celle senza la necessità di dare io stesso un input di ricerca?

    Mi spiego meglio, data l'esportazione di una serie di dati all'interno delle celle che conterranno quindi delle semplici descrizioni senza una precisa schematizzazione, avrei bisogno di individuare quali sono i termini piu' ricorrenti all'interno delle descrizioni stesse.

    Ciao Valerio,

    A condizione che abbia ben capito la tua richiesta, e non ne sono affatto sicuro, prova qualcosa del genere:

    Alt-F11 per aprire l'editor di VBA

    Alt-IM per inserire un nuovo modulo di codice

    Nel nuovo modulo vuoto, incolla il seguente codice:

    '==========>>

    Option Explicit

    '---------->>

    Public Sub Tester()

     '\inserisci un riferimento alla libreriaMicrosoft Scripting Runtime

        '\ Menu | Strumenti | Riferimenti

        Dim WB As Workbook

        Dim srcSH As Worksheet, destSH As Worksheet

        Dim Rng As Range

        Dim rCell As Range

        Dim v As Variant, aVal As Variant

        Dim oDic As Scripting.Dictionary

        Dim arrData As Variant, arrIn() As Variant, ArrOut As Variant

        Dim arrPunctuation As Variant, arrReplace As Variant, arrWith As Variant

        Dim i As Long, j As Long, k As Long

        Dim iLastRow As Long, iCount As Long

        Dim sStr As String

        Dim blAscending As Boolean

        Const ColonnaDati As String = "A"                                 '<<===== Modifica

        Set WB = Workbooks("Pippo.xlsx")                               '<<===== Modifica

        With WB

            Set srcSH = .Sheets("Foglio1")                                 '<<===== Modifica

            Set destSH = .Sheets("Foglio2")                               '<<===== Modifica

        End With

        With srcSH

            iLastRow = LastRow(srcSH, .Columns("A:A"))

            Set Rng = .Range(ColonnaDati & "1:" & ColonnaDati & iLastRow)

        End With

        arrPunctuation = VBA.Array(".", ",", ";", ":", "!", "?", "(", ")")

        arrReplace = VBA.Array("all'", "l'", "/")

        arrWith = VBA.Array("al ", "il ", " ")

        arrData = Rng.Value

        For i = LBound(arrData) To UBound(arrData, 1)

            sStr = arrData(i, 1)

            For j = LBound(arrPunctuation) To UBound(arrPunctuation)

                sStr = Replace(Expression:=sStr, _

                               Find:=arrPunctuation(j), _

                               Replace:="", _

                               Start:=1, _

                               Count:=-1, _

                               Compare:=vbTextCompare)

            Next j

            For j = LBound(arrReplace) To UBound(arrReplace)

                sStr = Replace(Expression:=sStr, _

                               Find:=arrReplace(j), _

                               Replace:=arrWith(j), _

                               Start:=1, _

                               Count:=-1, _

                               Compare:=vbTextCompare)

            Next j

            arrData(i, 1) = sStr

        Next i

        Set oDic = New Scripting.Dictionary

        oDic.CompareMode = TextCompare

        With oDic

            For j = LBound(arrData, 1) To UBound(arrData, 1)

                v = Split(arrData(j, 1), Space(1))

                For k = 0 To UBound(v)

                    aVal = v(k)

                    If Not .Exists(aVal) Then

                        .Add Item:=1, Key:=aVal

                    Else

                        .Item(aVal) = .Item(aVal) + 1

                    End If

                Next k

            Next j

            iCount = .Count

            ReDim arrIn(1 To iCount, 1 To 2)

            For i = 1 To iCount

                arrIn(i, 1) = .Keys(i - 1)

                arrIn(i, 2) = .Items(i - 1)

            Next i

        End With

        Call QuickSort(arrIn, 2, LBound(arrIn, 1), UBound(arrIn, 1), blAscending)

        With destSH

            .Range("A1:B1").Value = Array("Parola", "Quantità")

            .Range("A2").Resize(iCount, 2).Value = arrIn

            .Columns.AutoFit

        End With

    End Sub

    '----------->>

    Function LastRow(SH As Worksheet, _

                     Optional Rng As Range)

        If Rng Is Nothing Then

            Set Rng = SH.Cells

        End If

        On Error Resume Next

        LastRow = Rng.Find(What:="*", _

                           After:=Rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

    End Function

    '----------->>

    Public Sub QuickSort(SortArray, col, L, R, bAscending)

        '\ TomOgilvy: http://goo.gl/ninpZW

        'Originally Posted by Jim Rech 10/20/98 Excel.Programming

        'Modified to sort on first column of a two dimensional array

        'Modified to handle a second dimension greater than 1 (or zero)

        'Modified to do Ascending or Descending

        Dim i, j, X, Y, mm

        i = L

        j = R

        X = SortArray((L + R) / 2, col)

        If bAscending Then

            While (i <= j)

                While (SortArray(i, col) < X And i < R)

                    i = i + 1

                Wend

                While (X < SortArray(j, col) And j > L)

                    j = j - 1

                Wend

                If (i <= j) Then

                    For mm = LBound(SortArray, 2) To UBound(SortArray, 2)

                        Y = SortArray(i, mm)

                        SortArray(i, mm) = SortArray(j, mm)

                        SortArray(j, mm) = Y

                    Next mm

                    i = i + 1

                    j = j - 1

                End If

            Wend

        Else

            While (i <= j)

                While (SortArray(i, col) > X And i < R)

                    i = i + 1

                Wend

                While (X > SortArray(j, col) And j > L)

                    j = j - 1

                Wend

                If (i <= j) Then

                    For mm = LBound(SortArray, 2) To UBound(SortArray, 2)

                        Y = SortArray(i, mm)

                        SortArray(i, mm) = SortArray(j, mm)

                        SortArray(j, mm) = Y

                    Next mm

                    i = i + 1

                    j = j - 1

                End If

            Wend

        End If

        If (L < j) Then Call QuickSort(SortArray, col, L, j, bAscending)

        If (i < R) Then Call QuickSort(SortArray, col, i, R, bAscending)

    End Sub

    '<<==========

    Alt-Q per chiudere l'editor di VBA e tornare a Excel.

    Alt-F8 per aprire la finestrina macro

    Seleziona Tester | Esegui

    Prima di eseguire il codice: 

    Menu | Strumenti | Riferimenti | Microsoft Scripting Runtime

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento

9 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-07-21T07:54:36+00:00

    ...

        Dim oDic As Scripting.Dictionary

    ...

    Senza il riferimento alla 'Microsoft Scripting Runtime Library' non avrà nemmeno la possibilità di testarlo. ;)

    Ciao Andrea,

    Normalmente indico la necessità di un riferimento alla libreria; in alternativa, utilizzo il late binding e dichiaro il Dictionary come Object.  Questa volta, ho dimenticato di indicare la necessità per il riferimento e ti ringrazio per avermelo ricordato.

    Ho ora modificato la mia risposta a Valerio per indicare la necessità di un riferimento alla libreria Microsoft Scripting Runtime.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-07-21T07:10:26+00:00

    ...

        Dim oDic As Scripting.Dictionary

    ...

    Senza il riferimento alla 'Microsoft Scripting Runtime Library' non avrà nemmeno la possibilità di testarlo. ;)

    La risposta è stata utile?

    0 commenti Nessun commento