Condividi:        

Correzione Macro ricerca correlazione 100%

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

Correzione Macro ricerca correlazione 100%

Postdi papiriof » 20/03/14 13:15

In questo topic viewtopic.php?f=26&t=101416&sid=3396e87221d6a1c3aad954cfc7e914b8#p586489
che riepilogo brevemente:
Ho due colonne la prima contiene dei codici la seconda dei numeri. Nella prima colonna ogni codice può essere
ripetuto ma, se ripetuto,nella seconda colonna corrispondono numeri diversi;viceversa nella seconda colonna ci possono essere
numeri uguali ma a numeri uguali corrispondono codici diversi.
la questione è stata risolta da CANAPONE (con formula) e ottimizzata da Anthony con la sottonotata macro

Codice: Seleziona tutto
    Sub pappr()
    Dim VArr1, I As Long, LastA As Long, Dest As String, V As Long, H As Long, rDim As Long
    Dim RArr(), cPos As Variant, cRig As Long, myComm As Long
    '
    Dest = "K2"     '<<< L' area ove sara' creata la tabella esiti
    '
    LastA = Cells(Rows.Count, 1).End(xlUp).Row
    VArr1 = Range("A2:B" & LastA).Value
    '
    Range(Dest).Resize(100, 100).ClearContents     ' AZZERA Area di creazione risultati
    Range("A1:A" & LastA).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
            Dest), Unique:=True
    rDim = Range(Dest, Range(Dest).End(xlDown)).Count - 1
    Range(Dest).Offset(1, 0).Resize(rDim, 1).Copy
    Range(Dest).Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=True
    Application.CutCopyMode = False
    r3d1 = Application.WorksheetFunction.Min(Range("B2:B" & LastA).Value)
    r3d2 = Application.WorksheetFunction.Max(Range("B2:B" & LastA).Value)
    ReDim RArr(1 To rDim, r3d1 To r3d2)
    'riposiziona:
    For I = LBound(VArr1, 1) To UBound(VArr1, 1)
        cPos = Application.Match(VArr1(I, 1), Range(Dest).Offset(0, 1).Resize(1, rDim), 0)
        RArr(cPos, VArr1(I, 2)) = 1
    Next I
    'Calcola:
    For V = 1 To rDim - 1
        For H = V + 1 To rDim
            myComm = 0
            For I = LBound(RArr, 2) To UBound(RArr, 2)
                If RArr(V, I) <> "" Then
                    If RArr(H, I) = RArr(V, I) Then
                        myComm = myComm + 1
                    End If
                End If
            Next I
            Range(Dest).Offset(V, H).Value = myComm
        Next H
    Next V
    End Sub

