Condividi:        

Calcolo di ore, anzi di minuti

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

Calcolo di ore, anzi di minuti

Postdi gudmund » 31/05/10 07:56

Ciao a tutti,
ho un problemino con il calcolo delle ore, anzi dei minuti. Il problema sta nel fatto che quando faccio calcoli su pochissimi minuti, ci sono troppi decimali e non so quale tipo di variabile usare. Mi sa che non è chiaro e quindi mi spiego meglio con un esempio:

Ho creato una funzione che calcola se ho diritto al buono pasto in base alle ore lavorate; la regola è che ho diritto al buono pasto se lavoro almeno 7 ore e 42 minuti, salvo alcune eccezioni.
I parametri che passo alla funzione sono semplicemente gli orari di entrata e di uscita e un codice che mi serve per le eccezioni (ad esempio 1=permesso retribuito, 2=permesso da recuperare, 3=Straordinario, ecc.).
Il valore restituito è 1 o 0.
Se faccio più di 7.42 ore la funzione restituisce correttamente 1, mentre se ne faccio di meno, restituisce correttamente 0.
Ma se ne faccio esattamente 7,42 restituisce 0 e non 1 come dovrebbe (almeno nelle mie intenzioni...). Secondo me il problema sta nel tipo di variabile:
ho provato con double, single, decimal ma sempre con risultati errati

Questa è la funzione:

Codice: Seleziona tutto
Function Ticket(Entr As Double, Usc As Double, Cod As Byte) As Byte
   Dim TL As Double '----->TL = Totale ore Lavorate
   TL = (Usc - Entr)
   If TL >= Foglio1.Range("b10").Value Then '-----> nella casella b10 c'è l'orario minimo per avere il buono pasto; 7.42, in formato orario, che VBA interpreta in decimale come 0,320833333333333
      Ticket = 1
   Else
       ........ ' -----> qui ci sono le eccezioni alla regola
       ........
       ........
   End If
End Function


Faccio un esempio pratico
A1 -> 8.15 (entrata)
B1 -> 15.57 (uscita)
C1 -> vuoto (nessun codice)
D1 -> =Ticket(A1;B1;C1) -> il risultato è 0 invece che 1

Con un arrotondamento risolvo (anche se non ho capito perché...) cioè round(Foglio1.Range("b10").Value, 15), ma vorrei sapere se sbaglio qualcosa.

Tengo a precisare che ho creato questa funzione, per inserire anche le varie eccezioni, altrimenti sarebbe bastato un =SE((C1-B1)>=Dati!B10;1;0) che mi dà un risultato corretto

Spero sia tutto chiaro
Grazie
gudmund
Utente Junior
 
Post: 50
Iscritto il: 21/06/07 14:09

Sponsor
 

Re: Calcolo di ore, anzi di minuti

Postdi Flash30005 » 31/05/10 08:34

In A1 inserisci 8,15 (separatore virgola)
in B1 inserisci 15,57 (separatore virgola)
(C1 non devi utilizzarlo)
nel Cod della funzione metterai il valore della cella B10
avrai in D1 questa formula (utilizzo della funzione creata)
Codice: Seleziona tutto
=Ticket(A1;B1;B10)


Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Calcolo di ore, anzi di minuti

Postdi gudmund » 31/05/10 11:12

Scusa, ma non ho capito... devo usare il separatore virgola al posto del punto per gli orari?
E poi la funzione deve essere uguale per tutta la cartella di lavoro, quindi il valore di c1 deve poter essere presente o meno.
Sono 12 fogli (uno per mese), più uno con i dati e uno con i riepiloghi
E in b10 del foglio1 (che contiene i dati e che si chiama appunto "dati") c'è l'orario minimo per avere diritto al buono pasto e che viene letto da tutti i fogli del file.
la sintassi della funzione "deve" essere =ticket(a1;b1;c1). Ovviamente per la riga 2 sarà =ticket(a2;b2;c2) e così via (ogni riga un giorno: entrata - uscita - codice).
gudmund
Utente Junior
 
Post: 50
Iscritto il: 21/06/07 14:09

Re: Calcolo di ore, anzi di minuti

Postdi Flash30005 » 31/05/10 12:12

La formattazione orario con il . (punto) non mi sembra riconosciuta dal sistema standard a meno che il sistema non sia configurato così ma, ripeto, non è lo standard

Modifica nella funzione la riga riferita a TL
così
Codice: Seleziona tutto
Function Ticket(Entr As Double, Usc As Double, Cod As Byte) As Byte
   Dim TL As Double '----->TL = Totale ore Lavorate
   TL = (Usc - Entr) + 1   '<<<<<<<< aggiungi 1
   If TL >= Foglio1.Range("b10").Value Then '-----> nella casella b10 c'è l'orario minimo per avere il buono pasto; 7.42, in formato orario, che VBA interpreta in decimale come 0,320833333333333
      Ticket = 1
   Else
   End If
End Function


Nella funzione inserirai l'orario in formato standard es
Entrata 8:15
Uscita 15:57
nel codice potrai mettere C1
ma in C1 dovrai mettere questa formula
Codice: Seleziona tutto
=B$10

eventualemnte se si riferisce al foglio dati sarà
Codice: Seleziona tutto
=Dati!B$10

Ora potrai trascinare la formula verso il basso

Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Calcolo di ore, anzi di minuti

Postdi Anthony47 » 31/05/10 14:34

Se non l' avete gia' risolta: rassegnati gudmund, e usa qualcosa come If TL >= (Foglio1.Range("b10").Value - 0.000001) Then dove quel numerino corrisonde a circa 0.1 secondo.

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

Re: Calcolo di ore, anzi di minuti

Postdi gudmund » 04/06/10 11:19

Quindi si può dire che è un limite di excel: troppi decimali.
Mi sa che continuerò con l'arrotondamento a 15 decimali
Grazie
gudmund
Utente Junior
 
Post: 50
Iscritto il: 21/06/07 14:09

Re: Calcolo di ore, anzi di minuti

Postdi Anthony47 » 05/06/10 00:01

Diciamo che sono due calcoli fatti con la stessa logica ma con strumenti diversi, per cui le cifre meno significative non e' detto che coincidano, anzi e' garantito che non coincideranno.

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


Torna a Applicazioni Office Windows


Topic correlati a "Calcolo di ore, anzi di minuti":


Chi c’è in linea

Visitano il forum: Nessuno e 66 ospiti