Sommare diversi tipi



  • Sommare diversi tipi
    di Trigun (utente non iscritto) data: 04/10/2010

    Salve,
    ho 1 problema ho 1 tabella del tipo :
    4 4 4 4
    6.15 6.15 6.15 6.15 10 6.15
    ora io vorrei sommare le righe in modo che nella prima mi esca 16 e nella 2° dovrebbe uscire 41.15 (i 15 son minuti e o 4 e 10 sono ore)
    solo che ovviamente non me lo fa xke' son 2 tipi diversi...
    quindi le alternative che vedo sono 2:
    usare qualche formula strana che non conosco per far fare 1 somma :p
    oppure trasformare tutti gli interi in formato di tipo ora... per far questo o lo faccio a mano (e su 1 tabella grande e' 1 rottura :p) oppure quello che pensavo e' tipo io scrivo 4 e lui mi calcola il numero automaticamente per dar come valore 4 ore e non 4 giorni (xke' se uso solo la formattazione x orw gli interi vengono presi come il giorno dell'anno 1/1/1900) e quindi poi mi ritrovo con un numero che rappresenta un ora e un numero che rappresenta 1 giorno...
    come posso risolvere? :d



  • di Locate (utente non iscritto) data: 04/10/2010

    Ciao
    puoi usare la seguente formula
    --------
    =somma.se(a2:f2;"<1";a2:f2)+somma.se(a2:f2;">1";a2:f2)/24
    ---------
    ricordati dove vai a posizionare il calcolo di formattare la cella in [h].mm
    ciao locate
    vedi esempi sotto
     
    4	4	4	4				16
    6.15	6.15	6.15	6.15	10	6.15		41.15
    6.15	6.15	7	6.15	10	6.15		42.00
    6.15	4	6.15	6.15	10	6.15		39.00
    



  • di Locate (utente non iscritto) data: 04/10/2010

    Riciao
    mi sono scordato nella funzione un =
    ----------
    =somma.se(a2:f2;"<1";a2:f2)+somma.se(a2:f2;">=1";a2:f2)/24
    ---------
    per controllare valore 1
    riciao da locate



  • di Trigun (utente non iscritto) data: 07/10/2010

    Ciao grazie x la risposta ma non mi funziona ^^
    6.15 e' > di 1
    di conseguenza se dovesse scegliere tra i 2 tipi di somme andrebbe a scegliere sempre il primo no?



  • di Trigun (utente non iscritto) data: 07/10/2010

    Forse ho capito come funziona quella formula ^^ xo' non mi e' chiara 1 cosa... se io metto 7,3 dove intendo 6 ore e 30 minuti e applico quella formula mi da come risultato 6,18 al posto di 6,30 per far si che funzioni dovrei metter 6,50 ...



  • di Locate (utente non iscritto) data: 07/10/2010

    Ciao
    dove' che non ti funziona??
    dici che 6.15 e maggiore di 1 ma non e' cosi' prova ad andare a vedere il valore effettivo di 6.15 e vedrai che equivale a 0,260416666667...
    quindi in questo caso e minore di 1.
    ricordati che nel calcolo delle ore 1 corrisponde a un giorno quindi in un giorno ci sono 24 ore 1440 minuti 86400 secondi quindi la funzione nel suo calcolo calcola esattamente
    ps la devi usare anche dove ci sono su una riga tutti numeri interi altrimenti non ti troverai mai con le somme totali vedi riga 1
    se ai problemi allega pure un file che vediamo di risolverlo insieme
    ciao da locate



  • di Trigun (utente non iscritto) data: 07/10/2010

    Per far funzionare la formula dovrei far 1 cosa del genere:
    =somma.se(b12:af12;"<1";b12:af12)+somma.se(b12:af12;">=1";int(b12:af12))/24+somma.se(b12:af12;">=1";resto(b12:af12,1))

    xo' ovviamente int e resto non possono esser applicati in quel modo... quindi non funziona :p come potrei far? :d



  • di Locate (utente non iscritto) data: 07/10/2010

    Ciao trigun
    scusa la domanda ma questi dati tu li importi da un altro database??? se si questi usa la virgola per le ore e il punto per i valori numerici
    ------
    10,12,00 = ore
    1,000.00 per valori
    ---------
    perche ti chiedo questo, perche' excel e programmato che per le ore si adopera il punto e per valori la virgola, quindi nel tuo caso devi strosformare i valori dopo la virgola in centesimi quindi la funzione che devi usare per questo non e' piu' quella di prima inerente a giorni e ore ma questa che trasforma il resto di una divisione da 60 a 100
    ------------
    =somma(int(somma(a1:f1))+resto(somma(a1:f1);1)/60*100)/24
    -----------
    vedi risultato sotto
    ps. dove metti la funzione la cella va sempre impostata in [h].mm per fare in seguito i calcoli
    ciao da locate
    ti posto il mio file di prova vedi la differenza prima e dopo il tuo chiarimento


     
    =SOMMA(INT(SOMMA(A1:F1))+RESTO(SOMMA(A1:F1);1)/60*100)/24
    
    4	4	4	4				16.00
    6,15	6,15	6,15	6,15	10	6,15		41.15
    6,15	6,15	10	6,15	20	6,15		55.00
    6,15	1	6,15	6,15	10	6,15		36.00
    



  • di Trigun (utente non iscritto) data: 08/10/2010

    Funziona quasi bene :p
    praticamente in questo modo se la somma dei minuti supera i 100 questi non vengono calcolati (xke' prima somma in base 100 e poi controlla i decimali che vengono passati in base 60)
    e quindi se tu hai 0,30 0,30 0,30 0,15 ti dara' 1 ora e 5 al posto di 1 e 45

    cmq prima usavo il 6.15 ora son passato al 6,15 xke' da tastierino numerico mi mette la virgola e xke' cmq quel 6.15 mi veniva riconosciuto come testo e non come ore...

    praticamente quello che intendevo io era applicare la funzione int e resto ad ogni elemento prima di far la somma ^_^
    ad es su 1 array far
    for(i=0;i>a.length;i++){
    tot += int(a[i]) + resto(a[i])*qualcosa;
    }
    mentre attualmente e'
    for(i=0;i>a.length;i++){
    tot += int(a[i]);
    }
    tot += int(tot) + resto(tot)*qualcosa;


    l'unico modo che mi viene in mente e far la somma cella x cella senza usare a1:a7 ma far a1+a2+..+a7
    ma non mi sembra 1 cosa ottimale :d e mi sembra strano che i programmatori di excel non abbiano pensato ad applicare una funzione che ti esegue la funzione su 1 serie di celle restituendo la serie di celle modificata... (python :p)



  • di Enzo (utente non iscritto) data: 08/10/2010

    Non so se possa esserti di aiuto ma tempo fa ho creato una funzione per ottenere una somma di valori inseriti nelle celle con la virgola che rappresentavano degli orari.
    vedi un po se ti serve e fa sapere
    devi copiarla in un modulo e richiamarla dalle funzione come "funzioni definite dal'utente"

     
    Function Somma_Ore_By_Pv(ELENCO As Range) As Double
    Dim cc As Range
    valore = 0
    intero = 0
    intero2 = 0
    For Each cc In ELENCO
    decimale = cc.Value - Int(cc.Value)
    intero2 = intero2 + Int(cc.Value)
    valore = valore + decimale
    If valore >= 0.6 Then
    intero = intero + 1
    valore = valore - 0.6
    End If
    Next
    If valore = "0,6" Then
    valore = 1
    End If
    Somma_Ore_By_Pv = intero2 + intero + valore
    Somma_Ore_By_Pv = Format(Somma_Ore_By_Pv, "#,##0.00")
    End Function
    



  • di Trigun (utente non iscritto) data: 08/10/2010

    Niente mi arrendo ^^
    excel non e' 1 programma adatto a me...
    se mi fossi fatto 1 applicativo in qualsiasi altro linguaggio (java, c, ecc ) avrei gia finito :d invece sto a combatte solo x cercare come cavolo si apre il coso dove si scrivono le funzioni in vba su excel 2010...



  • di Locate (utente non iscritto) data: 08/10/2010

    Ciao trigun
    sono appena rientrato e ho visto che ti stai arrendendo, nella programmazione non devi farlo mai fino allimite dellimpossibile perche la soluzione sta sempre dietro l'angolo,
    comunque ieri sera mi sono riguardato una rutin di calcolo in un mio programma per gare e ho visto che gia' allora non avevo usato nessuna funzione o macro per far questo ma semplici calcoli passo passo cella per cella partendo da un calcolo e continuare progressivamente in for fino a -end do file-
    quindi ti passo il file di prova che ho fatto che non usa nessuna macro ma una riga di appoggio come se fosse un ciclo for vedi le formule impostate in b13 e c13 copiando di seguito
    ciao da locate



  • di Trigun (utente non iscritto) data: 09/10/2010

    Il fatto locate e' che conosco 200 linguaggi diversi ^_^ ma il vba nn lo conosco :p
    e da quello che ho visto anche la sintassi e' molto diversa dal normale...
    poi io avevo pensato di far 1 funzione tipo quella che ho scritto sotto... ma apparte il fatto che nn ho idea se l'ho scritta bene o male non saprei manco dove inserirla :p
     
    Function CalcoloOre(ParamArray par()) As Long
    
    Dim i As Integer
    
    For i = 1 To UBound(par)
    CalcoloOre = CalcoloOre + ((int(par(i)) + (par(i) % 1)/60*100)/24
    Next i
    End Function



  • di Mauro (utente non iscritto) data: 09/10/2010

    Vba non è altro che visual basic che usa delle librerie di oggetti già precostruite, se programmi in java, vba dovresti impararlo in un lampo e non solo ma dovresti riuscire a crearti delle classi ad hoc.



  • di Trigun (utente non iscritto) data: 09/10/2010

    Beh java e vba nn c'entrano 1 mazza



  • di Locate (utente non iscritto) data: 11/10/2010

    Ciao trigun
    intanto saluto enzo che ti aveva passato una funzione,ma provandola oggi ho visto che dava errori, quindi sulla falsa riga di questa ne ho scritta una funzionante come avevi inteso tu riportando quello che ti avevo gia' fatto su una riga di appoggio in una funzione vera e propria.
    vedi sotto codice vba e file allegato
    riguardo alla risposat che ai dato a mauro,questi a semplicemente ragione perche' girandola sottosopra una cosa tutti i compilatori ad oggetto, iniziando da vb,c++,delphi,clipper,java ecc.ecc cambia qualche cosa ma la sintassi e' sempre la solita zuppa da mescolare
    ciao da locate
     
    ''INSERIRE IN UN MODULO in cella di calcolo come =somma() =Sum_OV()
    Function Sum_OV(celle_di_calcolo As Range) As Double ''calcola ore con valore numerico
    Dim cc As Range
    dec1 = 0
    dec2 = 0
    somma = 0
    For Each cc In celle_di_calcolo
      dec1 = cc.Value - Int(cc.Value) ''val dec
      dec2 = somma - Int(somma)   ''val dec prima immissione
      decsom = dec1 + dec2
       If decsom >= 0.6 Then
         somma = somma + 1 + cc.Value - 0.6
       Else
         somma = somma + cc.Value
       End If
    Next
    Sum_OV = (Int(somma) + ((somma - Int(somma)) / 60 * 100)) / 24 ''cella formattata [h].mm
                                                                   '' ritorna ore.minuti
    End Function
    
    



  • di Trigun (utente non iscritto) data: 11/10/2010

    Beh io parlavo di sintassi... la sintassi di java e quella di vb e' estramemente differente...
    la sintassi di java e quella di c# sono molto simili...
    ovvio che poi alla fine e' sempre la solita zuppa... se guardi a questo punto anche la sintassi di linguaggi come python hanno sempre la solita sintassi... anche se poi sono fortemente legati all'indentazione
    cmq nn ho ancora capito come si apre l'editor di vba dove incollare le funzioni :d (su excel 2010... da quando hanno cambiato la grafica superiore nn c'ho mai capito nulla)



  • di Enzo (utente non iscritto) data: 11/10/2010

    Solo una precisazione e intanto saluto locate
    la funzione "funziona",scusate il gioco di parole ma l'ho testata in office 2003
    in versioni successive non so...



  • di Ricky53 (utente non iscritto) data: 11/10/2010

    Ciao trigun,

    "alt+f11" è valido nel 2003, 2007 e 2010.

    attenzione: devi inserire in un modulo (e solo in un modulo) quanto ti è stato inviato.

    se conosci il linguaggio "c" il tornare indietro al "vba" non dovrebbe crearti difficoltà tranne conoscere il nuovo aspetto estetico del 2010 (ma qui si tratta solo di trovare le cose con il vba non c'entra nulla.

    altra cosa è affermare che alcune funzioni del 2003 non sono più supportate dal 2007 e 2010 !!!
    ma qui andiamo nella programmazione "vba" spinta e non siamo in questo caso.

    commento: anch'io mi trovo in difficoltà con la nuova grafica che è si accattivante ma molto diversa da quella del 2003 (che continuo ad amare ed utilizzare).

    ciao da ricky53



  • di Locate (utente non iscritto) data: 11/10/2010

    Ciao
    mi rivolgo a enzo
    effettivamente adesso che ho visto il tuo post e provandola ancora la tua funzione o visto che lavora e il calcolo e' giusto, era sul mio file che avevo gia' impostato la cella dove veniva fatta la trasformazione in [h].mm e non mi sono accorto che era ancora in valore, dato che trigum voleva che il calcolo finale fosse in ore.minuti e dalla fretta come sai se non trasformi i minuti in centesimi non ai il valore esatto, comunque per questo mi sono permesso una modifica finale alla tua dove vengono gia calcolati i minuti,centesimali vedi parte del codice al tuo
    ciao da locate
     
    If valore = "0,6" Then
    valore = 1
    End If
    ''Somma_Ore_By_Pv = intero2 + intero + valore
    ''Somma_Ore_By_Pv = Format(Somma_Ore_By_Pv, "#,##0.00")
    somme_celle = intero2 + intero + valore
    Somma_Ore_By_Pv = (Int(somme_celle) + ((somme_celle - Int(somme_celle)) / 60 * 100)) / 24
    End Function



  • di Trigun (utente non iscritto) data: 15/10/2010

    Ok grazie mille funziona :d ho dovuto solo aggiungere un piccolo if x controllare se la cella isnumeric ^_^