La macro assume che il codice sia in colonna A e il numero in colonna B; verra' creata una tabella all' indirizzo specificato (K2, nel mio codice),
con in verticale e in orizzontale i vari Codici, e all' incrocio il "numero di numeri" in comune.
Attenzione: non sapendo quanto sara' grande la tabella di destinazione la macro AZZERA un' area di 100 righe * 100 Colonne a partire dall' indirizzo
specificato (K2 nel mio codice); tienilo in conto quando decidi dove creare la tabella degli esiti.
ORA VORREI SAPERE SE POSSIBILE CAMBIARE LA MACRO (MANTENENDO LO STESSO OUTPUT in verticale e in orizzontale i vari Codici, e all' incrocio UNA "X" CHE STA A SIGHIFICARE UNA CORRELAZIONE ESATTA CIOè CHE UN CODICE ABBIA GLI STESSI ESITI DI UN ALTRO CODICE)
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 392
Iscritto il: 16/02/10 13:23

Sponsor
 

Re: Correzione Macro ricerca correlazione 100%

Postdi Anthony47 » 21/03/14 01:13

Nell' altra discussione avevamo marcato il "numero di numeri" in comune; adesso vuoi invece marcare quelle coppie che hanno "tutti i numeri in comune", giusto?
Mi dici se puoi assicurare che i numeri siano ordinati in modo crescente? Sarebbe una bella semplificazione all' algoritmo di confronto.
Comunque "stasera" non ci posso lavorare.

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

Re: Correzione Macro ricerca correlazione 100%

Postdi papiriof » 21/03/14 07:54

Anthony47 ha scritto:Nell' altra discussione avevamo marcato il "numero di numeri" in comune; adesso vuoi invece marcare quelle coppie che hanno "tutti i numeri in comune", giusto? GIUSTO
Mi dici se puoi assicurare che i numeri siano ordinati in modo crescente? Sarebbe una bella semplificazione all' algoritmo di confronto.
Comunque "stasera" non ci posso lavorare.NON C'E' PROBLEMA, PRIMA DI LANCIARE L'EVENTUALE MACRO GLI DO UN ORDINATA DEI NUMERI, D'ALTRA PARTE NON LO POTREBBE FARE ANCHE LA MACRO STESSA? POSTO CHE LE DUE COLONNE DA MANIPOLARE INIZIANO DA "A1" E "B1" NON HANNO ETICHETTA E TERMINANO AMBEDUE ALLA RIGA 2300, LO SVILUPPO POI SI CONCRETIZZA DA K2 COME L'ALTRA GENERANDO UN QUADRATO DI 450 X 450 ALL'INTERNO DEL QUALE SI I NUMERI IN COMUNE SOLO SE QUESTI SONO TUTTI
Ciao

Se può essere utile, stiamo parlando di "Lotto" con la macro di prima si riesce a stabilire gli ambi più frequenti che si sono susseguiti in periodo stabilito in questo stabilisco quello che i lottologhi chiamano equilibrio istabile
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 392
Iscritto il: 16/02/10 13:23

Re: Correzione Macro ricerca correlazione 100%

Postdi Anthony47 » 21/03/14 19:29

Riguardando la macro originale ho identificato un algoritmo che non richiede nessun ordine particolare; la nuova macro e' questa:
Codice: Seleziona tutto
Sub papiriof22()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101416
'Aggiornamento per http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101580
Dim VArr1, I As Long, LastA As Long, Dest As String, V As Long, H As Long, rDim As Long
Dim RArr(), cPos As Variant, cRig As Long, myComm As Long, MYDIFF As Long
Dim TabRes()
'
Dest = "K2"     '<<< L' area ove sara' creata la tabella esiti
'
myTim = Timer
LastA = Cells(Rows.Count, 1).End(xlUp).Row
VArr1 = Range("A2:B" & LastA).Value
'
Range(Dest).CurrentRegion.ClearContents     ' AZZERA Area di creazione risultati
Range("A1:A" & LastA).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        Dest), Unique:=True
rDim = Range(Dest, Range(Dest).End(xlDown)).Count - 1
ReDim TabRes(1 To rDim, 1 To rDim)

Range(Dest).Offset(1, 0).Resize(rDim, 1).Copy
Range(Dest).Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
Application.CutCopyMode = False
r3d1 = Application.WorksheetFunction.Min(Range("B2:B" & LastA).Value)
r3d2 = Application.WorksheetFunction.Max(Range("B2:B" & LastA).Value)
ReDim RArr(1 To rDim, r3d1 To r3d2)
'riposiziona:
For I = LBound(VArr1, 1) To UBound(VArr1, 1)
    cPos = Application.Match(VArr1(I, 1), Range(Dest).Offset(0, 1).Resize(1, rDim), 0)
    RArr(cPos, VArr1(I, 2)) = 1
Next I
'Calcola:
For V = 1 To rDim - 1
    For H = V + 1 To rDim
    DoEvents
        myComm = 0: MYDIFF = 0
        For I = LBound(RArr, 2) To UBound(RArr, 2)
            If RArr(V, I) <> "" Then
                If RArr(H, I) = RArr(V, I) Then
                'comunanze
                    myComm = myComm + 1
                Else
                'scomunanze
                    MYDIFF = MYDIFF + 1
                End If
            Else
            'scomunanze
                If RArr(H, I) <> "" Then MYDIFF = MYDIFF + 1
            End If
        Next I
        TabRes(V, H) = myComm
       If MYDIFF = 0 Then TabRes(H, V) = "X"
'        Range(Dest).Offset(V, H).Value = myComm
'        If MYDIFF = 0 Then Range(Dest).Offset(H, V).Value = "X"
    Next H
Next V
Range(Dest).Offset(1, 1).Resize(rDim, rDim).Value = TabRes
MsgBox ("Finito... " & Timer - myTim)
End Sub

