conteggio parole



  • conteggio parole
    di igor (utente non iscritto) data: 25/03/2015 14:59:34

    cioa atutti e ben ritrovati.
    ho provat oa cercare ma non riesco a copiare esattamente nel foglio excel cio che voglio..
    praticamente NELLE CELLE DA H1 FINO AD H800 HO 800 COGNOMI.....MOLTI RIPETUTI.....
    VOGLIO SAPERE I 10 COGNOMI PIU RIPETUTI SENZA CREARE OGNI VOLTA LA TABELLA PIVOT...
    E POSSIBILE IN VBA ? E' POSSIBILE METTERLI INCOLONNATI DA i1 AD i10 ?
    GRAZIE MILLE.



  • di alfrimpa data: 25/03/2015 16:29:16

    Ciao Igor

    Non credo ci sia bisogno del VBA

    Io farei così

    Se i cognomi sono in colonna A, li copierei tutti in colonna B.
    Poi rimuoverei i duplicati in colonna B
    In C1 scriverei =SOMMA.SE(A1:A800;BI) e ricopi in basso
    Ordinando le colonne B e C hai i nominativi che si ripetono il maggior numero di volte.

    Spero di aver interpretato bene il tuo quesito.

    Alfredo





  • di alfrimpa data: 25/03/2015 16:31:54

    Poi una volta ordinati prendi i primi dieci e li metti dove vuoi.

    Alfredo





  • di Vecchio Frac data: 25/03/2015 16:42:48

    La soluzione più semplice possibile è questa:
    - ordinamento A-Z dei dati in colonna H
    - in I1 metti il numero 1
    - in I2 metti la formula: =SE(H2=H1;I1+1;1)
    - trascini la suddetta formula per tutte le celle interessate
    - evidenzi la colonna I
    - copia-incolla speciale: incolla valori (nella stessa colonna), così consolidi i valori e non le formule
    - ordinamento Z-A di colonna I
    - dati >> Rimuovi duplicati >> scegli solo colonna H (è quella che contiene i valori ripetuti)
    - ecco fatto. Alla fine hai l'elenco univoco dei valori in colonna H e in colonna I il conteggio totale.

    Chiaramente se non vuoi toccare le colonne originali fatti una copia di H e I da un'altra parte e lavora sulla copia.





  • di Vecchio Frac data: 25/03/2015 16:43:23

    Quasi battuto da Alfredo... la mia soluzione ti dice in più il conteggio per ognuno :)





  • di Vecchio Frac data: 25/03/2015 16:43:52

    Ah sì... anche la sua... e senza tanti casini come ho fatto io :P





  • di Vecchio Frac data: 25/03/2015 16:44:38

    @igor, Alfrimpa
    Vi aspetto qui
    www.excelvba.it/Forum/thread.php?f=1&t=8408





  • di igor (utente non iscritto) data: 25/03/2015 16:54:45

    e se non volessi fare tutti sti passaggi ? di copia ed incolla...perche
    vorrei avere tutto su un foglio gi pronto e compilato con altre funzioni ?
    essite un ciclo con vba ?



  • di brontolo (utente non iscritto) data: 25/03/2015 18:51:07

    @ Vecchi Frac; oggi sono ... "la tua spina nel cuore" ; cerca di sopportarmi almeno per oggi.

    @ Igor; azzardo un codice.

    I Nominativi sono in H1:H800
    Considera che i primi 10 Nominativi saranno in A1:A10, mentre la loro frequenza sarà in B1:B10

    Brontolo
     
    Option Explicit
    Sub Arr_pg()
    Application.ScreenUpdating = False
        Dim Arr() As String
        Dim WS As Worksheet
        Dim R As Range
        Dim N As Long, x As Long, y As Long
        Dim Formula As String
        Columns("A:B").Clear
        N = Range("H" & Rows.Count).End(xlUp).Row
        ReDim Arr(N + 5)
        
        x = 1
        Do While Cells(x, 8) <> ""
                    Arr(x) = Cells(x, 8)
                x = x + 1
            Loop
        Set R = Range("A1").Resize(UBound(Arr) - LBound(Arr) + 1, 1)
            R = Application.Transpose(Arr)
            R.Sort key1:=R, order1:=xlAscending, MatchCase:=False
        y = Range("A" & Rows.Count).End(xlUp).Row
            For N = 1 To y
                Arr(N) = R(N, 1)
            Next N
        Columns("A").Select
        ActiveSheet.Range("$A$1:$A$" & y).RemoveDuplicates Columns:=1, Header:=xlNo
        
        y = Range("A" & Rows.Count).End(xlUp).Row
            For x = 1 To y
                Formula = "=CONTA.SE($H:$H;$A" & x & ")"
                Cells(x, 2).FormulaLocal = Formula
                Cells(x, 2).Copy
                Cells(x, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Next x
        Application.CutCopyMode = False
            Columns("A:B").Select
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range("B1:B" & y), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range("A1:A" & y), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        
        With ActiveWorkbook.ActiveSheet.Sort
            .SetRange Range("A1:B" & y)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        Range("A11:B" & y).ClearContents
        Range("A1").Select
    End Sub
    



  • di scossa data: 25/03/2015 19:43:15

    Propongo questa UDF matricial, che più o meno replica la funzione MODA() ma accetta anche testo e non solo numeri.

    Selezionare un intervallo di 10 celle per 2 colonne (p.e.: I1:J10) ed inserire la seguente formula
    =uMODA(H1:H800)
    matriciale da confermare con ctrl+maiusc+invio
    In colonna I avrai il numero di ripetizioni ed in colonna J il rispettivo nome.





    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    '---------------------------------------------------------------------------------------
    ' Procedure : uModa
    ' Author    : Scossa
    ' Date      : 17/03/2014
    ' Purpose   : restituisce una matrice bidimensionale con gli elementi ordinati
    '             in base alla "moda"
    '---------------------------------------------------------------------------------------
    '
      Public Function uModa(ByVal rng As Range) As Variant
        Dim nCnt As Long
        Dim cDati As New Collection
        Dim cella As Range
        Dim vDato As Variant
        Dim aDati As Variant
        Dim j As Integer
        Dim vRet As Variant
        
        On Error Resume Next
        For Each cella In rng
          With cella
            nCnt = Application.WorksheetFunction.CountIf(rng, .Value)
            cDati.Add Array(.Value, nCnt), CStr(.Value)
          End With
        Next
        On Error GoTo 0
        
        ReDim aDati(1 To cDati.Count, 1 To 2)
        j = 0
        For Each vDato In cDati
          j = j + 1
          aDati(j, 1) = vDato(1)
          aDati(j, 2) = vDato(0)
        Next
        aDati = ArrayBiSort(aDati)
        uModa = aDati
      End Function
    
    '---------------------------------------------------------------------------------------
    ' Function  : ArrayBiSort
    ' Author    : Scossa
    ' Date      : 17/03/2014
    ' Purpose   : ordina un array bidimensionale in base alla prima dimensione
    '             (dal maggiore al minore)
    '---------------------------------------------------------------------------------------
    '
    Private Function ArrayBiSort(ByVal ArrayIn As Variant)
      Dim vMaster As Variant
      Dim vSlave As Variant
      Dim i As Long
      Dim j As Long
    
      For i = LBound(ArrayIn) To UBound(ArrayIn)
        For j = i + 1 To UBound(ArrayIn)
          If ArrayIn(i, 1) < ArrayIn(j, 1) Then
            vMaster = ArrayIn(j, 1)
            vSlave = ArrayIn(j, 2)
            ArrayIn(j, 1) = ArrayIn(i, 1)
            ArrayIn(j, 2) = ArrayIn(i, 2)
            ArrayIn(i, 1) = vMaster
            ArrayIn(i, 2) = vSlave
          End If
        Next j
       Next i
    
      ArrayBiSort = ArrayIn
    
    End Function
    



  • di igor (utente non iscritto) data: 25/03/2015 20:06:48

    ho provato ad incollarli in un file excel, ma non fungono.......
    da considerare che io il vettore non lo devo ordinare....senno mi scompiglio tutto il foglio che ho preparato...



  • di Vecchio Frac data: 25/03/2015 20:27:31

    cit. "incollarli in un file excel"
    ---> Ho un brutto presentimento ^_^
    Dove e come hai incollato il codice proposto?





  • di scossa data: 25/03/2015 20:33:50

    Ho allegato il file di prova (uModa.xlsm).



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)




  • di igor (utente non iscritto) data: 25/03/2015 20:53:22

    e come faccio per aggiornare modificando i valori ?
    scusate l'incompetenza...



  • di ninai (utente non iscritto) data: 25/03/2015 21:02:21

    Ciao
    volendo "inquinare" con soluzione pesante in formule, usando il file di Scossa, in K10:

    =SE.ERRORE(INDICE($H$1:$H$568;MODA(SE(CONTA.SE($H$1:$H$568;$H$1:$H$568)*VAL.NON.DISP(CONFRONTA($H$1:$H$568;K$9:K9;0));CONFRONTA($H$1:$H$568;$H$1:$H$568;0))));"")
    Matriciale

    in J10:
    =CONTA.SE($H$1:$H$568;K10)

    e trascini in basso ambedue