faretesto > microsoft.* > microsoft.office.excel

draleo (20.07.2019, 01:34)
Elenco di circa 1000 righe. Nella colonna C ho una serie di nomi, che possono ripetersi in gruppi contigui e/o intervallati con altri nomi. Devo contare quante volte lo stesso nome si ripete in celle contigue. Per es
da C1 a C10 ho la parola pippo
in C11 Paperino
in C12 Pluto
Da C13 a C15 si ripresenta Pippo
ecc
Allora
in D1 devo scrivere 10 (perché pippo è stato contato 10 volte) e da D2 a D10 lascio le celle vuote
In D11 scrivo 1 (conteggio di paperino)
In D12 scrivo 1 (conteggio di Pluto)
In D13 scrivo 3 (nuovo conteggio di pippo)
In altre parole dovrei scorrere le celle della colonna C ; contarle fino aquando non cambia il contenuto; scrivere il num ottenuto nella col D (ma nella cella iniziale della serie e NON in quella finale) . Quando poi il contenuto cambia, ricominciare il conteggio della nuova parola.
draleo
Ps: in realtà fino ad ora mi sono arrangiato inserendo una riga vuota ogni volta che cambia il nome e poi contanto quante celle piene ci sono trale 2 vuote. Ma il tutto è abbastanza macchinoso e lento e cercavo qualcosa di più immediato
casanmaner (20.07.2019, 07:32)
Il giorno sabato 20 luglio 2019 01:34:58 UTC+2, draleo ha scritto:
[..]
> In altre parole dovrei scorrere le celle della colonna C ; contarle finoa quando non cambia il contenuto; scrivere il num ottenuto nella col D (manella cella iniziale della serie e NON in quella finale) . Quando poi ilcontenuto cambia, ricominciare il conteggio della nuova parola.
> draleo
> Ps: in realtà fino ad ora mi sono arrangiato inserendo una riga vuota ogni volta che cambia il nome e poi contanto quante celle piene ci sono tra le 2 vuote. Ma il tutto è abbastanza macchinoso e lento e cercavo qualcosa di più immediato


Ciao Draleo,
in futuro per queste richieste magari sarebbe gradito un file già compilato con i dati di esempio in modo da non doverlo ricostruire :)
Comunque in D1 prova ad inserire:
=SE(CONTA.SE($C$2:C2;C2)>1;"";CONTA.SE($C$2:C2;C2) )

da copiare in basso.

Vedi se è quello che desideri.
casanmaner (20.07.2019, 07:37)
Avevo dato una risposta ma rileggendo meglio la tua domanda mi sono reso conto che non andava bene e quindi ho eliminato il messaggio :)
Bruno Campanini (20.07.2019, 11:06)
draleo used his keyboard to write :
[..]
> che cambia il nome e poi contanto quante celle piene ci sono tra le 2 vuote.
> Ma il tutto è abbastanza macchinoso e lento e cercavo qualcosa di più
> immediato


=============================
Public Sub MarkFreq()
Dim SR As Range, h As Long, k As Long
Dim PreviousLine, PreviousCount As Integer

Set SR = Range([Sheet2!H1], [Sheet2!H1].End(xlDown))
PreviousLine = SR(1)
PreviousCount = 1

For h = 2 To SR.Rows.count
If SR(h) = PreviousLine Then
k = k + 1
PreviousCount = PreviousCount + 1
SR(h - k, 2) = PreviousCount
Else
PreviousLine = SR(h)
PreviousCount = 1
k = 0
End If
Next

End Sub
==========================

Alla terza ti mando il conto!

Bruno
buonocoreelio (20.07.2019, 11:10)
Il giorno sabato 20 luglio 2019 07:37:44 UTC+2, casanmaner ha scritto:
> Avevo dato una risposta ma rileggendo meglio la tua domanda mi sono reso conto che non andava bene e quindi ho eliminato il messaggio :)


La chiave potrebbe ricercarsi in un CONFRONTA con intervallo di ricerca 'decrementale' fino al successivo 'falso'. Avrei risolto così. Forse è possibile operare semplificazioni / nidificazioni.

Da C2 in colonne C i tuoi nomi
in D2 la formula =C2=C1
In E2 la formula =SE(C2<>C1;C2;"")
in F2 la formula SE.ERRORE(SE(E3="";CONFRONTA(FALSO;D3:$D$14;0);1); RIGHE($C$2:$C$14)-RIF.RIGA(E2)+2)
in G2 la formula =SE(E2<>""; E2 & "_" & F2;"")
tutte le formule da trascinare fino a fine elenco

