Mi dispiace, ma la tua terminologia e' diversa dalla mia e faccio fatica, anche guardando il file, a capire quel che dici.
La migliore traduzione che ho fatto delle varie tue affermazioni:
1. Dato un oggetto indicato nella Home ("Cosa vuoi Filtrare") applica solo a qull'oggetto dei coefficienti definiti sempre nella Home ("Quanti ne vuoi")
La macro deve filtrare i dati presenti nel database filtrando nella colonna "B" (COSA) tutti i campi che contengono il filtro definito in Home ("Cosa vuoi Filtrare") ed a questi applicare nelle colonne D, E, F o G il coefficente ("Quanti ne vuoi")
Nel foglio Home indico dei valori da filtrare (vedi voce "Cosa vuoi Filtrare"); ho bisogno di usare questi valori per filtrare la colonna B del foglio DATABASE, e alle righe cosi' filtrate devo inserire (in UNA DELLE COLONNE D-E-F-G) il valore impostato in foglio Home nella cella "Quanti ne vuoi", e vorrei poter impostare piu' valori "Quanti ne vuoi" per ognuna delle 4 colonne (D-E-F-G).
Sempre nella pagina DATABASE i coefficienti cosi incollati (potrebbero essere piu di uno per riga) vengono sommati tra se e moltiplicati per il valore indicato nella colonna C ("Quanti")
Vedo che l'hai fatto con la formula
=SOMMA(D3:G3)*C3 Qual' è il mio problema.
entrambe le pagine sono soggette a modifiche ed integrazioni, e quindi vorrei generalizzare le macro in modo da:
1) assegnare dei nomi alle celle della Home in modo che se sono costretto ad aggiungere una riga o colonna non devorivedere le macro
2) filtrare la pagina “Database” indicando un Range dinamico senza doverlo aggiustare a mano.
3) Nominare analogamente la colonne dove applicare i coefficenti (col D-E-F-G della pagina database) in modo da poter aggiungere nel futuro una colonna (ad esempio tra le colonne B e C) senza dover modificare la macro
Le cose del punto 1 mi pare che le hai fatte
Le cose del punto 2 non sono complesse; basta infatti indirizzare le colonne e automaticamente sarebbero prese in considerazione solo le righe valide.
Il punto 3 e' chiaro.
Per questo avevo provato a creare una Sub dove definire le Variabili Globali e richiamare le macro.
Però ho dei (grossi) problemi nel richiamare le sub imponendo le variabili globali, e non capisco perchè
Beh, diciamo che devi fare un po' di pratica.
Ad esempio, se la sub parametrizzata ha questa intestazione
- Codice: Seleziona tutto
Sub FILTRA(CellaFiltro As String, CellaValore As String, Knum As Integer)
allora poi non devi usare (per cominciare) Filtro = Worksheets("Home").Range("CellaFiltro").Value perche' in questo caso vai a usare la stringa CellaFiltro, che e' diverso che usare la variabile CellaFiltro.
Comunque se le mie "migliori traduzioni" del tuo messaggio rappresentano le tue richieste, allora la mia proposta e' la seguente:
Sul foglio HOME crea un'are in cui inserisci, su N celle verticalmente contigue, rispettivamente:
1) il contenuto di colonna B (su foglio DataBase) che vuoi filtrare; a questa cella assegna il nome "FiltroA"
2) i valori da attribuire alle colonne, con accanto l'intestazione della colonna cui quel valore si riferisce
Puoi inserire fino a 100 righe, purche' siano contigue, abbiano nella colonna adiacente una intestazione della colonna, e abbiano in fondo una riga vuota nella colonna "intestazione di colonna". Il valore "intestazione di colonna" deve essere uguale a quanto usato in Riga2 del foglio DataBase. Valori che non corrispondono vengono evidenziati in rosso.
Il contenuto delle celle "2)" puo' essere
a) un Numero; sara' inserito nella colonna "intestazione di colonna"
b) cella vuota; il contenuto della colonna non sara' alterato
c) il numero 0; il contenuto della colonna potra' essere sostituito da 0 (come caso "a") o semplicemente cancellato e colonna lasciata vuote (vedi riga marcata +++ nel codice)
Insomma, non vedo il bisogno di usare 4 opzioni per filtrare un prodotto e compilare una alla volta le quattro colonna D-E-F-G
Questa struttura dati su foglio Home viene poi "attuata" tramite questa macro:
- Codice: Seleziona tutto
Sub DBManage()
Dim dbSh As Worksheet, dbT0 As String, dbTb As Range
Dim cuFilt As String, coFilt As Long, kCol
Dim I As Long, J As Long
'
Set dbSh = Sheets("DATABASE") '<<< Il foglio con la tabella
dbT0 = "A2" '<<< L'inizio della tabella su foglio dbSh
coFilt = 2 '<<< La colonna della tabella da filtrare
'
'Imposta Tabella corrente:
Set dbTb = dbSh.Range(dbT0).Resize(dbSh.Range(dbT0).End(xlDown).Row, _
dbSh.Range(dbT0).End(xlToRight).Column - dbSh.Range(dbT0).Column + 1)
'Filtro corrente:
cuFilt = Range("FiltroA").Value
'Fitra tabella; SERVE??
'dbTb.AutoFilter Field:=coFilt, Criteria1:="=*" & cuFilt & "*", Operator:=xlFilterValues ' filtra tabella
'Scan Righe della tabella:
For I = 1 To dbTb.Rows.Count
If InStr(1, dbTb.Cells(I, coFilt), cuFilt, vbTextCompare) > 0 Then
'Scan righe "Quanti ne vuoi":
For J = 1 To 100
If Range("FiltroA").Offset(J, 1) <> "" Then
kCol = Application.Match(Range("FiltroA").Offset(J, 1).Value, WorksheetFunction.Index(dbTb, 1, 0), 0)
If IsError(kCol) Then
Range("FiltroA").Offset(J, 1).Interior.Color = RGB(255, 100, 100)
Else
Range("FiltroA").Offset(J, 1).Interior.ColorIndex = xlNone
If Range("FiltroA").Offset(J, 0).Value <> "" Then
dbTb.Cells(I, kCol).Value = Range("FiltroA").Offset(J, 0).Value
If dbTb.Cells(I, kCol).Value = 0 Then dbTb.Cells(I, kCol).ClearContents '+++ Rimuovi per inserire 0 e non Vuoto
End If
End If
Else
Exit For 'Termine lista "Quanti ne vuoi"
End If
Next J
End If
Next I
End Sub
Nota che la macro non filtra la tabella, perche' lavorare con la tabella filtrata non e' piu' semplice che lavorare con la tabella completa...
Il tutto e' dimostrato nel file scaricabile qui:
https://www.dropbox.com/s/gesnu881fkucf ... .xlsm?dl=0L'area da compilare e' sul foglio Home, le celle colorate in Verde; la macro da lanciare e' la Sub DBManage, in Modulo1.
Ciao