Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto Macro per Excel

Ciao,
sono uno studente in economia, e mi trovo in difficoltà con una macro in
excel: ho costruito un foglio di excel che fa quello che mi serve, ma ora
dovrei fare in modo che sia una macro a fare tutti i calcoli...potreste
aiutarmi? Proverò a spiegare qui cosa mi serve, ma se ne avete voglia posso
mandarvi il foglio in mail visto che la spiegazione è abbastanza caotica....
dunque:
supponendo che oggi sia il 20/4/01: ho  una matrice del genere:
Tasso             Valuta  Bid
Overnight    23/04/01  4.7
Spot Next    24/04/01  4.6
Spot Week  27/04/01 4,72
2 Weeks      04/05/01 4,78
1 M             20/05/01 4,72
2 M             20/06/01 4,73
3 M             20/07/01 4,72
4 M             20/08/01 4,7
5 M             20/09/01 4,56
6 M             20/10/01 4,56
9 M             20/01/02 4,5
1 Y              20/04/02 4,44
la prima colonna è il nome del tasso, la seconda la data nella quale scade,
la terza è il valore del tasso.
Io ho bisogno di una macro che mi dica quale tasso devo utilizzare per una
qualsiasi data fino al 20/4/2: es il 15/8/01: supponendo di utilizzare
un'interpolazione lineare, so che dovrà essere un tasso tra 4,72 (quello del
20/7) e 4,7 (quello del 20/8), probabilmente più vicino a quest'ultimo..
...lasciando perdere l'interpolazione lineare che non è un problema, come
faccio a far capire alla macro quali sono i due tassi che deve utilizzare
per interpolare?? in pratica devo fargli trovare il tasso subito precedente
e quello subito successivo alla data che mi interessa....
In excel me la sono cavata con un accrocchio facendo le differenze tra le
date e la funzione cerca verticale... ma sono non mi sembra ottimale come
soluzione.....
Potreste postarmi un listato di una macro che faccia questo? Mi basta che mi
restituisca i due tassi, poi ad interpolarli ci penso io....
Grazie mille!!
Zippo

 Grazie mille!!
scusa, vediamo se ho capito...
in prartica a te serve una funzione che "scorre" tutti i valori nella
colonna "valuta" e vede se ce n'è uno immediatamente piu piccolo di un
valore di riferimento che gli hai dato tu?
se è giusto, allora potresti fare così...
RigaPartenza=2 ' parte da B2, supponendo che la colonna "valuta" sia la B e
che i valori di data inizino dalla riga 2.
Do
doevents ' per sicurezza
' si suppone inoltre che nella colonna B i valori siano di tipo Date.
' DataRif è una variabile Date che contiene la data da cercare (15/8)
if DataRif < activesheet.cells(RigaPartenza,2).value then
    DataFrom=activesheets.cells(RigaPartenza-1,2).value
    IndexFrom=RigaPartenza-1
    DataTo=activesheet(RigaPartenza,2).value
    IndexTo=RigaPartenza
    exit sub
end if
RigaPartenza=RigaPartenza+1
Loop
in pratica DataFrom contiene il valore di data con cui inizia l'intervallo
trovato, e DataTo il secondo valore.
poi IndexFrom ti dice a che punto della colonna si trova il primo, e IndexTo
a che punto si trova il secondo...
era questo che cercavi?
ps: una curiosità: che cavolo è l'interpolazione lineare?????????????
MarioH

> Zippo:

A1: Tasso
B1: Valuta
C1: Bid
A2: Overnight
B2: 23/04/01
C2:  4,7
A3: Spot Next
<...>
E1: Data
F1: BidPrec
G1: BidSucc
E2: 15/08/01
F2: =CERCA.VERT(E2;$B$2:$C$13;2)
G2: =INDICE($C$2:$C$13;CONFRONTA(E2;$B$2:$B$13)+1)
Direi non serva una macro. C'e` qualcos'altro che mi sfugge?
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 ps: una curiosità: che cavolo è l'interpolazione lineare?????????????
immagina di avere un piano cartesiano dove le coordinate siano i tassi e le
valute...
per trovare il tasso in una qualsiasi data compresa tra le due note non si
fa altro che
tirare una retta tra i due punti precedenti....


il fumo che mi esce dalle orecchie... quello ti sfugge...
::))))))))))))))))))
grrrrrrrrrrrrrrr...........
vabbe dai, ma con la macro VBA č piu chiaro, e piu carino, e piu flessibile,
nel senso che uno ci puo aggiungere altra roba utile sempre per gestire
meglio la tabella...
MarioH

