Incrementare valore cella



  • Incrementare valore cella
    di alexps81 data: 02/11/2016 10:25:21

    Buongiorno, volevo chiede se qualcuno mi può aiutare su una funzione di Excel. In pratica ho la necessità di incrementare il valore di una cella in base al valore precedente di un'altra cella.
    Mi spiego con un esempio:

    In A1 inserisco il valore 10
    in B1 avrò il valore 10
    ma se successivamente in A1 cancello 10 e scrivo 20
    in B1 ci dovrà essere 30 (quindi sommare il 10 precedente + il 20 appena inserito)

    Non credo sia complicato ma mi sto perdendo d'animo perché non ci riesco
    Grazie



  • di alfrimpa data: 02/11/2016 10:52:55

    Ciao Alex

    Non sono per nulla convinto di aver capito bene.

    In poche parole tu vuoi che in B1 ci sia il valore precedente di A1 più quello che inserisci?

    Prova con il file allegato dove ho inserito il codice che vedi sotto facendo tutti i test possibili per verificarne la correttezza di funzionamento.

    Alfredo 
     
    Public celvalue As Long
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, Range("a1")) Is Nothing Then
        Range("b1").Value = celvalue + Target.Value
    End If
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    celvalue = ActiveCell.Value
    End Sub
    






  • di alexps81 data: 02/11/2016 11:36:11

    Ciao Alfredo, grazie per la risposta. La tua soluzione funziona in parte.
    In realtà mi sono espresso male, immaginavo più ad una formula che una funzione attraverso il VBA. Anche perché le celle A1 e B1 sono puramente di esempio. In realtà la formula andrebbe applicata alle colonne A e B.

    Cmq ho fatto dei test e ho notato che se nella cella A1 scrivo 1 nella cella B1 compare 1, poi se nella cella A1 scrivo di nuovo 1 nella cella B1 compare 2 ma se di nuovo nella cella A1 scrivo 1 nella cella B1 rimane sempre 2. Cioè dovrebbe diventare 3 ma rimane ferma sul 2.
    Ti allego il file



  • di alexps81 data: 02/11/2016 11:45:44

    Scusa non avevo notato il tuo file allegato. E' praticamente uguale al mio quindi non allego nessun file.

    Cmq cerco di spiegarmi meglio:

    Colonna A e colonna B

    In cella A1 scrivo 10 in cella B1 deve comparire 10...
    Poi sempre in cella A1 al posto del 10 metto 20, in cella B1 deve sommarsi il 10 di prima più il 20 presente in cella A1 (quindi 30 come risultato)...
    Poi ancora in cella A1 al posto del 20 metto 3, in cella B1 deve sommarsi il 30 più il 3 presente in A1 (quindi 33 come risultato)...
    e così via per tutte le celle in colonne A e B



  • di patel data: 02/11/2016 11:51:23

    non si può fare con formule, solo con macro, prova questa
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If target.column = 1 Then
        target.offset(0,1).value = target.offset(0,1).value  + Target.Value
    End If
    End Sub






  • di alexps81 data: 02/11/2016 13:31:41

    Perfetto, grazie mille ad entrambi



  • di alexps81 data: 04/11/2016 11:57:52

    Buongiorno a tutti, soprattutto @alfrimpa e @patel che in questi giorni mi stanno dando un mano. Un saluto speciale anche a @Vf che è da un po' che non lo sento.

    Cmq volevo riprende il problema risolto da @patel in quanto ho ampliato il suo codice espandendo il metodo Target ad altre colonne e partendo dal rigo 2 in poi.

    Volevo sapere come si potrebbe semplificare ciò che ho ampliato. Lo chiedo perché le colonne interessate sono per il momento 5, ma se un giorno volessi estenderlo a 100 colonne??? Sarebbe un codice un po' troppo lungo. Probabilmente ci vorrebbe un ciclo?
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Column = 1 And Target.Row > 2 Then
        Target.Offset(0, 5).Value = Target.Offset(0, 5).Value + Target.Value
    End If
    If Target.Column = 2 And Target.Row > 2 Then
        Target.Offset(0, 4).Value = Target.Offset(0, 4).Value + Target.Value
    End If
    If Target.Column = 3 And Target.Row > 2 Then
        Target.Offset(0, 3).Value = Target.Offset(0, 3).Value + Target.Value
    End If
    If Target.Column = 4 And Target.Row > 2 Then
        Target.Offset(0, 2).Value = Target.Offset(0, 2).Value + Target.Value
    End If
    If Target.Column = 5 And Target.Row > 2 Then
        Target.Offset(0, 1).Value = Target.Offset(0, 1).Value + Target.Value
    End If
    
    End Sub



  • di patel data: 04/11/2016 15:46:14

    prova così
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    col = Target.Column
    dcol = 6
    If Target.Row > 2 Then
        Target.Offset(0, dcol -col).Value = Target.Offset(0, dcol -col.Value + Target.Value
    End If
    End Sub






  • di alexps81 data: 04/11/2016 16:01:35

    Perfetto, grazie per il suggerimento. Appena posso provo e ti farò sapere. Intanto, giusto per cercare di imparare cose nuove, non riesco a capire il pezzo di codice:
    Target.Offset(0, dcol -col).Value

    Nel senso tradotto mi sembra di aver inteso: "Il valore della cella posizionata rispetto a..." È quel "posizionata rispetto a" che mi sfugge. Cioè cosa sta a significare "0, dcol -col"?



  • di patel data: 04/11/2016 16:35:02

    dalla tua domanda ho capito che la colonna con le celle da incrementare è la num 6 e l'ho chiamata dcol
    ho capito bene ? inoltre tutti i valori inseriti nelle colonne da 1 a 5 vanno a incrementare la 6.
    se inserisci un numero nella colonna 3 l'offset sarà 6-3 (dcol - col)





  • di alexps81 data: 04/11/2016 17:47:04

    Ho provato il codice ma appena esco dalla cella Excel smette di funzionare e si chiude. Non va in debug, ma da errore e mi chiede di riavviare il programma Excel.
    Cmq perdonami ma purtroppo non ho ancora capito il discorso "se inserisci un numero nella colonna 3 l'offset sarà 6-3 (dcol - col)". Ma poi volevo chiederti la variabile "col", così com'è scritto, definisce le colonne da 1 a 5? Cioè se mi spostassi ad esempio nella colonna 10 piuttosto che nella colonna 15, non avviene comunque la somma nella colonna 6?



  • di patel data: 04/11/2016 19:21:25

    prova questa valida per tutte le colonne, la somma avviene nella F , se vuoi cambiare devi cambiaree anche il 6
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Target.Column = 6 Then Exit Sub
    If Target.Row > 2 Then
       Range("F" & Target.Row) = Range("F" & Target.Row) + Target.Value
    End If
    End Sub






  • di alexps81 data: 04/11/2016 20:47:55

    Molto bene funziona. Ho aggiunto l'operatore ">" al rigo "If Target.Column >= 6 Then Exit Sub" così da uscire dalla sub nel caso esco al di fuori della tabella interessata.
    Cmq se alla fine avevo capito il codice che mi avevi postato prima, adesso con questo sono punto e a capo.
    Quello di prima avevo capito che "Target.Offset(0, dcol - col).Value" stava ad indicare la cella da incrementare si trovava facendo la sottrazione da 6 (variabile "dcol") e la colonna in cui mi trovavo in quel momento (variabile "col"). Dunque se mi trovavo nella prima colonna, avveniva semplicemente la sottrazione 6-1=5, quindi l'offset era 5 colonne più avanti rispetto alla prima. Giusto? E' questo il ragionamento?
    Ma per quanto riguarda l'ultimo codice, sinceramente non ci sono ancora arrivato.

    P.S. non so se è il caso di aprire una nuova discussione, ma in realtà questa somma si tratta di una somma di ore. Ho fatto in modo che all'apertura del file, il range di celle che va da A a F, viene formattato in ore attraverso il codice qui sotto postato.

    Adesso però volevo aggiungere una condizione, cioè immaginiamo di impostare la cella H1 dove il suo valore sia di 55 ore e che se il valore delle celle sommate supera questo valore, allora deve avvenire una colorazione diversa della cella che sfora le 55 ore e la differenza delle ore sforate deve essere rappresentato nella cella accanto, quindi nella colonna "G".
    Il problema che ho riscontrato sin da subito è che non si parla di NUMERI ma di ORE, quindi NumberFormat = "[h]:mm:ss" mi consente di vedere le ore sommate, ma in realtà il valore della cella è diversa. Mi spiego meglio:

    Se in una cella scrivo 49:00 (per indicare 49 ore) in realtà nella cella il valore reale sarebbe "02/01/1900 01:00:00" cioè sarebbe l'una del giorno 2 gennaio 1900. Perciò non riesco a fare un'operazione di sottrazione tra la cella "H1" e le celle nella colonna "F".

    Cmq quello che voglio fare è semplicemente: sommo le ore che ho scritto nelle celle da A a E, il risultato sarà descritto nella cella della colonna F. Nella cella H1 stabilisco un determinato numero di ore (nel mio caso 55). Tutte le somme di ore che superano questo valore devono essere marcate di un colore diverso e la differenza deve essere mostrata nella cella accanto.

    Posto il file di esempio giusto per farmi capire.
     
    Range("A:F").NumberFormat = "[h]:mm:ss"



  • di patel data: 05/11/2016 07:55:55

    la differenza la puoi ottenere con una formula, il colore con la formattazione condizionata