Condividi:        

Calcolo "distanza" tra stessi numeri

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

Calcolo "distanza" tra stessi numeri

Postdi giorgioa » 22/07/14 11:36

Salve,

cortesemente vorrei un aiuto per risolve quanto sto per esporre.
si tratta di cercare le distanze uguali delle stesso numero in colonna singola.
Nel file allegato ci sono 2 fogli di cui uno "CIFRA" e l'altro "DETTAGLI"
Nel foglio cifra in colonna C10:C e fino a J ci sono max 10 numeri compreso lo zero.
come conoscere le distanze fra gli stessi numeri.
I dati ricavati andrebbero scritti nel foglio dettagli in colonna N e in M dello stesso
rigo e a seguire è indicato quanti ce ne sono mentre in rigo 1 è indicato il numero
da prendere in considerazione.
Preciso che i dati da ottenere riguardano la colonna singola e non l'insieme delle colonne.

http://www.filedropper.com/cifre

Aspetto per eventuale spiegazioni.
Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Sponsor
 

Re: Distanze uguali

Postdi Anthony47 » 22/07/14 14:07

I dati ricavati andrebbero scritti nel foglio dettagli in colonna N e in M dello stesso
rigo e a seguire è indicato quanti ce ne sono mentre in rigo 1 è indicato il numero
da prendere in considerazione.
Preciso che i dati da ottenere riguardano la colonna singola e non l'insieme delle colonne.
Personalmente non ho capito i termini del problema.
In ogni riga C:J di CIFRE ci sono 8 numeri (e in ogni colonna ce ne sono 5328), che cosa vorresti inserire in colonna M e N di Dettagli?

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

Re: Distanze uguali

Postdi giorgioa » 22/07/14 18:36

Salve,

si parte da colonna Cdi cifre, in tutta la colonna ci sono solo
i numeri da 0 a 9;
in questa colonna (questo vale anche per le altre) identificare
la distanza che c'è tra il numero 1 ed in numero 1;
in dettagli a N2 scrivere quante volte si è verificato la distanza 1;
a N3 scrivere quante volte il numero 1 ha la distanza 2;
seguendo in dettagli O2 come indicato in rigo 1
trovare quante distanze del 2 a passo 1.
Esempio del numero 3 di cifre colonna C
c10=3;c13=3 contare in tutta la colonna quanti 3 sono
presenti a passo 2; e questi dati vanno messi in dettagli a colonna P
di rigo 2.
Esempio del 7: cifre colonna c12=7 l'altro 7 lo troviamo scendendo alla 10cima casella
c21 questo dato va scritto in dettagli in colonna T al rigo 11.
e poniamo il caso di aver trovato un solo elemento in T11 scrivere 1
Mi fermo sperando in qualche chiarimento da parte mia.
NB aggiungo pur avendolo citato di scartare il conteggio sul numero o zero
Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Distanze uguali

Postdi Anthony47 » 23/07/14 01:48

Penso che potrebbe essere utile questa macro:
Codice: Seleziona tutto
Sub myPasso()
Dim ResArr(1 To 5000, 1 To 9), myArr, ResBase As Range, myArea As Range, myH As Long
Dim I As Long, J As Long, mySVal As Long, jMax As Long
'
'mytim = Timer
Set ResBase = Sheets("Dettagli").Range("N2")        '<<< L' inizio dell' area risultati
Set myRange = Sheets("Cifre").Range("C10:C10000")   '<<< L' are dei dati da analizzare
'
Set myArea = Application.Intersect(Sheets(myRange.Parent.Name).UsedRange, myRange)
myArr = myArea.Value
myH = myArea.Rows.Count
For I = 1 To myH - 1
    If myArr(I, 1) > 0 Then
        mySVal = myArr(I, 1)
        J = 1
        Do
            If myArr(I + J, 1) = mySVal Then
                If J > jMax Then jMax = J: Debug.Print jMax & " - " & mySVal
                ResArr(J, mySVal) = ResArr(J, mySVal) + 1
                Exit Do
            End If
            J = J + 1
            If (I + J) > myH Then Exit Do
        DoEvents
        Loop
    End If