come sistema di controllo, se ti interessa,
in J2 scrivi un nome della lista in colonna C
in K2 ( o dove vuoi) la formula matriciale:
AGGREGA(14;3;FREQUENZA(SE($C$2:$C$14=J2;RIF.RIGA($ C$2:$C$14));SE($C$2:$C$14<>J2;RIF.RIGA($C$2:$C$14) ));1)

che ti restituisce il numero massimo di valori consecutivi per quel nome.

Ciao
Elio
draleo (20.07.2019, 14:12)
Il giorno sabato 20 luglio 2019 11:06:31 UTC+2, Bruno Campanini ha scritto:
[..]
> ==========================
> Alla terza ti mando il conto!
> Bruno


Funziona bene e conta bene le celle consecutive che hanno lo stesso valore; ma manca il conteggio delle celle con valori unici (cioè il num 1); se in C8 c'è pluto; in C9 c'è pippo; in C10 c'è paperino;mi aspetterei il num 1 in D8 ;il num 1 in D9 1 e il num 1 in D10
draleo
draleo (20.07.2019, 14:15)
> =============================
[..]
> ==========================
> Alla terza ti mando il conto!
> Bruno


Funziona bene e conta bene le celle consecutive che hanno lo stesso valore; ma manca il conteggio delle celle con valori unici (cioè il num 1); se in C8 c'è pluto; in C9 c'è pippo; in C10 c'è paperino;mi aspetterei il num 1 in D8 ;il num 1 in D9 1 e il num 1 in D10 . Invece dalla tua procedura vengono fuori 3 celle vuote
draleo
draleo (20.07.2019, 14:23)
Il giorno sabato 20 luglio 2019 11:10:52 UTC+2, buonoc...@gmail.com ha scritto:
[..]
> che ti restituisce il numero massimo di valori consecutivi per quel nome.
> Ciao
> Elio


Ho provato; ma c'è qualche problema: bisognerebbe inserire 3 colonne nuove che mi altererebbero la struttura dell'elenco (è anche vero che alla fine del lavoro potrei eliminarle); i conteggi iniziano dalla riga 2 (enon dalla 1). Inoltre nel caso di celle consecutive con lo stesso valore ,accanto ad ognuna mi mette il conteggio parziale decrementato di 1; cioè se lo stesso valore è presente 10 volte, scrive correttamente 10; ma nelle celle inferiori scrive 9-8-7-6 ecc quando invece per i miei calcoli mi servirebbero celle vuote (oppure pari a zero)
draleo
buonocoreelio (20.07.2019, 15:37)
Il giorno sabato 20 luglio 2019 14:23:57 UTC+2, draleo ha scritto:
> Il giorno sabato 20 luglio 2019 11:10:52 UTC+2, buonoc...@gmail.com ha scritto:
> Ho provato; ma c'è qualche problema: bisognerebbe inserire 3 colonnenuove che mi altererebbero la struttura dell'elenco (è anche vero chealla fine del lavoro potrei eliminarle); i conteggi iniziano dalla riga 2 (e non dalla 1). Inoltre nel caso di celle consecutive con lo stesso valore, accanto ad ognuna mi mette il conteggio parziale decrementato di 1; cioè se lo stesso valore è presente 10 volte, scrive correttamente 10; ma nelle celle inferiori scrive 9-8-7-6 ecc quando invece per i miei calcoli mi servirebbero celle vuote (oppure pari a zero)
> draleo


La prima riga deve essere vuota per evitare un errore di riferimento sulla prima formula, altrimenti sarebbe necessario sostituire valori costanti sulla prima riga e far partire le formule dalla seconda dell'elenco.
Per il resto il mio file non presenta problemi: la colonna G del foglio 1 nasconde le ripetizioni (cella con stringa vuota).
Qui il link al file
draleo (20.07.2019, 16:10)
Il giorno sabato 20 luglio 2019 15:37:34 UTC+2, buonoc...@gmail.com ha scritto:
> Il giorno sabato 20 luglio 2019 14:23:57 UTC+2, draleo ha scritto:
> La prima riga deve essere vuota per evitare un errore di riferimento sulla prima formula, altrimenti sarebbe necessario sostituire valori costanti sulla prima riga e far partire le formule dalla seconda dell'elenco.
> Per il resto il mio file non presenta problemi: la colonna G del foglio 1nasconde le ripetizioni (cella con stringa vuota).
> Qui il link al file
>


