Mah... Si tratta quindi di un configuratore... e secondo me ne esci solo con le macro.
Non so chi sono gli utenti, e quanto il file delle essere "foolproof"; in prima battuta ti proporrei il seguente approccio:
1) ti crei un elenco che include tutte le combinazioni possibili del tuo prodotto, vedi area in giallo
Uploaded with
ImageShack.us(fare tasto dx /Visualizza immagine per vedere l' immagine completa)
2) Usiamo la riga A2:E2 come "criteri" del Filtro avanzato, area arancione
3) tramite filtro avanzato creiamo un sub-elenco che corrisponde ai criteri impostati in A2:E2; area verde
4) tramite filtro avanzato, creiamo una serie di valori unici, area celeste; sono i valori che si usera' per la convalida delle scelta da effettuare
L' elenco in giallo viene creato un principio derivato da quanto proposto ad alexio22 qui:
viewtopic.php?p=577743, e cioe':
-si imposta il foglio in cui verra' creato l' elenco ("Foglio2", nella macro successiva), che dovra' contenere:
a) le intestazione dei campi, uguale sia su riga 1 che su riga 5
b) la formattazione "Testo" per l' area A2:E4
-su un altro foglio ("Foglio1", nella macro successiva), si parte da un elenco con in orizzontale le caratteristiche e in verticale i possibili valori di queste caratteristiche; ad esempio
Uploaded with
ImageShack.usLe colonne devono essere adiacenti, e affiancate da una colonna vuota
In ogni colonna, i dati devono essere scritti senza celle vuote.
Poi si usa questa macro (piccola variante rispetto a quella di alexio22), che accodera' le nuove combinazioni all' elenco eventualmente gia' presente in Foglio2 (quindi il primo elenco sara' creato da riga 6 in giu', per quanto detto in "b" sopra):
- Codice: Seleziona tutto
Dim myList(), Items As Long, ListInd As Long, myCount()
Sub Mux()
'vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=100639
Dim Sorg As String, I As Long, ListRows As Long, SubItem As Long
Sorg = "Foglio1" '<<< Il foglio con l' elenco dei componenti; vedi testo
outlist = "Foglio2" '<<< Il foglio dove sara' generato l' elenco delle combinazioni
ListRows = 1
With Sheets(Sorg)
Items = .Range("A1").CurrentRegion.Columns.Count
ReDim myCount(1 To Items)
For I = 0 To Items - 1
SubItem = (Application.WorksheetFunction.CountA(.Range("A:A").Offset(0, I)) - 1)
myCount(I + 1) = SubItem
If SubItem > 0 Then ListRows = ListRows * SubItem
Next I
End With
'
ReDim myList(1 To ListRows + 1, 1 To Items)
ListInd = 1
Call myX(1, Sheets(Sorg).Range("a1").CurrentRegion)
'Sheets(outlist).Cells.ClearContents
'Sheets(outlist).Range("A5").Resize(1, Items).Value = Sheets(Sorg).Range("A1").Resize(1, Items).Value
Sheets(outlist).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(ListRows, Items).Value = myList()
End Sub
Sub myX(ByVal H As Long, ByRef STab As Range)
'Recursiva per Sub Mux
Dim I As Long, J As Long, K As Long
'
For I = 1 To myCount(H)
myList(ListInd, H) = STab(I + 1, H)
If H < Items Then
Call myX(H + 1, STab)
Else
ListInd = ListInd + 1
For K = 1 To H - 1
myList(ListInd, K) = myList(ListInd - 1, K)
Next K
End If
Next I
End Sub
Uso: Da excel, Alt-F11 per aprire l' editor delle macro; Menu /Inserisci /Modulo; copia il codice e incollalo nel frame di destra; personalizza le istruzioni marcate <<<
Partendo dall' elenco in giallo (figura 1), gli elenchi in verde e blu vengono creati con questo secondo codice:
- Codice: Seleziona tutto
Sub AdvFilt()
'
With Foglio2
.Range("A5:E2000").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range( _
"A1:E2"), CopyToRange:=.Range("I1:M1"), Unique:=False
' Range("A1").Select
DoEvents
.Range("O1:U100").ClearContents
'
.Range("A5:A1000").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:="", CopyToRange:=.Range( _
"O1"), Unique:=True
.Range("J1:J1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range( _
"P1"), Unique:=True
.Range("K1:K1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range( _
"Q1"), Unique:=True
.Range("L1:L1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range( _
"R1"), Unique:=True
.Range("M1:M1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range( _
"S1"), Unique:=True
End With
End Sub
Uso: dall' editor delle macro, Menu /Inserisci /Modulo; copia il codice e incollalo nel frame di destra.
Il codice va eseguito avendo attivo il foglio contenente l' elenco in giallo, nel mio caso "Foglio2"; eventualmente personalizza l' istruzione marcata <<<
Quello che abbiamo fatto finora e' un lavoro preparatorio, a questo punto puoi cominciare a lavorare sul tuo vero foglio di lavoro (chiamiamolo Foglio3)
Userai varie celle per indicare la caratteristica che desiderata; per la prima userai come elenco di convalida la colonna O in blu; per la seconda la colonna P, per la terza la colonna Q, etc
C' e' da notare che l' elenco in colonna O e' estratto come "valori unici" della colonna A, mentre le colonne P, Q, R, ed S sono estratte dall' elenco in verde, quindi dai valori filtrati.
Il mio prototipo ha questo aspetto:
Uploaded with
ImageShack.usRimane un anello da inserire: posizionare nell' intervallo A2:E2 di Foglio2 le scelte che vengono fatte sul tuo foglio man mano che imposti le caratteristiche in Foglio3; per questo dovrai usare una macro di WorksheetChange, che nel mio caso ha questi contenuti:
- Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim CheckA As String, CheckC As Long, I As Long
'
CheckA = "A2:E2" '<<< L' area con le scelte + convalide
CheckC = Range(CheckA).Columns.Count
If Application.Intersect(Range(CheckA), Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
Application.Intersect(Target.Offset(0, 1).Resize(1, CheckC), Range(CheckA)).ClearContents
For I = 1 To CheckC
If Range(CheckA).Cells(1, I).Value <> "" Then
Foglio2.Range("A2").Offset(0, I - 1).Value = "=" & Range(CheckA).Cells(1, I).Value
Else
Foglio2.Range("A2").Offset(0, I - 1).ClearContents
End If
Next I
Call AdvFilt
Application.EnableEvents = True
End Sub
Uso: tasto dx sul tab contenente il nome "Foglio3", scegli Visualizza codice; copia il codice e incollalo nel frame di dx
Vista l' articolazione del prototipo descritto allego anche il file, che contiene due ipotetici elenchi prodotti: uno come da immagini pubblicate (con 4 Livelli, 0-3), l' altro come trovate in Foglio1 (con 3 livelli, 0-2); lo trovate qui:
http://rapidshare.com/share/11E031B28C0 ... D2B027A557Spero che in tutto questo ci sia qualche spunto utile; altrimenti rimane solo come sempio di possibile convalida subordinata su N livelli.
Ciao