Hai aperto 3 discussioni diverse, ma i suggerimenti per il 2 sono condizionati dall' 1, quelli per il 3 dal 2, quelli dell' 1 dal 3; per il tracciato dati bisogna invece andare a tentoni. Tutto questo ha abbassato il mio interesse a contribuire...
Vediamo quindi di risolvere tutti insiemi i quesiti, seno' facciamo il giro dell' oca.
Trattero' quindi contemporaneamente:
- metodo terzine simmetriche (
viewtopic.php?f=26&t=92509)
- isotopia e unione nel lotto (
viewtopic.php?f=26&t=92659)
- trovare 2 di 3 numeri (
viewtopic.php?f=26&t=92672)
partendo dal terzo: "trovare 2 di 3 numeri" (
viewtopic.php?f=26&t=92672).
Mi immagino che il tracciato della tabella dati sia quello pubblicato qui:
viewtopic.php?f=26&t=92509#p528299Altre assunzioni mie in assenza di informazioni:
-vanno cercate le righe dove sono presenti 2 numeri su 3; quindi tralasciando se uno stesso numero e' presente due volte nella riga e ignorando situazioni in cui sono presenti tutti e tre i numeri.
-I numeri da cercare nella tabella dati sono scritti nelle celle A1, B1 e C1 del foglio con i dati.
Puoi identificare le righe contenenti "2 su 3 numeri" usando una macro come questa (N°1):
- Codice: Seleziona tutto
Sub Cerca2()
Dim Due As Boolean
VUno = Range("A1")
VDue = Range("B1")
VTre = Range("C1")
'
Range("C4:BE10000").Interior.ColorIndex = xlNone
For I = 4 To Range("E" & Rows.Count).End(xlUp).Row
Present = (Application.WorksheetFunction.CountIf(Range("C1:BE1").Offset(I - 1, 0), VUno) > 0) + _
(Application.WorksheetFunction.CountIf(Range("C1:BE1").Offset(I - 1, 0), VDue) > 0) + _
(Application.WorksheetFunction.CountIf(Range("C1:BE1").Offset(I - 1, 0), VTre) > 0)
If Abs(Present) = 2 Then Due = True Else Due = False '<<<
'spazio per altre istruzioni
Next I
End Sub
La condizione e' data dal flag Due=True, come gestito nella riga marcata <<<
Successivamente hai precisato che volevi anche evidenziare i numeri presenti, se la situazione "2 su 3" si verifica; quindi modifichiamo un pezzo della macro e aggiungiamo questa prestazione in "spazio per altre istruzioni" (N° 2):
- Codice: Seleziona tutto
' If Abs(Present) = 2 Then Due = True Else Due = False '<<< Eliminata
If Abs(Present) = 2 Then
For J = 3 To 57
If Cells(I, J) = VUno Then Cells(I, J).Interior.ColorIndex = 3 'Rosso
If Cells(I, J) = VDue Then Cells(I, J).Interior.ColorIndex = 4 'Verde
If Cells(I, J) = VTre Then Cells(I, J).Interior.ColorIndex = 5 'Blu
Next J
End If
Se vuoi colorare con in una sola tonalita' metti gli indici uguali sulle tre istruzioni.
Nel topic "isotopia e unione nel lotto" (
viewtopic.php?f=26&t=92659)
hai pero' precisato che vuoi colorare questi famosi "2 su 3" solo se sono Isotopi o Uniti; allora non serve trovare le righe che hanno i "2 su 3" e quindi cercare i presenti; bisogna cercare le coppie (A), escludere che facciano parte di un ménage a trois (B), e determinare se rispondono a queste importantissime definizioni (C).
Optiamo per cercare prima la condizione "2 su 3" usando la macro N.1; solo se Due = True allora partiamo alla ricerca delle coppie con questo codice (N° 3)
- Codice: Seleziona tutto
' If Abs(Present) = 2 Then Due = True Else Due = False '<<< Eliminata
If Abs(Present) = 2 Then
For J = 3 To 56
For K = J + 1 To 57
If (Cells(I, J) = VUno Or Cells(I, J) = VDue Or Cells(I, J) = VTre) And _
(Cells(I, K) = VUno Or Cells(I, K) = VDue Or Cells(I, K) = VTre) And _
(Cells(I, J) <> Cells(I, K)) Then Coppia = True Else Coppia = False
If Coppia Then
'SOLO PER PROVA:
Cells(I, J).Interior.ColorIndex = 3
Cells(I, K).Interior.ColorIndex = 4
'
End If
Next K
Next J
End If
Le istruzioni sotto
If Coppia Then sono solo per provare che questo criterio porta agli stessi risultati che la macro N° 2; esse vanno sostituite da altre che testano se si tratta di isotopi o di uniti.
I criteri per determinare queste due condizion furono descritti qui:
viewtopic.php?f=26&t=92659#p529560Utilizzando quanto lì detto, ad esempio per gli isotopi, lo traduciamo in questo codice (N° 4)
- Codice: Seleziona tutto
If Coppia Then '<< Esistente
Isotopo = (Cells(I, J).Column Mod 5 = Cells(I, K).Column Mod 5)
If Isotopo Then
Cells(I, J).Interior.ColorIndex = 3
Cells(I, K).Interior.ColorIndex = 4
End If
'
End If
Infine, all' interno del topic "metodo terzine simmetriche", hai chiesto di riuscire a identificare il 3° mancante nel caso si verifichi "2 su 3".
Il criterio per questo calcolo era stato dato qui:
viewtopic.php?f=26&t=92509#p529559Traduciamolo nel contesto del codice N° 4, immaginando che il risultato si voglia mettere in col A, e otteniamo questo codice addizionale (N° 5)
- Codice: Seleziona tutto
If Coppia Then '<< Esistente
Manca = Abs(VUno * (Application.WorksheetFunction.CountIf(Range("C1:BE1").Offset(I - 1, 0), VUno) = 0) + _
VDue * (Application.WorksheetFunction.CountIf(Range("C1:BE1").Offset(I - 1, 0), VDue) = 0) + _
VTre * (Application.WorksheetFunction.CountIf(Range("C1:BE1").Offset(I - 1, 0), VTre) = 0))
Cells(I, "A") = Manca
'
Isotopo = (Cells(I, J).Column Mod 5 = Cells(I, K).Column Mod 5) '<< Esistente
Spero che ti sia agevole produrre le variazioni al codice per allinearlo alle tue condizioni e non alle mie assunzioni.
Comunque, come sai, siamo qua.
Ciao