> Direi non serva una macro. C'e` qualcos'altro che mi sfugge?
Scusa, forse non mi sono spiegato bene.
Su excel lo ho fatto anche io...... in un modo più complicato di questo, ma
ci ero arrivato.
Il fatto è che ho bisogno di farlo tramite macro, perchè questa poi dovrà
andare a servirne una più grande.....
Insomma sarebbe un casino avere a che fare con elaborazioni intermedie
tramite il foglio di escel....
Grazie,
Zippo
Ps: sei sicuro che il cerca verticale restituisca sempre la data
precedente???
anche se:
valuta 1 20/7
valuta 2 20/8
data da trovare 19/8
il cerca verticale con exact false mi trova 20/7 o 20/8??
Grazie cmq...
Zippo

 il cerca verticale con exact false mi trova 20/7 o 20/8??
Prova. Poi consulta la guida. Ma sarebbe meglio consultarla prima. ;-)
Non ricordo se l'ultimo argomento di CERCA.VERT, che in italiano si chiama
ambiguamente "intervallo", in inglese si chiami "exact". Mettiamo sia cosi`.
Comunque, "intervallo" = VERO od omesso trova una corrispondenza
nell'intervallo, = FALSO trova una corrispondenza esatta e se non la trova
restituisce il valore di errore #N/D. Ecco perche' nel mio esempio ho omesso
tale argomento.
Un modo abbastanza semplice di tradurre in macro le formule che ti ho
proposto sarebbe usare tali formule nella macro tramite:
    Property WorksheetFunction As WorksheetFunction
        sola lettura
        Membro di Excel.Application


> MarioH:

Opinioni. ;-)
I fatti sono: Perche' si usa Excel? Chi deve manutenere/interagire con
l'applicazione? Come deve apparire l'applicazione all'utente? Chiusa o
aperta? Ecc.


 il tuo algortimo mi sembra che trovi solo le date.....
beh appunto, ma una volta trovate le date non ci vuole niente a "spostarsi"
nella corrispondente colonna C, o no?
MarioH

 aperta? Ecc.
chi siamo? da dove veniamo? dove andiamo? perche andiamo? ::))))))))

         Membro di Excel.Application
Ehm, potresti postarmi il listato?
Sono totalmente digiuno di programmazione in VB che vada oltre il if then o
il loop....
Grazie!
zippo
ps.

> se č giusto, allora potresti fare cosě...
scusa, potresti postarmi il codice completo? non sono riuscito a farlo
andare....
grazie,
Zippo

 Sono totalmente digiuno di programmazione in VB che vada oltre il if then
o il loop....
Scusa ma non ho capito di quale listato parli.


allora, riproviamo...
public function TrovaIntervallo(DataRif as date,DataFrom as date,dataTo as
date,IndexFrom as integer,IndexTo as integer) as boolean
RigaPartenza=2 ' parte da B2, supponendo che la colonna "valuta" sia la B e
che i valori di data inizino dalla riga 2.
Do
doevents ' per sicurezza
' si suppone inoltre che nella colonna B i valori siano di tipo Date.
' DataRif č una variabile Date che contiene la data da cercare (15/8)
if DataRif < activesheet.cells(RigaPartenza,2).value then
    DataFrom=activesheets.cells(RigaPartenza-1,2).value
    IndexFrom=RigaPartenza-1
    DataTo=activesheet(RigaPartenza,2).value
    IndexTo=RigaPartenza
    TrovaIntervallo=True  ' L'ha trovato. restituisce True ed esce.
    exit function
end if
RigaPartenza=RigaPartenza+1
Loop
TrovaIntervallo=False      ' Non l'ha trovato. Restituisce False.
end function
questa funzione la metti in un modulo VBA.
poi la devi richiamare dal modulo VBA quando ti serve.
per chiamarla devi fare piu o meno cosě:
' Dichiarazioni ------------------------------------------
dim DataRif as Date, DataFrom as date,dataTo as date,IndexFrom as
integer,IndexTo as integer
dim xx as boolean
' Sub ---------------------------------------------------
sub Prova
DataRif=dateserial(2000,8,15)
' assegni a DataRif la dta 15/8/2000
xx=TrovaIntervallo(DataRif ,DataFrom ,dataTo ,IndexFrom ,IndexTo)
if xx then
    ' l'ha trovato, quindi negli argomenti dal 2° al 5° c'č quello che ti
serve.
else
    ' non l'ha trovato.
end if
end sub
A me funziona, cosě. Ho fatto una prova proprio con la tabella che hai
postato tu la 1a volta.
Altro č se vuoi utilizzare la funzione DIRETTAMENTE sul foglio Excel, cioe
se vuoi scrivere in una cella excel "=trovaintervallo(...)"
in questo caso non funziona, č ovvio, am perche la funzione č fatta in modo
da essere usata all'interno di una sub VBA, non so se sono stato chiaro.
MarioH

ti ho mandato un messaggio in mail
CIao
zippo


me ne sono accorto!!!!!!!!!!!
ti ho pure risposto... ::))))))
MarioH