Condividi:        

numeri consecutivi per riga

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

numeri consecutivi per riga

Postdi miko » 01/09/19 13:10

Buongiorno e buona domenica,
torno a trovarvi per realizzare un nuovo progetto.
anche se la consecutività numerica è stata già trattata non riesco a modificare le macro che avete realizzato.
come mostro nel file allegato partendo dalla riga I10, fino alla fine del range, si tratta di contare per
ciascuna riga, I & row - S & row e così via, la presenza di numeri consecutivi, coppie, terzine, quaterne...sestine
oppure nessun numero consecutivo, riportando il risultato sulla stessa riga, nelle colonne da Z ad AJ in corrispondenza
della consecutività.
dalla riga 10 fino alla riga 20 ho riportato le possibili consecutività che possono presentarsi con 6 numeri.
ad esempio in riga 10 non ci sono numeri consecutivi per cui in colonna Z sotto NC, nessun consecutivo
scriviamo Z10 = 6;
in riga 11 ci sono 3 coppie di consecutivi e quindi in colonna AB sotto COPPIE scriviamo AB11 = 3
in riga 13 abbiamo 1 coppia, 29-30, un singolo 45, ed 1 terzina 50-51-52 quindi scriviamo
sotto NC <<< Z13 = 1
sotto COPPPIE <<< AB13 = 1
sotto TERZINE <<< AD13 = 1

così per le altre righe.
ho provato a modificare varie macro e con la formattazione condizionale, ma il codice vale per una riga
non funziona per le altre.
http://www.filedropper.com/numericonsecutiviperriga
grazie, saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: numeri consecutivi per riga

Postdi Anthony47 » 02/09/19 00:57

Prima di tutto eliminiamo quelle colonne vuote intercalate tra i dati, la cui presenza deriva da esigenze estetiche che non condivido; in questo modo i dati sono limitati alle colonne I:N

Poi rinuncio a elaborare i risultati via formule (non sarebbe difficile, ma complica il fatto che ad es. una terzina non deve anche essere considerata una doppia coppia) e procediamo direttamente con una Funzione Personalizzata, corrispondente al seguente codice:
Codice: Seleziona tutto
Function MiKonsec(ByRef myRan As Range) As Variant
Dim myArr, oArr(), noK As Boolean
Dim I As Long, J As Long, K As Long, L As Long
'
myArr = myRan.Value
ReDim oArr(1 To myRan.Count - 1)
'
For I = UBound(myArr, 2) To LBound(myArr, 2) + 1 Step -1
    noK = False
    For K = LBound(myArr) To UBound(myArr, 2) - I + 1
    noK = False
        For J = K To K + I - 2
            If myArr(1, J) <> (myArr(1, J + 1) - 1) Then
                noK = True
                Exit For
            End If
        Next J
        If noK = False Then
            oArr(I - 1) = oArr(I - 1) + 1
            For L = K To K + I - 1
                myArr(1, L) = 999#
            Next L
        End If
    Next K
Next I
MiKonsec = oArr
End Function

Va messo in un "Modulo standard" del vba.

Poi torna su Excel, seleziona l'intervallo W10:AA10, e scrivi questa formula nella barra della formula:
Codice: Seleziona tutto
=MiKonsec(I11:N11)

Conferma la formula con la combinazione Contr-Maiusc-Enter, non il solo Enter

Nelle 5 celle che verranno cosi' compilate c'e' il numero di Coppie, Terzine, Quartine, Cinquine e Sestine che risultano in quella riga di dati

Poi copia W10:AA10 e incolla verso il basso, per quante righe di dati hai compilato.

