sottrazione tra due celle della stessa colonna



  • sottrazione tra due celle della stessa colonna
    di giannibee (utente non iscritto) data: 27/10/2012 21:23:26

    Vorrei risolvere un problema che ormai mi assilla da giorni! allora, parlo di un database di km mensile per automezzi. vorrei trovare un modo per sottrarre il valore di una cella (cioe i km piu' recenti effettuati nell'ultimo inserimento) con il primo valore disponibile inserito precedentemente (es. n° 1 colonna con 62 celle, due per ogni giorno del mese; nella prima cella inserisco la lettura a fine tratta, nella seconda mi dovrebbe comparire la differenza tra l'ultima lettura e la prima lettura utile precedente....... ma purtroppo non sono riuscito ancora a trovare una formula che mi consideri solo le letture inserite senza calcolarmi anche quelle vuote!!! ovviamente e' un lavoro che faccio giornalmente e non mensilmente in maniera tale da sapere subito senza aspettare la fine del mese quanti km ha effettuato un mezzo nelle varie tratte. Anticipatamente ringrazio



  • di Vecchio Frac data: 27/10/2012 21:43:46

    Non mi è chiara la struttura del modello.
    Una semplice formula della seconda cella con la prima? mi sfugge qualcosa :)
    Allega un file con dati di esempio e descrivi quello che vuoi ottenere direttamente sul file (zippalo e allegalo col pulsante che trovi quando fai una risposta).




  • sottrazione tra due celle della stessa colonna
    di giannibee (utente non iscritto) data: 27/10/2012 21:55:54

    ALLORA LA COLONNA HA:
    CELLA 1 TARGA
    CELLA 2 ULTIMO KM MESE PRECEDENTE
    CELLA 3/4 PRIMO GIORNO DEL MESE (CELLA 3 LETTURA KM - CELLA 4 DIFFERENZA CON ULTIMA LETTURA)
    CELLA 5/6 SECONDO GIORNO DEL MESE (CELLA 5 LETTURA KM - CELLA 6 DIFFERENZA CON ULTIMA LETTURA)
    E COSI' VIA..... IL PROBLEMA CHE LE LETTURE NON LE INSERISCO TUTTI I GIORNI.
    VORREI CHE QUANDO UN GIORNO QUALSIASI, ANCHE SE SONO PASSATI DEI GIORNI, INSERISCO UNA LETTURA LA SOTTRAGGA A L'ULTIMA INSERITA SENZA CONSIDERARE I GIORNI VUOTI.



  • di Vecchio Frac data: 27/10/2012 22:49:14

    Ho visto l'allegato (grazie), è chiaro e ho capito cosa ti serve.
    Presumo che si possa fare con una serie di SE e di RIF.RIGA ma non sono molto abile nel costruire formule complesse, preferisco piuttosto una riga di codice.
    Proverò a stendere una funzioncina adatta allo scopo.
    Di passaggio, ti faccio notare che la formula in B6: =SE(O(B5>B4);(B5-B4);"") contiene un O inutile e puoi riscriverla semplicemente così: =SE(B5>B4;B5-B4;"")




  • rigraziamento
    di giannibee (utente non iscritto) data: 28/10/2012 09:57:31

    Grazie, te ne sarei molto grato, anch'io non sono molto pratico..... senti a proposito, senza approfittare ovviamente della tua disponibilità, vorrei chiederti come mai ho inserito una formula tramite il visual basic per sommare solo i valori delle celle colorate in rosso (procedura copiata da internet) ma non riesco a capire perche' e' applicabile solo a un foglio alla volta e non si estende completamente su tutto il file excel poi il fatto di dover premere f9 per far si che la formula aggiorni il foglio..... mmmm e' insopportabile; esiste un modo per farsi che la funzione si applichi contemporaneamente su tutti i figli del file e si aggiorni in automatico? (=SUMBYCOLOR( ecc ecc...)



  • di Vecchio Frac data: 28/10/2012 13:48:47

    Bisogna avviare un ciclo per tutti i fogli della cartella di lavoro.
    For Each sh in Worksheets
    ...
    Next

    E infine un
    Calculate
    potrebbe risolvere il problema del ricalcolo automatico delle formule.
    Comunque il problema iniziale è più impegnativo del previsto, vero che i bambini mi stanno distraendo ma non riesco a ricavare un modo elegante per risolvere ;)




  • risp. a vecchio frac
    di giannibee (utente non iscritto) data: 28/10/2012 14:05:32

    grazie dell'interessamento, ho risolto con un altro ragazzo del forum..... per i bambini ti capisco, ho 2 gemelli pestiferi..... ciao e in bocca al lupo



  • di Vecchio Frac data: 28/10/2012 14:13:09

    Hai risolto? Bene. Magari potresti postare la soluzione.
    Comunque allego ugualmente la mia, visto che ci ho lavorato ^_^
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ac As Range, first_cell As Range, last_cell As Range
    
        With Target
            If .Column <> 2 Then Exit Sub
            If .Row < 4 Or .Row Mod 2 = 0 Then Exit Sub
            If Target(1) = "" Then .Offset(1) = ""
        End With
       
        Set last_cell = Cells([B:B].Rows.Count, 2).End(xlUp)
        Application.EnableEvents = False
        
        Set first_cell = [B4]
        
        For Each ac In Range(Cells(5, 2), Cells(last_cell.Row, 2))
        
            If ac.Row Mod 2 = 1 Then
                If Trim(ac) <> "" Then
                    ac.Offset(1) = ac - first_cell
                    Set first_cell = ac
                End If
            End If
        
        Next
        
        Application.EnableEvents = True
        
    End Sub