Next I
ResBase.Resize(jMax, 9).Value = ResArr
'MsgBox (Timer - mytim)
End Sub
Le istruzioni marcate <<< vanno personalizzate
La macro compilera' le colonne N:V di Dettagli, per le righe necessarie (che sono ben piu' delle 30 che hai marcato in colonna M).

Ciao, fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19480
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Distanze uguali

Postdi giorgioa » 23/07/14 07:24

Salve,

sperando vada bene ho dichiarato come variabile myRange as Range;
superato questo mi da errore Run-Time 9 e si ferma su;
ResArr(J,mySVal)=ResArr(j, mySVal)+1;
e quindi non va oltre.

Se ti può servire in foglio Cifre le colonne interessate alla ricerca dei dati
sono state tutte definite con i seguenti nomi
colonna C = Area_1; D = Area_2; E = Area_3 eccetera.

Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Distanze uguali

Postdi Anthony47 » 23/07/14 09:47

La cosa piu probabile è che ci siano numeri piu alti di 9.

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

Re: Distanze uguali

Postdi giorgioa » 23/07/14 10:13

Salve,

ipotizzo ma non più di tanto e non ho controllato
tutta la colonna C ma in altre ho notato che c'è
qualche 0 (ZERO ).
Potrebbe essere questo il 10mo numero?

L'ho buttata così, ma più di tanto non saprei dirti.

Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Distanze uguali

Postdi Anthony47 » 23/07/14 23:48

Rinnovo la mia diagnosi (numeri piu' alti di 9); lo "zero" non c' entra.
Per verificare i tuoi dati hai tanti strumenti; Trova (Contr-Maiusc-t), Filtro automatico (visualizza >9), funzioni Max e Grande, la barra di stato che puo' essere configurata per visualizzare i Max.
Oppure quando si ferma e sei in Debug, premi Contr-g e vedrai una lista di xxx - yy: l' ultimo yy e' il valore su cui si e' fermato.

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

Re: Distanze uguali

Postdi giorgioa » 24/07/14 07:39

Salve,

ho messo in atto i consigli e credo si possa andare avanti.
Effettivamente ci sono 2 10 in colonna C,
alla prima riga della macro ho sostituito il 9 con 10 e la macro non trova
ostacoli.
Non volevo considerare il 10 che come il 9 e in parte il numero 8
sono ininfluenti ai fini della statistica e poi volevo che la macro
si fermasse a rigo 30 come indicato in colonna M di dettagli essendo dati
che non andrò mai a controllare, poi rimangono le altre 7 colonne
da cui ricavare il resto delle statistiche.

Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Distanze uguali

Postdi Anthony47 » 24/07/14 14:09

giorgioa oggi ha scritto:Non volevo considerare il 10 che come il 9 e in parte il numero 8 sono ininfluenti ai fini della statistica e poi volevo che la macro si fermasse a rigo 30

giorgioa ieri ha scritto:in tutta la colonna ci sono solo i numeri da 0 a 9

La prossima volta pero' sii chiaro e soprattutto non dare informazioni sbagliate, e il risultato arrivera' prima e sara' piu' preciso; perche' prima di scoprirlo tu l' ho dovuto scoprire io che tra i tuoi dati c' erano dei 10, degli 11, dei 12 e dei 13; con relative perdite di tempo...

I modo piu' semplice per convivere con numeri superiori a 9, ignorandoli, e' di modificare
If myArr(I, 1) > 0 Then
In
If myArr(I, 1) > 0 And myArr(I, 1) <10 Then

Se vuoi limitarti ai ritardi fino a 30, modifica
ResBase.Resize(jMax, 9).Value = ResArr
In
ResBase.Resize(30, 9).Value = ResArr

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

Re: Distanze uguali

Postdi giorgioa » 24/07/14 15:44

Salve,

che poi ho scoperto che ci sono i 10,11,12 e addirittura
i 13; su 5 mila e passa righe non sapevo che esistessero
e poi certi dettagli per chi come me (non addetto alla programmazione)
sembrano appunto ininfluenti, mentre per quanto riguarda
i dati riferiti a 9, (dettagli)ci si accorge a dati reali che prima non
potevo sapere.

Ho sistemato le 2 righe che mi hai indicato, ora rimarrebbero i dati
delle altre 7 colonne di cifre da mettere nelle colonne
Y, AJ,AU,BF,BQ,CB,CM - di dettagli.

Per non andare ancora in errore scrivo quanto ho cambiato
if myArr(I,1)>0 then con
if myArr(I,1)>1 and myArr(I,1)<8 then
poi
ResBase.Resize(jmax,9).value =ResArr con
ResBase.Resize(20,7).value = ResArr
mentre in prima riga ho cambiato il valore 5000 con 10000, 1 to 13

Come vedi questi dati li ho cambiati perchè ho la realtà di essi
Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Calcolo "distanza" tra stessi numeri

Postdi Anthony47 » 25/07/14 00:33

Avendo modificato l' If la dimensione dell' array ResArr puo' rimanere come era (ma la modifica non fa male, solo mangia un po' di memoria).

