Condividi:        

vba2003:creare routine ricorsiva

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

vba2003:creare routine ricorsiva

Postdi karug64 » 25/03/12 01:19

Salve a tutti.
Il problema che vi sottopongo oggi per me e' tosto (anzi tostissimo) e siccome e' di difficile spiegazione allego il file zippato per chiarire il da farsi.

https://rapidshare.com/files/745093813/Elenco2.xls.zip

Allora. Ogni anno mi viene fornito un file excel contenente un elenco clienti.
Io aggiungo una cartella al foglio rinominadola col nome dell'anno in corso a cui si riferisce il file e vi copio i dati.
Poi eseguo le macro associate al bottone "Esegui" e compongo il foglio4 che e' comprensivo di tutti i record dei vari anni.
Nel foglio4 nelle colonne che vanno dalla F in poi scrivo se il cliente era presente nei vari anni ( e quindi nei vari fogli 2008,2009,2010,2011,ecc)

Potro' quindi avere clienti presenti solo nel 2008 altri presenti nel 2008 e 2009, altri nel 2008 e 2010 e cosi' via .......

Quello che ora dovrei fare e':
creare un foglio Riepilogo dove mi vengano elencati :
- prima tutti i clienti di ogni singolo anno (e questo la macro CREAFOGLIO gia' lo fa)
- tutti i clienti presenti in tutte le combinazioni degli anni:

quindi:
2008 (ok-creafoglio)
2009 (ok-creafoglio)
2010 (ok-creafoglio)
2011 (ok-creafoglio)
2008,2009 (ok-creafoglio)
2008,2010
2008,2011
2009,2010 (ok-creafoglio)
2009,2011
2010,2011 (ok-creafoglio)
2008,2009,2010
2008,2009,2011
2008,2010,2011
2009,2010,2011
2008,2009,2010,2011

Quello che non riesco a fare e' estrapolare le coppie di anni non consecutive, le terne e le quaterne, ma soprattutto non so come gestire l'eventuale routine in considerazione dell'aumento degli anni ....... con esponenziale aumento delle combinazioni. (infatti quando sara' il 2013 -Maya permettendo- dovrei modificare il programma aggiungendo cicli for o cos'altro ?)

Spero di essere stato chiaro.
Grazie.
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Sponsor
 

Re: vba2003:creare routine ricorsiva

Postdi Anthony47 » 25/03/12 23:17

In Foglio4 hai elaborato un elenco di clienti e, nelle colonne F:O, hai previsto di inserire l' indicazione se quel cliente e' stato (sara') attivo negli anni 2008:2017 (1 colonna per anno).
A questo punto in una colonna adiacente inserisci la formula
Codice: Seleziona tutto
=SOMMA(SE(F2:O2="";0;1)*(MATR.TRASPOSTA(2^(RIF.RIGA(INDIRETTO("1:10"))-1))))

Da confermare con Contr-Maiusc-Enter.
Avrai cosi' un indicatore che dice in quali anni il cliente e' stato attivo:1=2008, 2=2009, 4=2010, 8=2011, 16=2012 e cosi' via seguendo una progressione geometrica con ragione 2. Poiche' la formula rappresenta la somma di tutti gli elementi della successione, il valore 7 (ad esempio) indica la presenza negli anni 2008, 2009 e 2010; analogamente 36 indichera' la presenza negli anni 2010 e 2013.
A questo punto se vuoi sapere quali clienti sono stati attivi in una particolare combinazione di anni applichi il filtro automatico a questa colonna e filtri per il valore corrispondente.

Potrebbe interessarti, soprattutto per il futuro visto che le combinazioni teoriche raddoppiano anno dopo anno, crearti un elenco che riporti solo le combinazioni effettivamente presenti; per questo ti fai una serie di valori 1, 2, 3, ... 1023 (tante sono le combinazioni per gli anni 2008-2017), e accanto usi la formula =Conta.se(IlValore;LaColonnaDegliIndiciCalcolatiPrima)
Se vuoi puoi calcolare quante combinazioni esistono con la formula =Conta.Se(L'ElencoAppenaCalcolato;">1")

Spero trovi degli spunti utili.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba2003:creare routine ricorsiva

Postdi wallace&gromit » 26/03/12 12:23

Ciao,
mi sono cimentato nell'allestimento di una funzione che fino all'anno 2022 (e volendo andare oltre basta continuare la lista) permette di riconvertire automaticamente il numero ottenuto con la formula di Anthony in una lista di anni:

Codice: Seleziona tutto
Function scomponi3(MyVal)
ListaVal = Array(16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1)
ListaAnni = Array(2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008)
For Contr = 0 To 14
    Parag = ListaVal(Contr)
        If Parag <= MyVal Then
        MyVal = MyVal - Parag
        scomponi3 = scomponi3 & ListaAnni(Contr) & ","
        End If
    Next Contr
End Function

Gli unici dettagli non proprio puliti sono:
la virgola che appare dopo l'ultima data
e il fatto che l'elenco degli anni è decrescente.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: vba2003:creare routine ricorsiva

Postdi karug64 » 26/03/12 19:15

Per Anthony:

non si finisce mai di imparare !!! Resta il fatto che la logica di queste formule matriciali, per quanto mi impegni, continua ad essermi oscura !! Comunque tutto ok funziona.

Per wallace&gromit:

non mi e' chiaro come dovrei utilizzare la tua routine.

Grazie ad entrambi.
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vba2003:creare routine ricorsiva

Postdi Anthony47 » 26/03/12 23:10

La "funzione" di w&g serve per il "reverse engineering" dell' indice calcolato con la mia formula; si usa in una formula tipo =Scomponi3(LaCellaConL'Indice) e ad esempio restituisce, con un indice pari a 6, una stringa del tipo "2010,2009,"

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba2003:creare routine ricorsiva

Postdi wallace&gromit » 27/03/12 07:52

Per Karug:
il principio matematico proposto da Anthony è semplice e geniale: se attribuisci ad ogni elemento di un elenco un numero crescente (doppio del precedente) la somma di tutti gli elementi precedenti è sempre di 1 inferiore a quello nuovo, in questo modo ad ogni risultato corrisponde sempre una sola combinazione di elementi.

Per utilizzare la mia funzione devi copiarla in un modulo vuoto del VBA, in seguito la utilizzi come una delle normali funzioni già fornite con excel, cioè in una cella scrivi "=scomponi3(" selezioni la cella di riferimento e chiudi la parentesi. In seguito puoi copiare e incollare a piacimento la tua formula.

Per Anthony:
pensi sia possibile rimediare a quei due difetti che menzionavo (virgola alla fine e anni decrescenti)?
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: vba2003:creare routine ricorsiva

Postdi ricky53 » 27/03/12 16:56

Ciao Wallace,
per toglier la "virgola" finale utilizza la funzione left
Codice: Seleziona tutto
CUT
...
scomponi3 = scomponi3 & ListaAnni(Contr) & ","
        End If
    Next Contr
    scomponi3 = Left(scomponi3, Len(scomponi3) - 1)
End Function


Per la questione degli ANNI: non ho provato il tuo codice ma ti fornisco qualche spunto.
Prova con:
1. gli anni ed i valori prova ad inserli nelle array in ordine inverso a quello attuale
2. scorrere il ciclo "For/Next" cominciando dalla fine (Step -1) esempio
Codice: Seleziona tutto
For Contr = 14 To o Step -1
ed invertire il controllo sul <= con >=
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. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: vba2003:creare routine ricorsiva

Postdi wallace&gromit » 27/03/12 20:24

grazie Ricky,
con il suggerimento del left mi hai illuminato anche per l'altro problema:
invertire i calcoli non si può perchè devi iniziare a togliere sempre il numero maggiore prima, però lo si può fare scrivere invertendo i parametri:
Codice: Seleziona tutto
Function scomponi3(MyVal)
ListaVal = Array(16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1)
ListaAnni = Array(2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008)
For Contr = 0 To 14
    Parag = ListaVal(Contr)
        If Parag <= MyVal Then
        MyVal = MyVal - Parag
        scomponi3 ="," & ListaAnni(Contr) & scomponi3
        End If
    Next Contr
scomponi3 = Right(scomponi3, Len(scomponi3) - 1)
End Function

In questo caso ho dovuto togliere la virgola iniziale!
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: vba2003:creare routine ricorsiva

Postdi karug64 » 27/03/12 21:46

Nuovamente grazie ad entrambi.
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22


Torna a Applicazioni Office Windows


Topic correlati a "vba2003:creare routine ricorsiva":


Chi c’è in linea

Visitano il forum: Nessuno e 49 ospiti