Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel] Più liste dinamiche sugli stessi valori

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel] Più liste dinamiche sugli stessi valori

Postdi ginevravr » 25/11/13 23:15

Buonasera.
Ho un problema che non riesco a risolvere.
Il mio excel contiene una serie di valori che dovrebbero permettere di "creare" un prodotto selezionando una serie di sottolivelli tutti vincolati al macroprodotto principale. Alla fine ogni sottolivello ha un prezzo. Il prezzo del prodotto finito è la somma di tutti i valori dei sottolivelli selezionati data una quantità indicata.
I livelli tra cui scegliere sono:
- macroprodotto
- livello 1 (diversi valori a seconda del macroprodotto)
- livello 2 (diversi valori a seconda del macroprodotto; può non essere definito un livello 2 per il macroprodotto selezionato)
- livello 3 (diversi valori a seconda del macroprodotto; può non essere definito un livello 2 per il macroprodotto selezionato)
- livello 4 (diversi valori a seconda del macroprodotto; può non essere definito un livello 2 per il macroprodotto selezionato)
- quantità (unica)

Pensavo di creare n liste dinamiche, per macroprodotto/livelloN, uno sheet separato per ogni livello.
Sullo sheet 1 ho creato quindi una lista di macroprodotti (a cui ho dato un nome al range di valori), ad ogni macroprodotto ho definito la propria lista di livello1 (dando il nome ad ogni livello1 del macroprodotto).
Usando convalida dati sono riuscita a far comparire la lista di livelli1 in base al valore selezionato di macroprodotto. Fin qui tutto ok.
Il problema si presenta quando cerco di fare la stessa operazione sul livello2.
Ho creato un nuovo sheet con macroprodotti (gli stessi dello sheet precedente) associando un nuovo nome. Ad ogni macroprodotto ho definito la propria lista di livello2, anche qui definendo nuovi nomi.
Nella nuova lista dinamica del livello2 mi compaiono sempre i valori di livello1. In pratica ho provato a definire una seconda combo di macroprodotti (non sapendo come altro fare, da nascondere poi all'utente) che punta al nome dei macroprodotti del livello2. Alla cella ho dato un nuovo nome. Alla combo del livello2 ho detto di convalidare i dati =indirect(macroprodotto_livello2) .

Ho fatto qualcosa di sbagliato (immagino che non sia facile capire da quello che ho scritto) oppure se viene definito un nome con gli stessi valori excel tiene "buono" solo il primo, indipendentemente dallo sheet in cui si trova?
E' possibile fare in qualche altro modo quanto ho descritto? n liste a discesa diverse che si popolano tutte basate su un unico valore pre-scelto?

Grazie mille in anticipo della disponibilità e dell'aiuto.
ginevravr
Newbie
 
Post: 3
Iscritto il: 25/11/13 22:49

Sponsor
 

Re: [Excel] Più liste dinamiche sugli stessi valori

Postdi Anthony47 » 25/11/13 23:28

Ciao ginevravr, benvenuta nel forum.
Hai voluto confonderci ben bene, e con me ci sei riuscita :D :D
Semplificando, il tuo problema e' di fare una convalida su piu' livelli? Se Si, puoi pubblicare un esempio di articolazione Livello1 /Livello2 /Livello3?

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Più liste dinamiche sugli stessi valori

Postdi ricky53 » 26/11/13 16:59

Ciao Ginevra,
benvenuta anche da parte mia.

Spiegazione un po' ... facezie a parte però penso di poterti aiutare.

Tempo fa per mio figlio avevo predisposto un file che ...
selezionando la nazione, si ottengono le regioni, poi le province ed infine i comuni ed alcuni dati del comune selezionato ...
Te lo allego: FILE di ESEMPIO

E' un esempio (anche non completato) dal quale partire per ottenere quello che ti occorre ...

Provalo e siamo QUI.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [Excel] Più liste dinamiche sugli stessi valori

Postdi ginevravr » 26/11/13 18:13

Grazie Antony e Ricky sia per il benvenuto che per la risposta veloce :)

Provo ad allegare un documento di esempio di quello che vorrei fare.

http://rapidshare.com/share/83D74BE1D8B ... D47FA960E5

Spero di aver allegato in modo corretto. :roll:
Lo scopo finale è che l'utente, per ottenere il prezzo finale unitario di quello che vuole ordinare, deve "comporre" tutte le parti (livelli) del prodotto finale (ho riportato un po' di note nel documento, un esempio di quello che si dovrebbe fare, e quello che non riesco a fare :oops: )

Ricky per riportarmi al tuo esempio, è come se la seconda lista non fosse governata dalle provincie ma sempre dalle regioni.
Come dire Regione Lazio - Provincia Roma - Zona Centro Italia

Purtroppo definendo il nome diverso ai miei macroprodotti (armadio/cassettiera) presenti nello sheet livello 1 e livello 2 e livello 3, in convalida dati pur puntando al nome giusto dello sheet relativo mi punta sempre e comunque ai dati del livello 1 :(

Avete un'idea di che cosa sbaglio?
Vorrei non dovere usare le macro :(
Se vi servono ulteriori dettagli o chiarimenti, fatemi sapere.
Grazie mille ancora.

Jessica
ginevravr
Newbie
 
Post: 3
Iscritto il: 25/11/13 22:49

Re: [Excel] Più liste dinamiche sugli stessi valori

Postdi Anthony47 » 27/11/13 04:05

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
Immagine

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
Immagine

Uploaded with ImageShack.us
Le 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:
Immagine

Uploaded with ImageShack.us

Rimane 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 ... D2B027A557

Spero che in tutto questo ci sia qualche spunto utile; altrimenti rimane solo come sempio di possibile convalida subordinata su N livelli.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Più liste dinamiche sugli stessi valori

Postdi ginevravr » 28/11/13 09:05

Ciao Antony,
grazie della soluzione.
Purtroppo non so che versione di Excel utilizzeranno gli utenti o se prenderanno paura dall'avviso di presenza di macro.
Comunque, a questo punto, penso anche io che non si riesca a fare senza macro :(
Mi scarico la tua soluzione e l'adeguo ai miei dati.
Grazie mille, sei stato gentilissimo.

Ciao
Jessica
ginevravr
Newbie
 
Post: 3
Iscritto il: 25/11/13 22:49


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Più liste dinamiche sugli stessi valori":


Chi c’è in linea

Visitano il forum: saxas e 12 ospiti