Ovviamente puoi posizionare la formula nelle celle che preferisci (purche' in orizzontale)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: numeri consecutivi per riga

Postdi miko » 02/09/19 12:07

Buongiorno,
il codice funziona, grazie.
è possibile aggiungere per ogni riga ed in colonna U, od in altra colonna libera,
sotto NC, nessun consecutivo, il conteggio dei numeri non consecutivi,
ad esempio in riga I10 non ci sono consecutivi quindi U10 = 6
in riga I13 si ha 1 numero singolo, 1 coppia ed 1 terzina, quindi come correttamente hai riscontrato
W13 = 1 (coppia), X13 = 1 (terzina) in più sotto NC aggiungiamo U13 = 1.
e così via per le altre righe.
tuttavia ho dei problemi relativi a
Poi copia W10:AA10 e incolla verso il basso, per quante righe di dati hai compilato.

ottengo lo stesso risultato di W10:AA10 per tutte le righe che eseguo incolla anche se nella barra della formula
vedo cambiare i riferimenti cella W11, W13 etc.
ho provato anche con una cartella nuova;
per funzionare devo selezionare il range W:AA, inserire, nella barra, la formula =MiKonsec(I11:N11)
cambiare i riferimenti cella e confermare la formula con Contr-Maiusc-Enter
e ripetere il procedimento per tutte le righe da esaminare.
a tale proposito le righe per ora sono circa 10.000 ma aumentano.
forse è più opportuno sostituire la funzione con una sub da ciclare per tutte le righe
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: numeri consecutivi per riga

Postdi Anthony47 » 02/09/19 23:24

Devi mettere la formula riga per riga: la inserisci nella prima riga, la copi in blocco nelle righe sottostanti.
Se avessi detto che avevi 10mila righe avrei optato per una soluzione diversa, appena avro' tempo modifichero' quanto proposto.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: numeri consecutivi per riga

Postdi miko » 06/09/19 20:21

Buonasera,
continuo ad avere lo stesso problema, nonostante le tue indicazioni,
...la inserisci nella prima riga, la copi in blocco nelle righe sottostanti.

ho fatto 1 prova con una formula diversa, funzione somma;
inserisco la formula nella prima cella, poi tengo premuta la crocina in basso a destra, trascino
verso il basso e tutto funziona perfettamente.
non capisco perchè con la tua formula non funziona.
sto provando a trovare la soluzione al problema principale, contare i consecutivi,
ma ancora sono lontano dalla soluzione;
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: numeri consecutivi per riga

Postdi Anthony47 » 07/09/19 08:36

miko ha scritto:ho fatto 1 prova con una formula diversa, funzione somma;
inserisco la formula nella prima cella, poi tengo premuta la crocina in basso a destra, trascino
verso il basso e tutto funziona perfettamente.
non capisco perchè con la tua formula non funziona

Prova a seguire le istruzioni alla lettera:
Anthony ha scritto:[. . .] torna su Excel, seleziona l'intervallo W10:AA10, e scrivi questa formula nella barra della formula:
Codice: Seleziona tutto
=MiKonsec(I11:N11)

Conferma la formula con la combinazione Contr-Maiusc-Enter, non il solo Enter

Nelle 5 celle che verranno cosi' compilate c'e' il numero di Coppie, Terzine, Quartine, Cinquine e Sestine che risultano in quella riga di dati

Poi copia W10:AA10 e incolla verso il basso, per quante righe di dati hai compilato

Quelle che ti ho fatto inserire in W10:AA10 e' una "formula in forma di matrice"; si inseriscono così e solo così

Aggiungo le istruzioni per il Copia /Incolla:
-selezioni W10:AA10; premi Contr-c (Copia); selezioni W11:Wxx (xx e' l'ultima riga in cui vuoi incollare la formula) e premi Enter

Mi sa che mi sono dimenticato di trovare un po' di tempo libero per modificare l'approccio (una formula personalizzata su 10mila righe risultera' lentina) e aggiungere i NonConsecutivi... Devo recuperare...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: numeri consecutivi per riga

Postdi miko » 26/09/19 06:19

Salve,
ho risolto il problema relativo al copia-incolla della formula;
nelle opzioni di calcolo di excel era spuntata la voce Manuale-
Ricalcola cartella di lavoro prima del salvataggio
quindi avrei visto il risultato esatto se salvavo e riaprivo excel;
invece non vedendo un immediato risultato cancellavo tutto.
ora che ho impostato su Automatico il risultato è immediato e tutto funziona.
mi rimane tuttavia il problema del calcolo dei consecutivi.
sto provando e riprovando a costruire e modificare macro recuperate in rete,
o ad impostare diversi criteri di calcolo, ma non ottengo alcun risultato.
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: numeri consecutivi per riga

Postdi Anthony47 » 26/09/19 13:25

Mi sono preso abbastanza tempo per elaborare una Funzione che restituisca anche i Non Consecutivi; corrisponde a questo codice:
Codice: Seleziona tutto
Function MiKonsec2(ByRef myRan As Range) As Variant
Dim myArr, OArr(), noK As Boolean
Dim I As Long, J As Long, K As Long, L As Long
'
myArr = myRan.Value
ReDim OArr(1 To myRan.Count)
'
For I = UBound(myArr, 2) To LBound(myArr, 2) + 1 Step -1
    noK = False
    For K = LBound(myArr) To UBound(myArr, 2) - I + 1
    noK = False
        For J = K To K + I - 2
            If myArr(1, J) <> (myArr(1, J + 1) - 1) Then
                noK = True
                Exit For
            End If
        Next J
        If noK = False Then
            OArr(I) = OArr(I) + 1
            For L = K To K + I - 1
                myArr(1, L) = 999#
            Next L
        End If
    Next K
Next I
For I = LBound(myArr) To UBound(myArr, 2)
    If myArr(1, I) <> 999 Then OArr(1) = OArr(1) + 1
Next I
MiKonsec2 = OArr
End Function

Si usa come la MiKonsec, con la differenza che le celle da selezionare prima di introdurre la formula sono tante quante sono le colonne dei dati (quindi 6, nel tuo esempio); la sintassi e' la stessa, es
Codice: Seleziona tutto
=MiKonsec2(I10:N10)

Da confermare con Contr-Maiusc-Enter e poi copiare verso il basso
La prima colonna del risultato indica i numeri non consecutivi, poi le coppie, le terzine, etc

La Function ha il vantaggio di ricalcolarsi se cambiano i dati in ingresso; ma ha il difetto che il ricalcolo su 10mila righe potrebbe richiedere parecchi secondi (e parecchie condizioni provocano il ricalcolo di tutte le formule).

Volendo puoi usare in alternativa questa Macro, che calcola i dati solo quando viene lanciata:
Codice: Seleziona tutto
Sub MiKonsGlob()
Dim myDat As String, myOut As String, OArr(), myArr(), II As Long, I As Long
Dim J As Long, K As Long, L As Long, noK As Boolean, wArr
Dim LastD As Long
'
myDat = "I10:N10"           '<<< La prima riga di Dati
myOut = "AS10"              '<<< La prima cella per i Risultati
'
LastD = Cells(Rows.Count, Range(myDat).Cells(1, 1).Column).End(xlUp).Row
wArr = Range(Range(myDat), Range(myDat).End(xlDown)).Value
ReDim OArr(LBound(wArr) To UBound(wArr), LBound(wArr, 2) To UBound(wArr, 2))
ReDim myArr(1 To 1, 1 To UBound(wArr, 2))
For II = LBound(wArr) To UBound(wArr)
    For I = 1 To UBound(wArr, 2)
        myArr(1, I) = wArr(II, I)
    Next I
    For I = UBound(myArr, 2) To LBound(myArr, 2) + 1 Step -1
        noK = False
        For K = LBound(myArr) To UBound(myArr, 2) - I + 1
        noK = False
            For J = K To K + I - 2
                If myArr(1, J) <> (myArr(1, J + 1) - 1) Then
                    noK = True
                    Exit For
                End If
            Next J
            If noK = False Then
                OArr(II, I) = OArr(II, I) + 1
                For L = K To K + I - 1
                    myArr(1, L) = 999#
                Next L
            End If
        Next K
    Next I
    For I = LBound(myArr) To UBound(myArr, 2)
        If myArr(1, I) <> 999 Then OArr(II, 1) = OArr(II, 1) + 1
    Next I
Next II
Range(myOut).Resize(UBound(OArr), UBound(OArr, 2)).Value = OArr
End Sub


Le righe marcate <<< vanno modificate come da tua situazione; in particolare myOut indica la cella di partenza per la scrittura dei risultati.

I codici vanno inseriti in un "Modulo Standard" del vba

Con la macro i tempi di esecuzione su 10mila righe sono di pochi decimi di secondo, ma i risultati non cambiano automaticamente se cambiano i dati di partenza.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: numeri consecutivi per riga

Postdi miko » 26/11/19 21:52

Salve,
anche in questo caso non ho avuto tempo libero per dedicarmi al progetto, è rimasto come era all'inizio del topic.
ma volevo ringraziarti per quanto hai realizzato.
ho solo inserito i codici nel file di esempio che ho inviato, perciò non posso apprezzare ed esprimermi
sui tempi di esecuzione, ma solo verificare il risultato.
tutto funziona perfettamente, grazie.
devo chiederti però due cose:

1) cosa significa o svolge la riga >>>> myArr(1, L) = 999#

2) se puoi aggiungere una condizione che spiego come segue:

supponiamo di avere inizialmente le righe da 10 a 100 e di aver determinato, per queste righe, i numeri consecutivi;
se ora aggiungiamo altre righe da 101 a 120 e inutile ripetere il calcolo dei consecutivi dalla riga 10,
e cioè per le righe da 10 a 100, questo è già stato fatto nel calcolo precedente,
ma è sufficiente eseguire il calcolo solo per le righe che sono state aggiunte successivamente
cioè per le righe da 101 a 120.

ciao e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: numeri consecutivi per riga

Postdi Anthony47 » 27/11/19 19:19

Con myArr(1, L) = 999# modifico la copia dei dati su cui sto' facendo i calcoli in modo da assicurarmi che celle gia' dichiarate "consecutive" siano escluse dai calcoli successivi; infatti 999 non puo' essere consecutivo a nessun numero gia' presente.

Quanto alla modifica richiesta, la macro non ha nessun modo di sapere in modo affidabile su quale area ha gia' fatto i conteggi. Inoltre se i tempi di esecuzione fossero brevissimi (come mi pare) l'ipotetico vantaggio sarebbe marginale.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: numeri consecutivi per riga

Postdi miko » 01/12/19 06:36

Ciao e Buona Domenica,
grazie per le spiegazioni.
appena ho tempo "studierò" il codice, poi informo sui tempi di esecuzione.
quasi sicuramente, data la complessità della macro, almeno per me, e la mia limitata
conoscenza delle matrici e di excel in generale, tornerò a chiederti spiegazioni.
saluti, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "numeri consecutivi per riga":


Chi c’è in linea

Visitano il forum: Nessuno e 51 ospiti