La macro e' "anfibia", cioe' restituisce sia i valori in comune (nella semitabella in alto/Dx) che l' indicazione di corrispondenza totale (nella semitabella in basso /Sx).
Inoltre grazie a un terzo memory array i tempi di esecuzione sono stati ridotti circa a un terzo.

Se può essere utile, stiamo parlando di "Lotto" con la macro di prima si riesce a stabilire gli ambi più frequenti che si sono susseguiti in periodo stabilito in questo stabilisco quello che i lottologhi chiamano equilibrio istabile
Non, non mi e' utile, anzi... (in genere questi studi mi fanno venire l' orticaria: gioca 1, 2 ,3, 4 e 5, Quintina secca sulla ruota di Alberobello, e se vinci dividiamo a meta' :D :D ).

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

Re: Correzione Macro ricerca correlazione 100%

Postdi papiriof » 22/03/14 09:26

Grazie Anthony la macro adesso è velocissima , considerando la mole di lavoro che deve fare.
In una prova che ho fatto però non trovo nessun riscontro con la " X " e a me sembra strano anche se possibile.
Per trovare le " X "(data l'ampiezza dell'intervallo) sono costretto a usare " TROVA" e non trovandole ho messo io una " X " e l'ho trovata quindi 2 sono le cose 1)Effettivamente ,nella prova che ho fatto, non ci sono correlazioni totali 2)La macro non riesce a rilevarle
Per essere sicuro che effettivamente non ci sono correlazioni totali devo fare delle prove, quindi ci si aggiorna .
Mi premeva adesso,considerato il grosso lavoro che hai fatto, riscontrare.
Per correlazione totale io intendo questo:il cod 1TO01 ha avuto esito al num. 8700 e al num 8736 e nessun altro esito
il cod 1TO37 ha avuto esito al num. 8700 e al num 8736 e nessun altro esito
ambedue i codici hanno avuto diciamo "vita parallela" quindi sono in "equilibrio instabile" che può finire solo quando si rompe questo equilibrio con il solo esito di un codice dei due.
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 392
Iscritto il: 16/02/10 13:23

Re: Correzione Macro ricerca correlazione 100%

Postdi Anthony47 » 22/03/14 14:09

La macro dovrebbe individuare quelle coppie che hanno "tutti" gli elementi in comune; cioe' che non hanno elementi non condivisi col il gemello. Gli "elementi" di cui parlo sono i numeri di colonna B.
Per il collaudo ho usato elenchi inventati. Piu' che indagare sulla correttezza dei pochi X restituiti io ho inserito alcune coppie di codici a cui ho assegnato piu' elementi, verificando l' esito al variare di questi elementi.

Tocca a te scovare le discrepanze piu' subdole...

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

Re: Correzione Macro ricerca correlazione 100%

Postdi papiriof » 22/03/14 16:14

Anthony47 ha scritto:La macro dovrebbe individuare quelle coppie che hanno "tutti" gli elementi in comune; cioe' che non hanno elementi non condivisi col il gemello. Gli "elementi" di cui parlo sono i numeri di colonna B.
Per il collaudo ho usato elenchi inventati. Piu' che indagare sulla correttezza dei pochi X restituiti io ho inserito alcune coppie di codici a cui ho assegnato piu' elementi, verificando l' esito al variare di questi elementi.

Tocca a te scovare le discrepanze piu' subdole...

Ciao!

Allora Anthony la macro funziona benissimo non riuscivo a trovare riscontri per il semplice fatto che su 120 estrazioni questo "equilibrio" è estremamente raro cioè si sfalda prima ,tuttavia esiste e dopo aver cambiato 2 codici rendendoli uguali negli esiti la macro li ha evidenziati con la " X "
Per quanto riguarda "se vinci dividiamo a meta' " devo dire che non gioco quasi mai proprio perchè , a questo gioco,so che in genere non si vince ma è anche chiaro che qualcuno riesce a vincere e se (if) riscontrassi una situazione interessante,se(if) mi decidessi di giocare,se(if) vincessi una cospiqua somma...... perchè no!! :D :D ...troppi if :D :D
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 392
Iscritto il: 16/02/10 13:23


Torna a Applicazioni Office Windows


Topic correlati a "Correzione Macro ricerca correlazione 100%":


Chi c’è in linea

Visitano il forum: Nessuno e 58 ospiti