Numero negativo in cella



  • Numero negativo in cella
    di giovanni (utente non iscritto) data: 24/09/2015 15:42:06

    Nella cella A1 con convalida dati ci sono 2 alternative "Acquisto" e "Vendita", nella cella B1 inserisco valori numerici positivi se Acquisto, negativi se Vendita, ciò si ripete per varie celle della colonna A e B. E' possibile con formula o altro e senza colonna di appoggio far si che nelle celle A dove compare Vendita il valore che inserisco in B compaia automaticamente con il segno meno? Spero di essere stato chiaro senza inserire file, se ci sono problemi allego un file senza dati sensibili.
    Grazie per l'aiuto
    giovanni



  • di Santuberto (utente non iscritto) data: 24/09/2015 16:17:15

    Buongiorno a tutti.
    Se ho capito bene ... cito" E' possibile con formula o altro e senza colonna di appoggio far si che nelle celle A dove compare Vendita il valore che inserisco in B compaia automaticamente con il segno meno?"

    Farei così in cella a1: =-ASS(B1)
    Poi trascino in basso.
    Se ho capito male... allega un file d'esempio.



  • di cromagno data: 24/09/2015 16:19:19

    Ciao,
    se ti occorre solamente una cosa "visiva" (nel senso che otterresti il segno negativo ma il valore resterebbe comunque positivo) potresti usare la "formattazione condizionale" (proprio per il formato, non per il colore), se invece ti serve il valore per altri calcoli... o adatti la formula finale in modo che consideri un valore negativo in base alla scritta nella cella con il "convalida dati" oppure ricorri al VBA in modo da modificare il valore ogni volta che modifichi un range da te impostato.



  • di alfrimpa data: 24/09/2015 16:19:21

    Ciao Giovanni

    Senza colonne d'appoggio credo si possa fare solo con il VBA e con la sottostante macro da inserire nel modulo del foglio interessato.

    Ti allego comunque file di prova.

    Alfredo
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("b1:b1000")) Is Nothing Then
    If Target.Rows.Count > 1 Then Exit Sub
    If Target.Value = "" Then Exit Sub
        If Target.Offset(0, -1).Value = "vendita" Then
            Target.Value = Target.Value * -1
        End If
    End If
    End Sub
    






  • di cromagno data: 24/09/2015 16:21:56

    @Afredo
    grazie per aver dato un esempio pratico di quello che intendevo alla fine del mio post



  • di alfrimpa data: 24/09/2015 16:26:52

    Si Tore credo che quella sia l'unica maniera di farlo.

    Alfredo





  • di perché (utente non iscritto) data: 24/09/2015 16:28:07

    Suggerisco questa modifica

    Target.Value = -Abs(Target.Value)

    per essere certi che il valore assegnato sia negativo (in caso di errore di input del valore di partenza)



  • di cromagno data: 24/09/2015 16:33:54

    @perchè
    in teoria non sarebbe necessaria questa "prevenzione" in quanto se "giovanni" vorrebbe che il numero diventasse negativo in automatico, si presuppone che lui voglia scrivere solo numeri positivi...
    In pratica però è sempre meglio prevenire



  • di alfrimpa data: 24/09/2015 16:34:48

    Si hai ragione perché.

    Non avevo considerato l'ipotesi di un errore di digitazione.

    Alfredo





  • di perché (utente non iscritto) data: 24/09/2015 16:37:18

    @cromagno ... se giovanni "volesse" ... intanto un errore è sempre possibile e se giovanni inserisce un valore negativo e non positivo, con la mia modifica, il segno dall'altra parte sarebbe sempre corretto.

    @alfrimpa ... esatto, un errore di digitazione è sempre possibile ... anzi, andrebbe validato anche l'input con codice vba aggiuntivo ...



  • di cromagno data: 24/09/2015 16:41:40

    @perchè
    ...e se giovanni "dovesse inserire" un valore...



  • di scossa data: 24/09/2015 17:13:44

    Sigh!!!!
    E le 91 ricorsioni della routine di evento !!!!

    Poi sarebbe da gestire anche il cambio di voce nella colonna A ..... una proposta qui sotto.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)

     
    Private Sub Worksheet_Change(ByVal Target As Range)
      
      If Not Intersect(Target, Range("A1:B1000")) Is Nothing Then
        If Target.Column = 1 Then Set Target = Target.Offset(0, 1)
        With Target.Cells(1, 1)
          If IsNumeric(.Value) And .Value <> "" Then
            Application.EnableEvents = False
            If .Offset(0, -1).Value = "vendita" Then
              .Value = -Abs(Target.Value)
            Else
              .Value = Abs(Target.Value)
            End If
            Application.EnableEvents = True
          End If
        End With
      End If
    
    End Sub
    



  • di scossa data: 24/09/2015 17:21:16

    Una correzione al codice, per gestire gli input multipli in colonna B.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)

     
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim cella As Range
      If Not Intersect(Target, Range("A1:B1000")) Is Nothing Then
        If Target.Column = 1 Then Set Target = Target.Offset(0, 1)
        For Each cella In Target
          With cella
            If IsNumeric(.Value) And .Value <> "" Then
              Application.EnableEvents = False
              If .Offset(0, -1).Value = "vendita" Then
                .Value = -Abs(.Value)
              Else
                .Value = Abs(.Value)
              End If
              Application.EnableEvents = True
            End If
          End With
        Next
      End If
    End Sub
    
    


  • Numero negativo in cella
    di giovanni (utente non iscritto) data: 25/09/2015 06:05:23

    Solo stamattina ho potuto leggere le varie risposte e ho risolto con il vba di alfrimpa.
    Ringrazio e saluto tutti per il tempo che mi avete dedicato.
    giovanni



  • di scossa data: 25/09/2015 09:48:20

    cit.: " e ho risolto con il vba di alfrimpa"

    se hai usato il suo codice originale non mi sembra una buona scelta: ad ogni modifica l'evento va in loop ricorsivo (richiama se stesso oltre 90 volte) .....



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di alfrimpa data: 25/09/2015 11:55:17

    @ scossa

    Perdonami ma questa faccenda degli eventi ricorsivi non vuole proprio entrarmi in testa.

    Potresti cortesemente dirmi, per evitare tali eventualità, dove posizionare correttamente le istruzioni Application.EnableEvents = False/True all'interno di una routine Worksheet_Change?

    Ti ringrazio infinitamente.

    Alfredo





  • di scossa data: 25/09/2015 13:11:17

    cit.: "dove posizionare correttamente le istruzioni Application.EnableEvents = False/True all'interno di una routine Worksheet_Change?"

    Normalmente, a False immediatamente prima di .value = blabla e a True subito dopo.
    In caso cella.Value = blabla fosse all'interno di un ciclo For, se il ciclo contiene solo quell'istruzione puoi metterle subito prima del For e subito dopo il Next.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di alfrimpa data: 25/09/2015 13:52:07

    Grazie scossa, spero di non dimenticarmelo più e di non incorrere più nelle tue, giuste, "reprimende"

    Alfredo

    P.S. E se ci sono degli If o dei Select Case?





  • di scossa data: 25/09/2015 16:11:55

    cit.: " E se ci sono degli If o dei Select Case?"

    Dipende, di solito vale quanto indicato con "normalmente".



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)


  • Numero negativo in cella
    di giovanni (utente non iscritto) data: 25/09/2015 19:46:11

    Scossa hai ragione ho scritto risolto per fiducia senza verificare. Mea culpa.
    giovanni


  • Numero negativo in cella
    di giovanni (utente non iscritto) data: 25/09/2015 20:38:55

    Il discorso è stato che ho visto il file allegato di alfrimpa ho visto che funzionava e l'ho tralasciato per una verifica tra qualche giorno. Comunque grazie a tutti.
    giovanni