Per "lavorare" tutte le colone la cosa piu' semplice e' inserire in un ciclo For JJ=0 to 0 /Next JJ il nucleo della precedente macro:
Codice: Seleziona tutto
Sub myPassoAll()
Dim ResArr(), myArr, ResBase As Range, myArea As Range, myH As Long
Dim I As Long, J As Long, mySVal As Long, jMax As Long, JJ As Long, Dels As Long
'
mytim = Timer
Set ResBase = Sheets("Dettagli").Range("N2")        '<<< L' inizio dell' area risultati
Set myRange = Sheets("Cifre").Range("C10:C10000")   '<<< L' are dei dati da analizzare
Dels = 30                                           '<<< Il numero ei risultati da visualizzare
'
ReDim ResArr(1 To Dels + 10, 1 To 9)
For JJ = 0 To 7
    Set myArea = Application.Intersect(Sheets(myRange.Parent.Name).UsedRange, myRange.Offset(0, JJ))
    myArr = myArea.Value
    myH = myArea.Rows.Count
    For I = 1 To myH - 1
        If myArr(I, 1) > 0 And myArr(I, 1) < 9 Then
            mySVal = myArr(I, 1)
            J = 1
            Do
                If myArr(I + J, 1) = mySVal Then
                    If J > jMax Then jMax = J ': Debug.Print jMax & " - " & mySVal
                    ResArr(J, mySVal) = ResArr(J, mySVal) + 1
                    Exit Do
                End If
                J = J + 1
                If J > (Dels + 10) Then Exit Do
                If (I + J) > myH Then Exit Do
            DoEvents
            Loop
        End If
    Next I
    ResBase.Offset(0, 11 * JJ).Resize(Dels * 2, 9).ClearContents
    ResBase.Offset(0, 11 * JJ).Resize(Dels, 9).Value = ResArr
Next JJ
MsgBox (Timer - mytim)
End Sub

Poiche' non ti interessano tutti i risultati ho inserito anche un parametro che imposta quanti ne vuoi visualizzare (variabile Dels); questo consente anche di interrompere le ricerche senza procedere su tutto l' elenco, dimezzando cosi' i tempi di esecuzione, e di dimensionare meglio l' array ResArr.

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

Re: Calcolo "distanza" tra stessi numeri

Postdi giorgioa » 25/07/14 09:44

Salve,

