| | 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 |
|
| | 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
@Marius: è una vita che non trovavo l'uso di GoSub!!
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 | |
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
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. |
| | 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
|
| | Post: 701 | Registrato il: 06/04/2013
| Utente Senior | 2010 | | OFFLINE |
|
16/09/2016 19:37 | |
Ciao
volevo vedere se stavi attento
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.
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 | |
Proprio cosi, grande Dodo,le sub CombinUguali3 (ed anche CombinUguali) funzionano benissimo ho controllato. Ciao
Gatto di marmo |
| | Post: 702 | Registrato il: 06/04/2013
| Utente Senior | 2010 | | OFFLINE |
|
17/09/2016 11:04 | |
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 molte difficolta nella pratica.Ciao Matteo |
|
|