Si ; è vero. pensavo che la colonna da guardare fosse la F (e non la G). Nella G però mi servono solo numeri (o valori vuoti), allora ho sostituito la tua formula con =SE(E2<>""; F2;"")
grazie
draleo
Bruno Campanini (20.07.2019, 16:14)
draleo used his keyboard to write :
> Funziona bene e conta bene le celle consecutive che hanno lo stesso valore ;
> ma manca il conteggio delle celle con valori unici (cioè il num 1) ; se in
> C8 c'è pluto; in C9 c'è pippo; in C10 c'è paperino; mi aspetterei il num 1 in
> D8 ;il num 1 in D9 1 e il num 1 in D10 . Invece dalla tua procedura vengono
> fuori 3 celle vuote draleo


Dopo l'Else aggiungi queste:
If SR(1) <> SR(2) Then SR(1, 2) = 1
SR(h, 2) = 1

Bruno
draleo (20.07.2019, 21:43)
Il giorno sabato 20 luglio 2019 16:14:21 UTC+2, Bruno Campanini ha scritto:
> draleo used his keyboard to write :
> Dopo l'Else aggiungi queste:
> If SR(1) <> SR(2) Then SR(1, 2) = 1
> SR(h, 2) = 1
> Bruno


Grazie ;ora è OK. Anche qui c'è il problema, che l'analisi parte dalla riga 2. Quindi se i dati iniziano dalla riga 1, le prime 2-3 righe non restituiscono numeri corretti. Ma ho risolto inserendo, prima dell'iniziodella procedura, una riga fittizia e poi la elimino alla fine della procedura. Ma va bene ugualmente.Grazie ancora
draleo
Bruno Campanini (21.07.2019, 01:03)
draleo formulated on Saturday :

> Grazie ;ora è OK. Anche qui c'è il problema, che l'analisi parte dalla riga
> 2. Quindi se i dati iniziano dalla riga 1, le prime 2-3 righe non
> restituiscono numeri corretti. Ma ho risolto inserendo, prima dell'inizio
> della procedura, una riga fittizia e poi la elimino alla fine della
> procedura. Ma va bene ugualmente.Grazie ancora draleo


Ma proprio no!
Funziona tutto regolarmente da qualunque riga partano i dati.

Nel mio esempio, come si evince dal codice, i dati partono
da H1.

Nolite dare sanctum...

Bruno
draleo (21.07.2019, 13:53)
Il giorno domenica 21 luglio 2019 01:03:32 UTC+2, Bruno Campanini ha scritto:
> draleo formulated on Saturday :
> Ma proprio no!
> Funziona tutto regolarmente da qualunque riga partano i dati.
> Nel mio esempio, come si evince dal codice, i dati partono
> da H1.
> Nolite dare sanctum...
> Bruno

Hai ragione tu. avevo sbagliato ad adattare il tuo codice alla mia situazione. Dubitando ad veritatem pervenimus.
draleo
casanmaner (22.07.2019, 20:25)
Ciao Draleo,
hai già avuto delle risposte che hanno risolto il tuo problema ma visto che mi era rimasta in sospeso la risposta, che però non ho potuto riprendere in mano prima di questa sera, propongo ugualmente una alternativa con l'uso delle matrici.
Se vuoi e hai tempo prova a vedere se funziona :)

Sub ContaValoriContigui()
Dim rngI As Range
Dim arrIn As Variant
Dim arrOut() As Variant
Dim i As Long, contI As Long, cont As Long
Set rngI = Range("C1")
arrIn = rngI.CurrentRegion.Value
ReDim arrOut(1 To UBound(arrIn), 1 To 1)
contI = 1
cont = 1
arrOut(contI, 1) = cont
For i = LBound(arrIn) + 1 To UBound(arrIn)
If arrIn(i - 1, 1) = arrIn(i, 1) Then
cont = cont + 1
Else
contI = i
cont = 1
End If
arrOut(contI, 1) = cont
Next i
rngI.Resize(UBound(arrIn)).Offset(, 1).Value = arrOut

End Sub

Discussioni simili