si dovrebbe rivedere i dati che si ottengo dopo quelli di colonna C di cifre.
Ad esempio in dettagli al rigo 1 presentano i seguenti dati del ciclo J:
colonna CN=654 mentre il dato effettivo è 56
colonna CO=2052 mentre il dato effettivo è 171
colonna CP=2588 mentre il dato effettivo è 217
Ho citato questo ciclo perchè i dati sono più esagerati
ma da rivedere tutti i cicli tranne tranne il ciclo C cioè il primo.

I dati potrebbero discostarsi di 1 o 2 unità perchè dell'archiovio
ho fatto l'aggiornamento di 2 righe.

Spero di essere stato chiaro.

Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Calcolo "distanza" tra stessi numeri

Postdi giorgioa » 25/07/14 10:12

Ciao,

mi sono accorto che ad ogni ciclo aggiunge sempre il
numero del primo ciclo.
ad esempio colonna 2 del ciclo_c 85 oppure 83 (per via dell'aggiornamento)
alla colonna 2 del ciclo_D fa 85+85 =170 cicrca
alla colonna 2 del ciclo_E fa 170+85== 255; circa
alla colonna 2 del ciclo_F fa 255+85=340 circa, eccetera.

spero ti siano utili questi dati
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Calcolo "distanza" tra stessi numeri

Postdi giorgioa » 25/07/14 20:17

Salve,

questa mattina ho postato dei dati e non
so perchè non si trovano in coda e portano
la data odierna cioè 25/7 c.a.

Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Calcolo "distanza" tra stessi numeri

Postdi Anthony47 » 25/07/14 23:53

Per il problema dei dati che si accumulano, bisogna infatti ripulire l' array dei risultati a inizio di ogni ciclo:
Codice: Seleziona tutto
    Erase ResArr                 '<<< AGGIUNGERE
    For I = 1 To myH - 1      '<<< esistente

Per l' ultima segnalazione, veramente non l' ho capita...

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

Re: Calcolo "distanza" tra stessi numeri

Postdi giorgioa » 26/07/14 08:13

Salve,

ho inserito l'Erase ResArr ma la macro si blocca sul dato
sul secondo IF del For cioè prima exit do
quindi:
ResArr(J, mySVal) = ResArr(J, mySVal) +1

In verità dopo le dichiarazioni Variabili avevo creato,
prima di questa aggiunta,
una riga del tipo Range("N2:V10000,Y2:AG10000, eccetera
selection Clearcontents
ma dava sempre gli stessi risultati.
Cmq di più non so dirti.

Riguardo all'ultimissimo post
intendevo, in genere o come sempre ogni post inserito
si accoda all'ultimo e non trovandosi in quella posizione
i 2 post con notizie utili mi son detto che probabilmente
non sarebbero stati letti a causa di trovarsi nel mezzo
degli altri post.
Ma anche l'ultimo ha avuto lo stesso effetto degli altri.
Era come dire "me li leggeranno?, come per dire forse mi hanno
ABBANDONATO, ma constato che non è così.
L'ho scritta così come mi è passata per la testa(la battuta)
Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Calcolo "distanza" tra stessi numeri

Postdi Anthony47 » 26/07/14 11:01

Prova la macro che ho suggerito sul file che hai pubblicato, quando funziona puoi fare altri adattamenti.
ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19480
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Calcolo "distanza" tra stessi numeri

Postdi giorgioa » 26/07/14 12:27

Salve,

mi dispiace ma ma si ferma sempre sulla stessa riga indicata
nell'ultimo post.
Per sicurezza ho riscaricato il file da me proposto ma la
situazione è sempre la stessa.

Ciao
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: Calcolo "distanza" tra stessi numeri

Postdi Anthony47 » 26/07/14 15:09

Hai ragione :!: :D (eppure mi sembrava di averlo testato)
Togli la Erase e metti una Redim:
Codice: Seleziona tutto
        ReDim ResArr(1 To Dels + 10, 1 To 9)   '<<< AGGIUNGERE QUESTA invece della Erase
        For I = 1 To myH - 1                   '<<< Esistente

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

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Calcolo "distanza" tra stessi numeri":


Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti