Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Calcolo combinatorio - Ricerca, cancella ambi ,terni,quaterne, ripetute o uguali

Ultimo Aggiornamento: 18/09/2016 22:15
Post: 61
Registrato il: 03/10/2015
Città: ALBAREDO PER SAN MARCO
Età: 44
Utente Junior
2003
OFFLINE
15/08/2016 20:58

Buon Ferragosto a tutti. Allego file.xls e foto. Come vedete nella foto nelle righe 124 125 126 127 ho quattro quaterne uguali i numeri sono 21 22 53 86.
Non mi interessa l'ordine in cui scritta per primo l'importante e che rimane solo una e che vengono cancellate tutte le altre. Possono anche essere più di quattro nel foglio.
Lo stesso vale per tutti gli ambi (vedere foto )e terni (vedere foto).Mi servirebbe una macro che mi cancella tutti questi dati e ne rimane solo uno. L'area di lavoro comprende le colonne c d e f e non possono essere spostate perché dopo questi dati devo riportarli in un altro foglio.Ciao e grazie anticipatamente Matteo [SM=x423051]
Post: 234
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Junior
Excel2019
OFFLINE
16/08/2016 11:13

Ciao Matteo
non so se è quello che cercavi esattamente ma prova questa macro (che è da perfezionare, dove devono essere dichiarate le variabili, ecc.)
Sub Elimina()
Dim cmb() As String, elim()
Range("H:L").ClearContents
urC = Cells(Rows.Count, 3).End(xlUp).Row
urD = Cells(Rows.Count, 4).End(xlUp).Row
urE = Cells(Rows.Count, 5).End(xlUp).Row
urF = Cells(Rows.Count, 6).End(xlUp).Row
'quaterna
ReDim cmb(1 To urF)
For i = 1 To urF
    cmb(i) = Cells(i, 3) & "," & Cells(i, 4) & "," & Cells(i, 5) & "," & Cells(i, 6)
Next i
fino = urF: num = 3: mx = 4: cln = 8: a = 1
GoSub ciclo
'terno
ReDim cmb(urE - urF)
b = 1
For i = urF + 1 To urE
    cmb(b) = Cells(i, 3) & "," & Cells(i, 4) & "," & Cells(i, 5)
    b = b + 1
Next i
fino = urE - urF: num = 2: mx = 3: 'cln = 10
GoSub ciclo
'ambo
ReDim cmb(1 To urD - urE + 1)
b = 1
For i = urE + 1 To urD
    cmb(b) = Cells(i, 3) & "," & Cells(i, 4)
    b = b + 1
Next i
fino = urD - urE: num = 1: mx = 2: 'cln = 12
GoSub ciclo
a = 1
For i = urC To 1 Step -1
    For w = 3 To 6
        If Cells(i, w) <> "" Then nr = nr & Cells(i, w) & ","
    Next w
    nr = Left(nr, Len(nr) - 1)
    For j = 1 To UBound(elim)
        If nr = elim(j) Then
            Rows(i).EntireRow.Delete (xlUp)
        End If
    Next j
    nr = ""
Next i
Exit Sub
'
ciclo:
For i = 1 To fino
    uno = Split(cmb(i), ",")
    For j = i + 1 To fino
        due = Split(cmb(j), ",")
        For k = 0 To num
            For h = 0 To num
                If uno(k) = due(h) Then pr = pr + 1
                If pr = mx Then
                    ReDim Preserve elim(1 To a)
                    elim(a) = cmb(j)
                    a = a + 1
                End If
            Next h
        Next k
        pr = 0
    Next j
Next i
    Return
End Sub

Prova e fai sapere. Ciao,
Mario
Post: 596
Registrato il: 06/04/2013
Utente Senior
2010
OFFLINE
16/08/2016 11:17

Ciao
propongo un'altra possibile soluzione:
Sub CombinUguali()
Dim Qix As Object, a, i As Long, r As Long, rs As Long
Set Qix = CreateObject("scripting.dictionary")
Set a = Range("C1").CurrentRegion.Resize(, 4)

For i = 1 To a.Rows.Count
    a.Rows(i).Sort a(i, 1), Header:=xlNo, Orientation:=xlLeftToRight
    Qix(Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4)), Chr(2))) = 1
Next i

a.ClearContents: r = 1
For Each c In Qix.keys
    r = r + 1
    a(r, 1).Resize(, 4) = Split(c, Chr(2))
Next c
MsgBox "Fine elaborazione"
End Sub


Nota: se le righe contengono più di 4 elementi, la macro va variata.
(si potrebbe anche automatizzare)
Dura un po' di più di quella di Marius (saluti) ma è breve [SM=g27827]

@Marius: è una vita che non trovavo l'uso di GoSub!! [SM=x423030]

saluti
[Modificato da dodo47 16/08/2016 11:22]
Domenico
Win 10 - Excel 2016
Post: 235
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Junior
Excel2019
OFFLINE
16/08/2016 12:07

Ciao Domenico
uso Gosub quando sono ... troppo ingarbugliato. In effetti si poteva mettere tutto in una Function. Ma, fortunatamente, il risultato non cambia.

@gattodimarmo
dimenticavo di dirti che i dati devono essere ben incolonnati (me ne sono ricordato vedendo la macro di Dodo) per bene, cioè prima tutte le quaterne, poi tutti i terni e poi tutti gli ambi. Devi spostare l'ultima riga del tuo file.

Salve a tutti,
Mario
Post: 597
Registrato il: 06/04/2013
Utente Senior
2010
OFFLINE
16/08/2016 12:54

Ciao
dimenticavo di dire che la mia proposta "ordina" orizzontalmente le varie combinazioni mentre, verticalmente lascia l'ordine originario escludendo i duplicati dal 2° in poi.
Non importa quale sia l'ordine originario

saluti
Domenico
Win 10 - Excel 2016
Post: 4.890
Registrato il: 14/11/2004
Utente Master
Office 2019
OFFLINE
16/08/2016 15:26

Duplicati
Ciao Dodo, mi spieghi perche ordini orizzontalmente i numeri.

non ho fatto un controllo accurato, ma elimina anche quelli uguali ma in posizione diverse?, mi interessa, deve essere per forza crescente, l'ordinamento.

Cioè

21-41-65-82

41-21-82-65

Ciao By Sal [SM=x423051]



se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
Post: 598
Registrato il: 06/04/2013
Utente Senior
2010
OFFLINE
16/08/2016 16:25

Ciao
in questo modo si, devono essere ordinati per riga ed elimina gli uguali anche in posizioni diverse.

Fai conto che in questo caso "scripting.dictionary" è come se fosse una new collection con chiave univoca che, pertanto non accetta duplicati.
1 2 3 4
2 3 1 4
se immessi nella collection non genererebbero un errore di chiave duplicata, questo il motivo per cui uso il sort delle righe.
Quindi una volta ordinati hai:
1 2 3 4
1 2 3 4
dove la seconda chiave risulta duplicata.

Volendo (e tra l'altro semplificando ora che ci penso) si può utilizzare una variabile d'appoggio dove inserire la riga originaria e, se la collection non va in errore, stampare quella, mantenendo così l'ordine iniziale.
Prova (ho fatto l'esempio con la collection ma è uguale):
Sub CombinUguali3()
Dim a, a1, i As Long, r As Long, mArr As New Collection
Set a = Range("C1").CurrentRegion.Resize(, 4)
r = 1
For i = 1 To a.Rows.Count
    a1 = Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4)), Chr(2))
    a.Rows(i).Sort a(i, 1), Header:=xlNo, Orientation:=xlLeftToRight
    b = Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4)), Chr(2))
    On Error Resume Next
    mArr.Add b, b
    If Err = 0 Then
        a(r, 1).Resize(, 4) = Split(a1, Chr(2))
        r = r + 1
    End If
    On Error GoTo 0
Next i
Range("C" & r & ":F" & Rows.Count).ClearContents
MsgBox "Fine elaborazione"
End Sub


Da controllare.

cari saluti
[Modificato da dodo47 17/08/2016 10:53]
Domenico
Win 10 - Excel 2016
Post: 61
Registrato il: 03/10/2015
Città: ALBAREDO PER SAN MARCO
Età: 44
Utente Junior
2003
OFFLINE
17/08/2016 20:30

Ulteriore macro prima di lanciare la macro precedente.
Buona sera a tutti ho provato le macro e mi sembrano che vanno bene quasi tutte e tre. Torniamo al discorso di Dodo 47 che propone di ordinare orizzontalmente .Sal e giustissimo ti spiego ma è una mia comodita.Guarda la foto che allego e il file.xls.L'area di lavoro C,D,E,F comprende lo sviluppo delle quaterne, terni ,ambi ecc. La colonna A e la colonna B in pratica quando ordino devono girare contemporaneamte alle colonne C,D,E,F perché se no perdo la posizione dei dati.Ho fatto io il foglio 2 in manuale per vedere l'ordine come deve eesere poi lanciamo la macro precedente che mi cancella tutti i dati uguali.Ciao e grazie anticipatamente Matteo
Post: 62
Registrato il: 03/10/2015
Città: ALBAREDO PER SAN MARCO
Età: 44
Utente Junior
2003
OFFLINE
17/08/2016 20:35

Ho sbagliato ad allegare il file e ho allegato una foto doppia perché ho aperto due pagine di Freeforumzone . Scusatemi tanto il file da 25 kb non c'entra niente.
Post: 600
Registrato il: 06/04/2013
Utente Senior
2010
OFFLINE
19/08/2016 19:31

Ciao a tutti
tanto per esser chiari, le macro allegate al:
- post n. 3 ordina orizzontalmente le righe
- post n. 7 lascia invariato l'ordine orizzontale

saluti
Domenico
Win 10 - Excel 2016
Post: 70
Registrato il: 03/10/2015
Città: ALBAREDO PER SAN MARCO
Età: 44
Utente Junior
2003
OFFLINE
14/09/2016 19:44

Ciao Domenico ho provato le macro Sub CombinUguali()Sub CombinUguali3()e anche la macro Sub Elimina()di Mariuss44 ma tutte e tre non risolvono l'eliminazione di ambi terni quaterne identici.Allego un file di prova di 158 righe senza dentro i codici . Grazie e buona serata Matteo. [SM=x423046]
Post: 696
Registrato il: 06/04/2013
Utente Senior
2010
OFFLINE
15/09/2016 12:05

Ciao
controlli per favore se il risultato nell'allegato colonne H-I-J-K è corretto?

saluti
Domenico
Win 10 - Excel 2016
Post: 71
Registrato il: 03/10/2015
Città: ALBAREDO PER SAN MARCO
Età: 44
Utente Junior
2003
OFFLINE
16/09/2016 18:34

Buonasera Domenico. Ho controllato il risultato nell'allegato colonne H-I-J-K ci sono due tipi di errori .Ti allego la foto,ho sottolineato
gli errori di rosso. Nella riga 20,il terno 44 49 49
deve essere sostituito con 38 44 49.Nella riga 25 il terno 38 63 63
deve essere sostituito con 38 49 63.L'ambo in riga 21 (38 44)doveva
essere cancellato perché già presente in riga 19.L'ambo in riga 24
(38 49) doveva essere cancellato perché già presente in riga 23.
A disposizione e grazie Dodo .Saluti Matteo [SM=x423065]
Post: 701
Registrato il: 06/04/2013
Utente Senior
2010
OFFLINE
16/09/2016 19:37

Ciao
volevo vedere se stavi attento [SM=x423026]

Allora le sub CombinUguali3 (ed anche CombinUguali) funzionano bene.

Il fatto è questo:

nelle immagini che hai allegato all'inizio, le colonne A e B erano vuote. Quindi avresti dovuto comprendere che l'istruzione:

Set a = Range("C1").CurrentRegion.Resize(, 4)

ora che ci sono valori in A e B fa casino. [SM=g27811]

quindi per farlo funzionare, devi inserire una colonna vuota tra B e C (vedi allegato) e quindi i numeri devono stare da D in poi.

variare quella istruzione con:

Set a = Range("D1").CurrentRegion.Resize(, 4).

Ciò premesso, stai attento che le macro sono tarate fino a quaterne. Se ci sono pure le cinquine, sestine ecc ecc le devi cambiare in diversi punti.

Ho messo due pulsanti che eseguono le due macro e scrivono i risultati sul foglio senza cancellare gli originali.
Comunque controlla sempre.

saluti
[Modificato da dodo47 16/09/2016 19:59]
Domenico
Win 10 - Excel 2016
Post: 72
Registrato il: 03/10/2015
Città: ALBAREDO PER SAN MARCO
Età: 44
Utente Junior
2003
OFFLINE
16/09/2016 20:35

Giusto riscontro
Proprio cosi, grande Dodo,le sub CombinUguali3 (ed anche CombinUguali) funzionano benissimo ho controllato. [SM=x423017] Ciao
Gatto di marmo [SM=x423063]
Post: 702
Registrato il: 06/04/2013
Utente Senior
2010
OFFLINE
17/09/2016 11:04

Re: Giusto riscontro
gattodimarmo1980, 16/09/2016 20.35:

Giusto riscontro



Matteo era giusto pure prima, il fatto è sempre lo stesso: tu ti aspetti un codice "chiavi in mano" e questo non va bene in quanto ti fermi al minimo ostacolo.

Sforzati di "capire"....senza polemiche

saluti
Domenico
Win 10 - Excel 2016
Post: 73
Registrato il: 03/10/2015
Città: ALBAREDO PER SAN MARCO
Età: 44
Utente Junior
2003
OFFLINE
18/09/2016 22:15

Ha ragione Dodo al 100 per 100,io mi sto impegnando molto pero credimi ma ho [SM=x423024] molte difficolta nella pratica.Ciao Matteo
Vota: 15MediaObject5,00217 2
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 08:27. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com