Dunque.... in una cella scrivo ad es. il numero decimale 0,2 e poi applico
il formato "ora" per vedere a quale orario corrisponde quel numero,
ottenendo 4.48 AM.
Quindi il numero decimale 0,2 corrisponde all'ora 4.48 AM.
Cerco di capire come excel arriva a quel risultato:
0,2 * 24 = 4,80 (Moltiplico per 24 essendo le ore rappresentate come una
frazione del giorno)
Il numero decimale ottenuto (4,80) rappresenta le ore in centesimi, volendo
esprimerle in sessantesimi avro':
4h + (80 *60 /100) m = 4h + 48m
I miei calcoli si possono semplificare???
Pensate che ho ancora le idee confuse sull'argomento ... :-)) ??
--
Ciao e grazie a tutti
Pippo
Ciao Pippo,
le date e gli orari sono gestiti nel seguente modo:
1) la parte intera rappresenta il numero di giorni trascorsi dal 31
dicembre 1899.
Numeri positivi rappresentano date successive, e numeri negativi date
precedenti.
2) gli orari sono rappresentati nella parte decimale in frazione di giorni
espressa in secondi.
Quindi 1 secondo = 1(giorno) / 24(ore) / 60 (minuti) / 60 (secondi)
es. 0,5 = 12:00
dunque la formula giusta per la trasformazione in numero č:
=(ore / 24)+(min / (60*24))+(sec / (60*60*24))
(.. in tutto questo non credo di avere visto nessun riferimento a
trasformazioni di ore in centesimi ..)
la mia matematica si ferma qui, ma non č difficile eseguire la conversione
inversa per ricomporre l'orario originale (io lo faccio fare ad EXCEL!).
--
... spero di esserti stato d'aiuto,
--
--
/)/) IVAN (\/)
( '.') NMCBRMC ( '.' )
o(_('')('') (")(")_)*
Non Microsoft Certified But Regular
Microsoft Consumer
forse le funzioni INT e RESTO ti possono aiutare
INT taglia la parte decimale
quindi
=INT(0,2) indica il numero di giorni compresi in 0,2 [0]
=INT(0,2/(1/24)) indica il numero di ore comprese in 0,2 [4]
=INT(0,2/(1/24/60)) indica il numero di minuti in 0,2 [288]
=INT(0,2/(1/24/60/60)) indica il numero di secondi in 0,2 [17280]
chiamando rispettivamente G, O, M e S i quattro valori avrò che 0,2
rappresenta G giorni, O-(G*24) ore, M-(O*60) minuti, S-(M*60) secondi
0 giorni, 4-(0*24) ore, 288-(4*60) minuti, 17280-(288*60) secondi
0 giorni, 4 ore, 48 minuti, 0 secondi
[1/24, 1/24/60, 1/24/60/60 sono rispettivamente il
numero di ore, di minuti e di secondi in un giorno:
possiamo indicarli anche con 1/24, 1/1440,1/86400]
se voglio tutto in una formula scriverò quindi
=INT(A1) & " giorni, "
& INT(A1/(1/24))-INT(0,2)*24 & " ore, "
& INT(A1/(1/1440))-INT(0,2/(1/24))*60 & " minuti, "
& INT(A1/(1/86400))-INT(0,2/(1/1440)) *60 & " secondi"
RESTO restituisce la parte decimale
quindi
=RESTO(0,2;1) è la quota su cui si calcolano le ore
=RESTO(0,2;1/24) è la quota su cui si calcolano i minuti
=RESTO(0,2;1/1440) è la quota su cui si calcolano i secondi
quindi
=INT(0,2) sono i giorni
=INT(RESTO(0,2;1)/(1/24)) sono le ore
=INT(RESTO(0,2;1/24)/(1/1440)) sono i minuti
=INT(RESTO(0,2;1/1440)/(1/86400)) sono i secondi
se voglio tutto in una formula scriverò quindi
=INT(A1) &" giorni, "
& INT(RESTO(A1;1)/(1/24)) &" ore, "
& INT(RESTO(A1;1/24)/(1/1440)) &" minuti ,"
& INT(RESTO(A1;1/1440)/(1/86400)) &" secondi"
spero di non averti confuso ulteriormente
.f
> > Sulla base dei molti post e link letti in questo NG, vorrei un vostro
> > conforto per sapere se ho le idee un po' piu' chiare su questo
> > argomento a me molto ostico.
> > Dunque.... in una cella scrivo ad es. il numero decimale 0,2 e poi
> > applico il formato "ora" per vedere a quale orario corrisponde quel
> > numero, ottenendo 4.48 AM.
> > Quindi il numero decimale 0,2 corrisponde all'ora 4.48 AM.
> > Cerco di capire come excel arriva a quel risultato:
> forse le funzioni INT e RESTO ti possono aiutare
> INT taglia la parte decimale
> quindi
> =INT(0,2) indica il numero di giorni compresi in 0,2 [0]
> =INT(0,2/(1/24)) indica il numero di ore comprese in 0,2 [4]
> =INT(0,2/(1/24/60)) indica il numero di minuti in 0,2 [288]
> =INT(0,2/(1/24/60/60)) indica il numero di secondi in 0,2 [17280]
> chiamando rispettivamente G, O, M e S i quattro valori avrò che 0,2
> rappresenta G giorni, O-(G*24) ore, M-(O*60) minuti, S-(M*60) secondi
> 0 giorni, 4-(0*24) ore, 288-(4*60) minuti, 17280-(288*60) secondi
> 0 giorni, 4 ore, 48 minuti, 0 secondi
> [1/24, 1/24/60, 1/24/60/60 sono rispettivamente il
> numero di ore, di minuti e di secondi in un giorno:
> possiamo indicarli anche con 1/24, 1/1440,1/86400]
Dici che 1/24 e' il numero di ore in un giorno ????
Un "giorno" non equivale a 24h?
1g = 24h
Quindi:
1h=(1/24)g
Mi sfugge qualcosa???
> se voglio tutto in una formula scriverò quindi
> =INT(A1) & " giorni, "
> & INT(A1/(1/24))-INT(0,2)*24 & " ore, "
> & INT(A1/(1/1440))-INT(0,2/(1/24))*60 & " minuti, "
> & INT(A1/(1/86400))-INT(0,2/(1/1440)) *60 & " secondi"
> RESTO restituisce la parte decimale
> quindi
> =RESTO(0,2;1) è la quota su cui si calcolano le ore
> =RESTO(0,2;1/24) è la quota su cui si calcolano i minuti
> =RESTO(0,2;1/1440) è la quota su cui si calcolano i secondi
> quindi
> =INT(0,2) sono i giorni
> =INT(RESTO(0,2;1)/(1/24)) sono le ore
> =INT(RESTO(0,2;1/24)/(1/1440)) sono i minuti
> =INT(RESTO(0,2;1/1440)/(1/86400)) sono i secondi
> se voglio tutto in una formula scriverò quindi
> =INT(A1) &" giorni, "
> & INT(RESTO(A1;1)/(1/24)) &" ore, "
> & INT(RESTO(A1;1/24)/(1/1440)) &" minuti ,"
> & INT(RESTO(A1;1/1440)/(1/86400)) &" secondi"
> spero di non averti confuso ulteriormente
In effetti, non ho capito niente .. :-((... , credo di avere alcune carenze
di base in matematica....
cmq, grazie per la solita e *immensa disponibilita'*.
Ciao
Pippo
no. male io:
1, 1/24,1/1440,1/86400 sono
rispettivamente la durata di un giorno,
di un'ora, di un minuto, di un secondo in excel.
quindi int(0,2/(1/1440)), ad esempio, sarą il numero totale
di minuti presenti in 0,2 [giorni].
prova anche questa, che lascia intendere
la ricorsivitą del calcolo
(usa il debug, se hai familiaritą)
con Alt+F11 entri nell'editor vba
da menu: inserisci :: modulo
in modulo1 incolla
Option Base 1
Public Function sequences(x As Double, n As Variant, l() As Variant) As
String
Dim y As Long, i As Long, z As String
For i = 1 To UBound(n)
y = Int(x / (1 / n(i)))
x = x - y * (1 / n(i))
z = z & y & " " & l(i) & ", "
Next
sequences = Left(z, Len(z) - 2)
End Function
con Alt+F11 ritorni in excel
nella cella A1 inserisci
=CASUALE()*3
in B1
=sequences(A1;{1;24;1440;86400};{"giorni";"ore";"minuti";"secondi"})
Ctrl+Maiusc+Invio
in B2
=sequences(A1;{24;1440;86400};{"ore";"minuti";"secondi"})
Ctrl+Maiusc+Invio
in B3
=sequences(A1;{1440;86400};{"minuti";"secondi"}) Ctrl+Maiusc+Invio
in B4
=sequences(A1;{86400};{"secondi"}) Ctrl+Maiusc+Invio
in B5
=sequences(A1;{1440};{"minuti"}) Ctrl+Maiusc+Invio
ecc. ecc.
[puoi utilizzare la function per tradurre gradi centesimali
in gradi sessagesimali, ad esempio
=sequences(A1;{1;60};{"primi";"secondi"})
e operare altre trasformazioni dello stesso tipo]
.f
[...]
> Quindi il numero decimale 0,2 corrisponde all'ora 4.48 AM.
> Cerco di capire come excel arriva a quel risultato:
> 0,2 * 24 = 4,80 (Moltiplico per 24 essendo le ore rappresentate come una
> frazione del giorno)
> Il numero decimale ottenuto (4,80) rappresenta le ore in centesimi,
> volendo
> esprimerle in sessantesimi avro':
> 4h + (80 *60 /100) m = 4h + 48m
Come Excel giunga a quel risultato io proprio non lo so,
ma come la mente umana ad esso pervenga per via logica
l'hai chiaramente esposto.
Complimenti.
Ciao
Bruno
personalmente penso che le difficoltà derivino dal
fatto che alteri la scala:
dici
0,2 * 24 = 4,80 (Moltiplico per 24 essendo le ore rappresentate come una
frazione del giorno)
Il numero decimale ottenuto (4,80) rappresenta le ore in centesimi,
fin qui è corretto 24 rappresenta il numero di ore in un giorno.
qui meno:
volendo esprimerle in sessantesimi avro':
4h + (80 *60 /100) m = 4h + 48m
meglio dire:
questo valore (4,80) è espresso in ore
prendo la parte intera 4
che costituiscono le ore come noi li rappresentiamo
considero la parte decimale 0,80 (non 80!)
e riprendo il ciclo con una misura d'ordine inferiore:
quindi:
0,80*60=48,00 (Moltiplico per 60 ossia il numero di minuti in un'ora)
questo valore (48,00) è espresso in minuti
prendo la parte intera 48
che costituiscono i minuti come noi li rappresentiamo
considero la parte decimale 0,00
e riprendo il ciclo con una misura d'ordine inferiore
0,00*60=0,00 (Moltiplico per 60 ossia il numero di secondi in un minuto)
questo valore (0,00) è espresso in secondi
prendo la parte intera 0
che costituiscono i minuti come noi li rappresentiamo
considero la parte decimale 0,00
e riprendo...
.f
> 0,00*60=0,00 (Moltiplico per 60 ossia il numero di secondi in un
> minuto) questo valore (0,00) è espresso in secondi
> prendo la parte intera 0
> che costituiscono *i minuti* come noi li rappresentiamo
naturalmente, *i secondi*.
nei cicli è il copia/incolla che ha le idee confuse :-)
> [Pippo] scrive in
> http://www.google.it/groups?threadm=uvF3c8s3...@TK2MSFTNGP12.phx.gbl
> > In effetti, non ho capito niente .. :-((... , credo di avere alcune
> > carenze di base in matematica....
> > cmq, grazie per la solita e *immensa disponibilita'*.
> personalmente penso che le difficoltà derivino dal
> fatto che alteri la scala:
>
> dici
> 0,2 * 24 = 4,80 (Moltiplico per 24 essendo le ore rappresentate come una
> frazione del giorno)
>
> Il numero decimale ottenuto (4,80) rappresenta le ore in centesimi,
>
> fin qui è corretto 24 rappresenta il numero di ore in un giorno.
> qui meno:
> volendo esprimerle in sessantesimi avro':
> 4h + (80 *60 /100) m = 4h + 48m
> meglio dire:
> questo valore (4,80) è espresso in ore
> prendo la parte intera 4
> che costituiscono le ore come noi li rappresentiamo
> considero la parte decimale 0,80 (non 80!)
Giusto, diciamo che io ho considerato 80/100 .... ;-)
> e riprendo il ciclo con una misura d'ordine inferiore:
> quindi:
> 0,80*60=48,00 (Moltiplico per 60 ossia il numero di minuti in un'ora)
> questo valore (48,00) è espresso in minuti
> prendo la parte intera 48
> che costituiscono i minuti come noi li rappresentiamo
Perfetto!!!
[cut]
Ciao Fernando, dopo questa tua *dettagliata* spiegazione, credo di avere le
idee *meno* confuse....:-))
Appena possibile (visto che ora ho le idee meno confuse), mi *rileggo* i
tuoi precedenti post in questo stesso thread, sperando, finalmente, di
capirci qualcosa... :-)
PS:
la mia domanda, prende spunto, dai seguenti link consigliati da Tiziano:
Gestione di date e orari in Excel e in Visual Basic Parte Prima e seconda
http://web.archive.org/web/20021206153842/http://www.microsoft.com/italy/off
ice/previous/2000/esperti/gestione_date/
I file lì indicati li potete scaricare da
http://www.lapalissiano.it/files/gestione_date.zip
in cui, a mio parere, non viene spiegato in modo chiaro (dando forse gia'
scontata la conoscenza dell'argomento) il passaggio da "numero decimale" a
rappres. "giorno_ora".
Integrando pero' la guida (che cmq ritengo ottima), con questa tua
lezioncina, credo che l'argomento si possa considerare abbastanza
sviscerato.....
Giusto?
Ciao e grazie 100000...
Pippo
vedi:
http://www.prodomosua.it/zips/propippo.xls
.f
> vedi:
> http://www.prodomosua.it/zips/propippo.xls
Grazie Fernando, non ho parole!!!
Appena possibile, mi voglio "gustare" questo tuo foglio di esempio, che a
prima vista, sembra riepilogare in modo chiaro e ordinato, quanto hai
scritto in questo thread.
In caso di ulteriori dubbi e per approfondimenti, non manchero' di scrivere
in questo *splendido* NG (magari in questo stesso thread) sperando in un tuo
intervento. ;-)
In "Excel" mi piace molto risolvere problemi (che mi assegno da solo),
creare "modelli" che pero' in gran parte non utilizzo, perche' non ho la
pazienza di limitarmi al semplice caricamento di dati.
Capita anche a te :-)?
Ciao e grazie milleeeee!!
Pippo
> vedi:
> http://www.prodomosua.it/zips/propippo.xls
Nel tuo file di esempio, i calcoli eseguiti partendo dai paramentri
(1;24;60;60;100;10) riesco a comprenderli;
quelli eseguiti con l'uso dei parametri (1;24;1440;86400;8640000;86400000)
*non* riesco proprio a seguirli.
Potresti darmi qualche ulteriore delucidazione col "cucchiaino" ? :-)
Ciao e grazie milleee..!
Pippo
scrivi 10,2 in C1
usando la prima serie (1;24;60;...) modifico sempre la scala
dei resti in colonna C (come ti avevo mostrato in un altro post)
,2 sono giorni (che divido per il numero di ore in un giorno per
ottenere le ore)
,8 sono ore (che divido per il numero di minuti in un'ora per ottenere i
minuti)
,1 sono minuti (che divido...)
,1 sono secondi
,1 sono centesimi
al contrario usando la seconda serie (1;24;1440;...)
non modifico la scala dei resti (in colonna J)
,2 sono giorni (che divido per il numero di ore in un giorno per
ottenere le ore)
,03333 sono giorni (che divido per il numero di minuti in un giorno...
,000694 sono giorni (che divido per il numero di secondi in un giorno...
0,0000...sono giorni (che divido...)
il primo calcolo non solo è soggetto a più errori per il continuo
cambio della scala, ma anche (come ti scrivo) 'meno corretto'
perchè sto forzando le approssimazioni in termini di decimali
che excel può correttamente contenere.
nel primo caso io infatti moltiplico il numero originario e
fornisco al numero originario un'approssimazione che
non ha.
nel secondo caso mi limito invece a sottrarre le quantità
via via enucleate dal numero originario senza generare
decimali impropri
utilizzando la prima sequenza potrei continuare all'infinito
il calcolo (miliardesimi di secondo) su valori assolutamente
inesistenti nel numero originario ma generati solo dal modello
di calcolo.
[è questo il motivo per cui nel mio primo post ti
proponevo il secondo modello: considera sempre il
numero originario, sottrai a questo i valori calcolati
e considerane i resti...sempre e solo nella scala in cui
sono, ossia, secondo excel, in giorni:
più semplice e più corretto, quindi]
.f
> ,2 sono giorni (che divido per il numero di ore in un giorno per
> ottenere le ore)
Perche' usi il termine *divido*???
Non esegui il *prodotto* dei giorni (0,2g) * (24h) (formula =C4*B4)
ottenendo le ore?
> al contrario usando la seconda serie (1;24;1440;...)
> non modifico la scala dei resti (in colonna J)
> ,2 sono giorni (che divido per il numero di ore in un giorno per
> ottenere le ore)
In tal caso, le seguenti formule nelle celle J4 e K4
=J3-K3*(1/I3)
=INT(J4/(1/I4))
non mi sono molto chiare.
Ciao e grazie milleeeee
Pippo
Copia ed incollo parte della tua risposta, a cui chiedo un ulteriore
chiarimento...
>puoi usare indifferentemente queste o queste altre
>=J3-K3/I3 e =INT(J4*I4)
>J3 è il mio numero (10,2). prendo la parte intera della moltiplicazione
>per il numero di giorni in un giorno (1)
>=int(j3*1)...10
>[ovvero della divisione per il numero di parti del giorno che compongono
>un giorno (1/1)
>=int(j3/(1/1)...10]
>considero il resto J3-10/1....0,2 (in J4)
>[ovvero J3-10*(1/1)...0,2]
>J4 è il mio numero (0,2). prendo la parte intera della moltiplicazione
>per il numero di ore in un giorno (24)
>=int(J4*24)...4
>[ovvero della divisione per il numero di parti del giorno che compongono
>un'ora (1/24)
>=int(j4/(1/24))...4]
[cut]
La ripetitivita' dei calcoli e' chiara, quello che non entra nella mia testa
di "zucca" e' la dimostrazione del " Perche' " quelle formule, utilizzate
con quei parametri, portano al risultato corretto.
Cerco di spiegarmi meglio (forse.. :-)..):
Perche' quel "prodotto" (=INT(J4*I4))
e quel "resto" (=J3-K3/I3) rappresentano rispettivamente ad es. le "ore" ed
il numero su cui calcolare i minuti...ecc..??
Applicare una formula, senza riuscire a capire il " perche' " quella stessa
formula porta al risultato voluto, e' una qualcosa che mi rende mooolto
amareggiato...
PS:
Forse il quesito incomincia a diventare [OT], ma non ho idea quale NG o
quale sito poter consultare.
Consigli a riguardo?
Ciao ed ancora grazie per l'infinita disponibilita' verso una testa di
"zucca"!
Pippo
mettiamo un attimo da parte le date.
parliamo di soldi, che sono cose più concrete.
per coprire una spesa di 3,85, dobbiamo passare da
misure espresso nel continuo a una misurazione per soglie:
l'euro sono monete da 2, 1, 0,5, 0,20, 0,10, 0,05.
[avro' bisogno di
=sequences(C1;{0,5;1;2;5;10;20};{" x 2 euro";" x 1 euro";" x 50 cent.";"
x 20 cent.";" x 10 cent.";" x 5 cent"})
ossia
1 x 2 euro, 1 x 1 euro, 1 x 50 cent., 1 x 20 cent., 1 x 10 cent., 1
x 5 cent.]
quante monete da 2 euro dobbiamo utilizzare?
due monete da 2 euro superano l'entità della spesa,
ne diamo 1 e consideriamo il resto da pagare: 1,85.
due monete da 1 euro superano l'importo.
ne diamo 1 e consideriamo il resto: 0,85
...
come vedi ogni volta che assegno una quantità
intera a una soglia, considero il resto nella
stessa unità di misura (euro) e la suddivido
per la soglia inferiore espressa sempre nella stessa
unità di misura.
il fatto che in un giorno ci siano 24 ore e in un'ora ci siano
60 minuti, non è diverso dal fatto che in una moneta di
1 euro ci siano 5 monete da 20 centesimi e che in
ciascuna di queste ci siano 4 monete da 5 centesimi.
nessuna importanza...se tutte le misure sono espresse
nella stessa scala.
se l'unità di misura è l'euro le soglie inferiori
(con cui valutare i resti) sono date da
0.50, 0.20, 0.10, 0.05.
se l'unità di misura è il giorno le soglie inferiori
(con cui valutare i resti) sono date da
1/24, 1/(24*60), 1/(24*60*60), 1/(24*60*60*100).
come facciano i bambini inglesi a prendere dimestichezza
con le loro scale strane non lo so.
un piede sono 12 pollici.
un miglio (63360 pollici) meno un pollice, come
si dice? ?? piedi e ?? pollici
sicuramente c'è un sistema semplice di spiegarlo. io
non lo conosco.
[norman, se ci leggi, spiegacelo]
[io farei
=sequences(C1;{0,0833333333333334;1};{" piedi";" pollici"})
ossia 5279 piedi, 11 pollici
(0,083... è 1/12)]
.f
> > Perche' quel "prodotto" (=INT(J4*I4))
> > e quel "resto" (=J3-K3/I3) rappresentano rispettivamente ad es. le
> > "ore" ed il numero su cui calcolare i minuti...ecc..??
> mettiamo un attimo da parte le date.
> parliamo di soldi, che sono cose più concrete.
> per coprire una spesa di 3,85, dobbiamo passare da
> misure espresso nel continuo a una misurazione per soglie:
> l'euro sono monete da 2, 1, 0,5, 0,20, 0,10, 0,05.
> [avro' bisogno di
> =sequences(C1;{0,5;1;2;5;10;20};{" x 2 euro";" x 1 euro";" x 50 cent.";"
> x 20 cent.";" x 10 cent.";" x 5 cent"})
> ossia
> 1 x 2 euro, 1 x 1 euro, 1 x 50 cent., 1 x 20 cent., 1 x 10 cent., 1
> x 5 cent.]
Grazie Fernando, sei stato mooolto chiaro,... in effetti con gli "euro", il
ragionamento e' piu' intuitivo ...un'ultima domanda (forse.. :-).. ):
c'e' un motivo particolare per cui nella seguente funzione (perfettamente
funzionante) che hai suggerito, dichiari i due array "n" e "l" come tipo di
dato "Variant" ??
''''''''''''''''''''''''''''''''''''''
Public Function sequences(x As Double, n As Variant, l As Variant) As String
Dim y As Long, i As Long, z As String
For i = 1 To UBound(n)
y = Int(x / (1 / n(i)))
x = x - y * (1 / n(i))
z = z & y & " " & l(i) & ", "
Next
sequences = Left(z, Len(z) - 2)
End Function
'''''''''''''''''''''''''''''''''''''''''
> c'e' un motivo particolare per cui nella seguente funzione
> (perfettamente funzionante) che hai suggerito, dichiari i due array
> "n" e "l" come tipo di dato "Variant" ??
> Public Function sequences(x As Double, n As Variant, l As Variant) As
non c'erano grandi possibilità di scelta :-)
dall'help (voce array):
Nota Una variabile di tipo Variant non dichiarata come matrice può
comunque includere una matrice.
.f
Quindi, se ho ben capito, per passare come argomento di una "funzione" una
"matrice", non ci sono altre alternative?
Ciao e grazie milleeee
Pippo
[ti rispondo solo perchè maurizio borrelli non
è nei paraggi :-)]
in una funzione utente non dovrebbe essere dichiarato il
tipo di un array perchè questo viene generato
automaticamente da vba.
Public Function (myarray) as double
è una dichiarazione corretta
[ma Public Function (myarray as variant) as double
non è sbagliata]
che tipo viene generato automaticamente da vba?
un variant?
in effetti ci sono due tipi di variant.
Public Function Varray(mypar) As Double
Dim j As Long, t As Double
For j = 1 To UBound(mypar)
t = t + mypar(j)
Next
Varray = t
End Function
scriverò =Varray({1;2;3}) per ottenere 6, la somma
dei tre valori.
ma se ho rispettivamente in A1, A2 e A3 1, 2 e 3
scrivendo =Varray(A1:A3)
ottengo un errore.
dovrò trattare questo tipo di array
[più vicino alla variabile oggetto e che
è in realtà un variant che contiene un
array di variant] in altro modo.
Public Function VVarray(mypar) As Double
Dim j As Long, t As Double
For j = 1 To mypar.Count
t = t + mypar(j, 1)
Next
VVarray = t
End Function
se scrivo ora =VVarray(A1:A3) ottengo il mio 6
il primo array è stato automaticamente creato a una dimensione,
il secondo bidemensionale.
poichè le funzioni *campano* di questo (della possibilità cioè
di utilizzare parametri con valori o con range) proviamo
a riscrivere sequences in modo che accetti le due possibilità:
Public Function sequences(x As Double, n, l) As String
Dim y As Long, i As Long, z As String
Dim nr As Long, mr As Long, nn As Variant, ll As Variant
If TypeOf n Is Range Then nr = n.Rows.Count Else nr = UBound(n)
ReDim nn(1 To nr)
ReDim ll(1 To nr)
For i = 1 To nr
If TypeOf n Is Range Then nn(i) = n(i, 1) Else nn(i) = n(i)
If TypeOf l Is Range Then ll(i) = l(i, 1) Else ll(i) = l(i)
y = Int(x / (1 / nn(i)))
x = x - y * (1 / nn(i))
z = z & y & " " & ll(i) & ", "
Next
sequences = Left(z, Len(z) - 2)
End Function
ora in pippo.xls è indifferente scrivere
=sequences(C1;{1;24;1440;86400;8640000;86400000};{"Giorni";"Ore";"Minuti";"Secondi";"Centesimi";"Millesimi"})
o il più comodo
=sequences(C1;I3:I8;L3:L8)
.f
naturalmente pippo.xls era
http://www.prodomosua.it/zips/propippo.xls
.f
> > Quindi, se ho ben capito, per passare come argomento di una
> > "funzione" una "matrice", non ci sono altre alternative?
> [ti rispondo solo perchč maurizio borrelli non
> č nei paraggi :-)]
Ricordo una vostra interessante discussione sul "Nothing".. :-)).. :
[cut]
> Public Function sequences(x As Double, n, l) As String
> Dim y As Long, i As Long, z As String
> Dim nr As Long, mr As Long, nn As Variant, ll As Variant
> If TypeOf n Is Range Then nr = n.Rows.Count Else nr = UBound(n)
> ReDim nn(1 To nr)
> ReDim ll(1 To nr)
> For i = 1 To nr
> If TypeOf n Is Range Then nn(i) = n(i, 1) Else nn(i) = n(i)
> If TypeOf l Is Range Then ll(i) = l(i, 1) Else ll(i) = l(i)
> y = Int(x / (1 / nn(i)))
> x = x - y * (1 / nn(i))
> z = z & y & " " & ll(i) & ", "
> Next
> sequences = Left(z, Len(z) - 2)
> End Function
La seguente dichiarazione:
Dim nr As Long, mr As Long, nn As Variant, ll As Variant
per dare una maggiore leggibilita', si potrebbe scrivere:
Dim nr As Long, mr As Long, nn() As Variant, ll() As Variant
per far capire che "nn" e "ll" sono matrici dinamiche.
Cosa ne pensi???
Ciao e grazie milleeee!!!!
Pippo
dipende dal significato: posso dichiarare un variant o un array di
variant
in realtà la vera dichiarazione è nel redim.
se avessi scritto più correttamente
Public Function sequences(x As Double, n, l) As String
Dim y As Long, i As Long, z As String
Dim nr As Long, mr As Long, nn As Variant, ll As Variant
If TypeOf n Is Range Then nr = n.Rows.Count Else nr = UBound(n)
ReDim nn(1 To nr) As Double
ReDim ll(1 To nr) As String
For i = 1 To nr
If TypeOf n Is Range Then nn(i) = n(i, 1) Else nn(i) = n(i)
If TypeOf l Is Range Then ll(i) = l(i, 1) Else ll(i) = l(i)
y = Int(x / (1 / nn(i)))
x = x - y * (1 / nn(i))
z = z & y & " " & ll(i) & ", "
Next
sequences = Left(z, Len(z) - 2)
End Function
nel foglio:
=sequences(167;{0,01;0,1;1};{"centinaia";"decine";"unità"})
una dichiarazione di matrice dinamica tipo Dim nn() as Variant
avrebbe causato errore nel Redim.
.f