Buongiorno a tutti,
Vediamo se qualcuno riesce a darmi una mano e se riesco in qualche modo a farvi capire cosa vorrei ottenere.
Vi allego un file così capite meglio.
File
Nel file (che ha due fogli Sheet 1 e Sheet 2) ho tre colonne A, B, C che hanno dei valori numerici e su cui ho attivato la funzione filtro su ognuna.
Poi ho la colonna E in cui ci sono dei valori numerici che possono essere negativi (-1) e positivi (di diverso valore).
Ho infine una cella in G3 che mi da la somma di tutta la colonna E.
Il risultato finale a cui vorrei arrivare sarebbe conoscere in automatico la somma positiva maggiore possibile che si ha fra tutte le varie combinazioni dei filtri nelle tre colonne A, B e C.
Quello che fino adesso ho fatto manualmente, per arrivare al risultato voluto, è:
Ad esempio parto dalla colonna A, clicco sul filtro e mi esce la mascherina in cui posso deselezionare a piacimento uno dei tanti valori numerici.
Deseleziono il primo valore e clicco okay, vedo se la somma in G3 è aumentata o diminuita.
Se è aumentata lascio il primo valore deselezionato, se è diminuita seleziono nuovamente il primo valore e passo a deselezionare il secondo e così via con gli altri.
Faccio lo stesso con le colonne B e C.
Capite che farlo manualmente c'è da diventare matti, anche perché questo è solo un esempio per farvi capire a quale risultato voglio arrivare.
Ho poi un altro foglio molto più complesso dove ci sono molte altre colonne da confrontare.
Un utente mi ha indicato questo codice VBA
Public Sub FiltraMax()
Dim Rw As Long, C As Long, I As Long, X As Long
Dim Somma As Double
Dim vColl As Collection
Dim sCriteria As String
Application.ScreenUpdating = False
With Sheets("Sheet1")
Rw = .Cells(Rows.Count, 1).End(xlUp).Row
For X = 1 To 3 'ripeti il filtraggio per tre volte
For I = 1 To 3 'ripeti per le 3 colonne A B C
Somma = .Range("G3")
sCriteria = "" 'viene usata per ripristinare il filtro
Set vColl = New Collection
On Error Resume Next
For C = 2 To Rw
If .Rows(C).Hidden = False Then
vColl.Add CStr(.Cells(C, I)), CStr(.Cells(C, I)) 'crea elenco valori univoci
If Err.Number = 0 Then sCriteria = sCriteria & "#" & CStr(.Cells(C, I)) & "#,"
End If
Err.Clear
Next C
On Error GoTo 0
For C = 1 To vColl.Count
.Range("A1").AutoFilter Field:=I, Criteria1:="<>" & vColl(C), _
Operator:=xlFilterValues
If .Range("G3") < Somma Then 'se la somma è diminuita ripristina filtro precedente
.Range("A1").AutoFilter Field:=I, Criteria1:=Split(Left(Replace(sCriteria, "#", ""), _
Len(sCriteria) - 1), ","), Operator:=xlFilterValues
Else 'altrimenti elimina elemento e aggiorna somma
sCriteria = Replace(sCriteria, "#" & vColl(C) & "#,", "")
Somma = .Range("G3")
End If
Next C
Set vColl = Nothing
Next I
Next X
End With
Application.ScreenUpdating = True
End Sub
Ho implementato il codice e se nelle tre colonne ci sono solo numeri interi funziona (Sheet1).
Se invece nelle colonne cominciano ad esserci numeri con virgola oppure percentuali il codice non fa il suo lavoro (Sheet2).
So che filtrando direttamente la colonna E eliminando i -1 si arriverebbe a conoscere subito la massima somma possibile, ma a me serve partire dai filtri in A B C e non il contrario.
Qualcuno saprebbe indicarmi il motivo oppure indicarmi una soluzione diversa per risolverlo?
Grazie in anticipo.