Formattazione condizionale barre dati



  • Formattazione condizionale barre dati
    di DELTAmax data: 27/10/2015 00:07:35

    Salve a tutti....

    Dopo aver risolto un problema con le macro ho bisogno nuovamente del vostro aiuto...

    Su excel ho un foglio con una colonna adibita a "SPESA" dove vengono inserite somme e divisioni di altre celle...
    Ho fatto in modo che in base ai valori che escono si colori la cella in modo proporzionale al valore (formattazione condizionale) usando le barre dati....rosso per i numeri positivi e verde per i negativi...

    Il problema è che non esce esattamente quello che voglio...allego il file con la foto di come esce il tutto (sinistra) e come vorrei che fosse (destra)...

    praticamente vorrei se possibile:
    piu alto è il valore in positivo piu lunga è la barra rossa... (e qui ci siamo)
    piu basso è il valore in negativo piu lunga è la barra verde... (ora esce il contrario)
    con lo zero con barra inesistente

    E' possibile tutto questo??...o è solo una mia fantasia??...


    (se qualcuno riesce a cancellare la prima immagine che ho messo, grazie)



  • di Marius44 data: 27/10/2015 08:33:38

    Ciao Max
    Se i valori sono disposti come da immagine (i positivi e i negativi, cioè separati e non mischiati), è sufficiente impostare la formattazione condizionale dei valori negativi al "contrario" cioè barra più corta, percentuale valore 100, barra più lunga, percentuale valore 0
    Dovrebbe darti quello che vuoi.
    Fammi sapere. Ciao,
    Mario



  • di DELTAmax data: 27/10/2015 12:25:38

    Ho provato come hai detto, ma ora è giusta la barra negativa, ma non la positiva....

    La positiva infatti ha le barre vicino allo zero lunghe e quelle di valore positivo piu alto piu corte...



  • di Marius44 data: 27/10/2015 12:55:16

    Ciao Max
    Non devi formattare TUTTO INSIEME, devi farlo separatamente. Infatti avevo detto:
    "Se i valori sono disposti come da immagine (i positivi e i negativi, cioè separati e non mischiati), è sufficiente impostare la formattazione condizionale dei valori negativi al "contrario" "
    Che io sappia, insieme non si può fare (spero d'essere smentito).
    Ciao,
    Mario



  • di DELTAmax data: 27/10/2015 13:42:32

    ah ok...non si capiva....
    Comunque sono "mischiati" i valori....possono esserci valori negativi alternati a positivi....

    Quello che voglio visualizzare è appunto una barra che aumenta con la "grandezza" del numero scritto a prescindere del segno - (meno)...



  • di Marius44 data: 27/10/2015 15:16:10

    Ciao Max
    Prova ad inserire una doppia formattazione condizionale: una basata sulla barra dei dati e l'altra su scala a 2 colori sfumata, entrambe su valore minimo e massimo oppure entrambe su percentuale oppure ancora una in una modalità e l'altra nell'altra (scusa il bisticcio di parole).
    Tieni presente che ammesso che hai un 50 e un -50 le barre NON possono essere della stessa lunghezza.
    Ciao,
    Mario



  • di DELTAmax data: 27/10/2015 16:12:53

    Riusciresti a farmi un esempio con un file??...

    Perche ci ho provato 1000 volte e non esce niente di giusto...



  • di Marius44 data: 27/10/2015 16:21:45

    Eccoti accontentato. Prova e fai sapere.
    Ciao,
    Mario



  • di DELTAmax data: 27/10/2015 16:33:08

    Diciamo che non ci si capisce poi molto xP scusami...

    Nessun'altro che sappia usare la formattazione condizionale??...
    Mi sembra impossibile non si possa fare una cosa così semplice (non per me ovviamente)...



  • di Marius44 data: 27/10/2015 16:54:46

    Beh, io lo capivo.

    Con la formattazione penso che non si possa far di più. Potresti tentare con un grafico.

    Io abbandono. Ciao,
    Mario



  • di cromagno data: 27/10/2015 18:48:44

    Ciao a tutti,
    premetto che la penso come Mario e cioè che con la sola formattazione condizionale non si riesca (spero di essere smentito visto che ci ho provato e riprovato).
    Alla fine, aiutandomi con il "registratore di macro" (non sapevo come gestire quelle formattazioni in VBA) son riuscito a fare qualcosa...

    Supponendo di avere i dati nella colonna A, il codice usato è quello postato sotto.

    Lascio comunque il file in allegato.
     
    Option Explicit
    Sub barre_dati()
    Dim riga As Long, campo1 As Range, campo2 As Range, soprazero As Double
    Dim i As Long, numero As Double, dati As Range, minimo As Double
    
    riga = Range("A1").End(xlDown).Row
    soprazero = Application.WorksheetFunction.CountIf(Range("A1:A" & riga), ">0")
    Set dati = Range("A1:A" & riga)
    Set campo1 = Range("A1:A" & soprazero)
    Set campo2 = Range("A" & soprazero + 1 & ":A" & riga)
    minimo = Application.WorksheetFunction.Small(dati, 1)
    ActiveWorkbook.Worksheets(1).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(1).Sort.SortFields.Add Key:=Range("A1") _
            , Order:=xlDescending
        With ActiveWorkbook.Worksheets(1).Sort
            .SetRange Range("A1:A" & riga)
            .Header = xlNo
            .MatchCase = False
            .SortMethod = xlPinYin
            .Apply
        End With
        ActiveWorkbook.Worksheets(1).Sort.SortFields.Clear
        ActiveWorkbook.Worksheets(1).Sort.SortFields.Add Key:=Range("A1") _
            , Order:=xlAscending
        With ActiveWorkbook.Worksheets(1).Sort
            .SetRange Range("A1:A" & soprazero)
            .Header = xlNo
            .MatchCase = False
            .SortMethod = xlPinYin
            .Apply
        End With
        
        campo1.FormatConditions.AddDatabar
        campo1.FormatConditions(campo1.FormatConditions.Count).ShowValue = True
        campo1.FormatConditions(campo1.FormatConditions.Count).SetFirstPriority
        With campo1.FormatConditions(1)
            .MinPoint.Modify newtype:=xlConditionValueAutomaticMin
            .MaxPoint.Modify newtype:=xlConditionValueAutomaticMax
        End With
        With campo1.FormatConditions(1).BarColor
            .ColorIndex = 3
            .TintAndShade = 0
        End With
        campo1.FormatConditions(1).BarFillType = xlDataBarFillSolid
        
        campo2.FormatConditions.AddDatabar
        campo2.FormatConditions(campo2.FormatConditions.Count).ShowValue = True
        campo2.FormatConditions(campo2.FormatConditions.Count).SetFirstPriority
        With campo2.FormatConditions(1)
            .MinPoint.Modify newtype:=xlConditionValueNumber, newvalue:=0
            .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:=minimo
        End With
        With campo2.FormatConditions(1).BarColor
            .ColorIndex = 4
            .TintAndShade = 0
        End With
        campo2.FormatConditions(1).BarFillType = xlDataBarFillSolid
       
        Set dati = Nothing
        Set campo1 = Nothing
        Set campo2 = Nothing
    End Sub
    



  • di Marius44 data: 28/10/2015 08:11:30

    Buongiorno a tutti

    cromagno (che saluto) mi ha fornito l'idea. Purtroppo la versione 2007 di Excel non mi registrare la formattazione condizionale. Pertanto ho approfittato del codice postato per fare un piccolo adattamento (spero migliorativo).
    Quando si clicca sul pulsante Cambia Dati vengono generati 25 numeri differenti ma si perde la formattazione; cliccando su Ripristina tutto torna a posto.

    @DELTAmax
    per le tue necessità puoi eliminare il tasto Cambia Dati ed adattare Range(A1:A25) all'intervallo che ti interessa.

    Grazie cromagno.

    Allego il file. Facci sapere. Ciao,
    Mario



  • di DELTAmax data: 29/10/2015 11:07:02

    Allora...

    Ho provato l'ultimo file e funziona coma avete detto (ci ho messo un po di tempo perche ho dovuto cercare excel che mi permetta le macro)....

    Le barre vengono visualizzate come volevo...

    Il problema sta che non posso mischiare i valore come invece sono nella realta (nel file infatti si hanno prima numeri positivi, poi numeri negativi)...
    A me serve una cosa del tipo:

    300
    280
    100
    25
    -50
    -85
    200
    350
    -500
    ecc ecc....

    E' possibile tramite qualche modifica far si che vengano visualizzate quelle barre anche con i numeri mischiati??...



  • di cromagno data: 29/10/2015 12:28:22

    MA hai visto il file che ti allegato?
    Fa esattamente quello che chiedi (basandomi sulle IMMAGINI che avevi postato).
    Mario (che saluto) l'ha reso "graficamente" più coerente... che credo sia quello che avevi richiesto.
    Potresti provare da solo a "mischiare" i due codici per ottenere il risultato cercato.

    In alternativa.....
    a scanso ulteriori equivoci, allega almeno un immagine che rispecchi esattamente quello che vuoi, altrimenti ogni volta si è costretti a correggere la macro.



  • di cromagno data: 29/10/2015 12:51:06

    Prova a vedere il file allegato "Barre dei Dati - Modifiche".



  • di DELTAmax data: 29/10/2015 13:58:45

    Avevo scaricato l'ultimo file...

    Ora ho scaricato quello che hai appena allegato (modifiche)....

    Non so sul vostro pc, ma sul mio, ogni volta che premo sul secondo pulsante, mi si ordinano tutti i numeri ed è proprio quello che non voglio visto che i numeri, come vi avevo detto sono mischiati e mischiati devono rimanere :) ....

    La prima immagine che avevo messo era solo per farvi capire da che parte deve stare la barra....e quello lo avete capito e siete riusciti a farlo (siete dei maghi :D dovrete spiegarmelo poi :P )....

    Però a me serve che le celle rimangano tali come sono e si aggiunga solo la barra, rossa se positivi, verde se negativi....ma i numeri sono mischiati e non posso riordinarli visto che ognuno ha una data...



  • di cromagno data: 29/10/2015 15:18:29

    Ok, ci riproviamo....
    prova ad utilizzare il codice postato sotto.

    Nel file allegato ("Barre dei Dati - Modifiche 2") ho associato il codice al pulsante:
    "Formatta con "barre dati"…
    Lasciando inalterato l'ordinamento!"
     
    Option Explicit
    Sub barre_dati_2()
    Dim riga As Long, cella As Range
    Dim dati As Range, minimo As Double, massimo As Double
    riga = Range("A1").End(xlDown).Row
    Set dati = Range("A1:A" & riga)
    minimo = Application.WorksheetFunction.Small(dati, 1)
    massimo = Application.WorksheetFunction.Large(dati, 1)
    
    For Each cella In dati
        cella.FormatConditions.AddDatabar
        cella.FormatConditions(cella.FormatConditions.Count).ShowValue = True
        cella.FormatConditions(cella.FormatConditions.Count).SetFirstPriority
        If cella.Value > 0 Then
            With cella.FormatConditions(1)
                .MinPoint.Modify newtype:=xlConditionValueNumber, newvalue:=0
                .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:=massimo
            End With
            With cella.FormatConditions(1).BarColor
                .ColorIndex = 3
                .TintAndShade = 0
            End With
            cella.FormatConditions(1).BarFillType = xlDataBarFillSolid
        Else
            With cella.FormatConditions(1)
                .MinPoint.Modify newtype:=xlConditionValueNumber, newvalue:=0
                .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:=minimo
            End With
            With cella.FormatConditions(1).BarColor
                .ColorIndex = 4
                .TintAndShade = 0
            End With
            cella.FormatConditions(1).BarFillType = xlDataBarFillSolid
        End If
    Next
    Set dati = Nothing
    End Sub
    
    



  • di Marius44 data: 29/10/2015 15:56:23

    Vorrei aggiungere anche la mia macro. La Sub RipristinaDue "legge" il valore della cella ed imposta la barra ed il colore relativo.

    Provare per credere.

    Ciao a tutti,
    Mario
     
    Sub RipristinaDue()
    Dim pos(1 To 25) As Double, neg(1 To 25) As Double, cella As Range
    Dim riga As Long, i As Long, a As Long, b As Long, elenco As Range
    Dim valore As Double, minneg As Double, maxneg As Double, minpos As Double, maxpos As Double
    riga = Range("A1").End(xlDown).Row
    a = 1: b = 1
    For i = 1 To riga
        valore = Cells(i, 1).Value
        If valore > 0 Then      'valori positivi
            pos(a) = valore: a = a + 1
        ElseIf valore <= 0 Then 'valor negativi
            neg(b) = valore: b = b + 1
        End If
    Next i
    minneg = Application.WorksheetFunction.Small(neg(), 1)
    maxneg = Application.WorksheetFunction.Large(neg(), 1)
    minpos = Application.WorksheetFunction.Small(pos(), 1)
    maxpos = Application.WorksheetFunction.Large(pos(), 1)
    Set elenco = Range("A1:A" & riga)
    For Each cella In elenco
        If cella.Value > 0 Then
            cella.FormatConditions.AddDatabar
            cella.FormatConditions(cella.FormatConditions.Count).ShowValue = True
            cella.FormatConditions(cella.FormatConditions.Count).SetFirstPriority
            With cella.FormatConditions(1)
                .MinPoint.Modify newtype:=xlConditionValueNumber, newvalue:=minpos
                .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:=maxpos
            End With
            With cella.FormatConditions(1).BarColor
                .ColorIndex = 4
                .TintAndShade = 0
            End With
        ElseIf cella.Value <= 0 Then
            cella.FormatConditions.AddDatabar
            cella.FormatConditions(cella.FormatConditions.Count).ShowValue = True
            cella.FormatConditions(cella.FormatConditions.Count).SetFirstPriority
            With cella.FormatConditions(1)
                .MinPoint.Modify newtype:=xlConditionValueNumber, newvalue:=maxneg
                .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:=minneg
            End With
            With cella.FormatConditions(1).BarColor
                .ColorIndex = 3
                .TintAndShade = 0
            End With
        End If
    Next
    Set elenco = Nothing
    End Sub
    



  • di cromagno data: 29/10/2015 16:18:50

    Ciao Mario,
    ci avremo azzeccato stavolta?



  • di DELTAmax data: 29/10/2015 21:24:13

    GRANDI... alla fine ci siete riusciti... Vi invidio xD

    Quella di cromagno è proprio quella che volevo io....
    Quella di marius44 è interessante comunque...Però non so se si possa fare, ma la avrei preferita con la sfumatura nell'altro senso, invece che da destra a sinistra, da sinistra a destra....

    Ma entrambe sono quello che volevo io....GRAZIE MILLE....

    Ora c'è il problema di aggiungerla al mio file xD...

    Mi spiegate quali parametri devo modificare per cambiare la colonna (o il range di celle) da formattare??...
    Ed inoltre avrei bisogno che la cosa sia automatica, ma andiamo per step



  • di Marius44 data: 29/10/2015 22:15:48

    Bene. Sono (siamo, cromagno ed io) contenti che finalmente hai risolto.
    Il verso della "sfumatura" che sia l'unica cosa che non si può cambiare, al massimo puoi mettere le cifre a sinistra (ma non mi piace).
    Visto che hai trovato la soluzione, per favore, spunta RISOLTA. Grazie.
    Ciao, Mario



  • di DELTAmax data: 30/10/2015 01:18:12

    Ma non abbiamo finito xD

    Ok, ho cambiato i parametri per cambiare la colonna (o il range di celle) da formattare (diciamo nella macro di cromagno visto che nell'altra non si puo modificare la direzione)...

    Però ora avrei bisogno che la cosa sia automatica, tipo al cambio di una cella all'interno del foglio (diciamo una qualsiasi cella nella colonna "C" e "G", vorrei che parta in automatico la macro per visualizzare le barre (l'ultima di cromagno)(nel mio file colonna "K")...

    Come devo fare??...



  • di cromagno data: 30/10/2015 15:46:14

    DELTAmax
    se avessi specificato da subito cosa volevi (cosa che non hai ancora fatto... i FILE allegati sono solo i miei e di Mario), magari il tuo quesito sarebbe risolto da tempo e non ci sarebbe stato bosogno di modificarlo in continuazione!

    Fino a domani non ho un pc a portata di mano, solo cell.
    Per "automatizzare" la macro la devi collegare ad un evento e precisamente nel tuo caso dovrebbe bastare "Worksheet_Change" nel foglio dove devi eseguire la macro (modulo di classe per intenderci) ed alla colonna interessata...

    @Mario
    credo si possa modificare la sfumatura con l'oggetto "ColorStop" e la proprietà della fomattazione "Gradiente"... e "Degree"...:ma avevo solo letto qualcosa al riguardo, dovrei rivedermi tutto l'argomento. Se hai voglia e tempo.. io fino a domani non credo.



  • di Marius44 data: 30/10/2015 16:14:54

    @cromagno
    Ben detto.

    @DELTAmax
    Non capisco cosa intendi per "cambiare direzione alle sfumature"
    Sia le barre di cromagno sia le mie vanno da Sx a sfumare verso Dx. Io non so fare di meglio. Prova a "leggerti qualcosa in merito" e provaci tu.
    Non è uno sfogo nè un richiamo. Prendilo come invito.

    Ciao,
    Mario



  • di Marius44 data: 30/10/2015 22:07:11

    La disponibilità del Forum è sempre massima.
    Bisogna, però, fare delle premesse (e parlo a nome personale):
    a) il Forum è un'occasione per scambiarsi idee e progetti; l'uno impara dall'altro e viceversa. Se vuoi la "pappa pronta" non è nel Forum che devi cercare ma devi rivolgerti a dei professionisti, che paghi e ti danno quel che vuoi;
    b) se dici "per intero" quello che vuoi, magari allegando un tuo file coi tentativi fatti e con la soluzione attesa, forse, e ripeto forse, puoi ottenerlo anche in meno di due giorni;
    c) quando affermi che "non hai detto tutto subito altrimenti ci spaventavamo" dimostri di aver poca fiducia nel Forum e nei suoi componenti;
    d) se fai un piccolo sforzo, leggendo, impegnandoti e dimostrando a chi ti offre aiuto che ti stai "dando da fare", a poco a poco impari anche tu. Ma cosa pensi che noi si sia nati "imparati"?
    Un'ultima cosa: non so come si faccia a "girare" la barra sfumata! Una soluzione potrebbe essere quella di mettere i numeri a sinistra e non a destra. Comunque, al di là di quel ho detto sopra, tento ma non ti assicuro la soluzione.

    Ciao,
    Mario




  • di isy data: 31/10/2015 09:09:41

    Ciao Marius

    Cit: il Forum è un'occasione per scambiarsi idee e progetti; l'uno impara dall'altro e viceversa.

    Un esempio per la sfumatura delle barre mediante un grafico
    Allegato Change-with-chart.xlsx



  • di Marius44 data: 31/10/2015 12:45:16

    @isy
    Come sempre, molte gentile. Grazie.
    Però, visto che trattasi di Formattazione condizionale (non so se hai visto il mio file) e non di un Grafico, non riesco a "rovesciare" la sfumatura.
    Tieni presente che utilizzo la versione 2007 che:
    a) non mi fa usare il registratore di macro per la FC
    b) "vedo" che dovrei usare Styles("Stile 1") ma non trovo la formula giusta per inserirlo nella macro.

    Ma non demordo. Devo spuntarla. Grazie ancora e ciao,
    Mario



  • di Marius44 data: 01/11/2015 16:15:20

    Dopo approfondite ricerche ho appurato (ma spero di essere smentito) che con la versione Excel2007 NON E' POSSIBILE invertire la direzione del colore in DataBar per Formattazione Condizionale.
    Dalle versioni successive nella finestra di dialogo relativa a Barra dei Dati c'è l'opzione per l'inversione.
    Ho tentato di aggirare l'ostacolo appoggiandomi a VBA con esito, purtroppo, negativo.

    Ciao a tutti,
    Mario



  • di isy data: 01/11/2015 16:42:12

    Ciao Mario

    Con Excel 2013 puoi effettivamente invertire la direzione del colore, ma a partire dalla posizione destra della cella.
    Solo un grafico può mostrare i dati come "richiesto"



  • di cromagno data: 01/11/2015 16:49:42

    Ciao Mario,
    io ho la versione 2013 e c'è solo l'inversione della direzione della barra ma non della sfumatura

    Comunque provo ancora a cercare qualche escamotage...

    [EDIT]
    Scusa isy, non avevo visto la tua risposta. Comunque confermo quanto hai scritto.



  • di cromagno data: 01/11/2015 21:17:55

    Ciao a tutti,
    Avrei trovato un scappatoia per ottenere la sfumatura inversa... sembra che funzioni ma è da controllare (prima mi dava errori strani se modificavo un valore della colonna A)

    Nel foglio che allego ("Barre dei Dati - Modifiche 3"):
    Ci dovrebbe essere sia la sfumatura inversa che l'avvio del codice al cambiamento di un valore nella colonna A.
     
    Per l'evento Change del Foglio1:
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim riga As Long, dati As Range
    riga = Range("A1").End(xlDown).Row
    Set dati = Range("A1:A" & riga)
    
    If Range("Z1").Value = 1 Then Exit Sub
    If Not Intersect(dati, Target) Is Nothing Then
        Call barre_dati_2
    End If
    End Sub
    
    
    Per la sfumatura inversa:
    
    Option Explicit
    Sub barre_dati_2()
    Dim riga As Long, cella As Range
    Dim dati As Range, minimo As Double, massimo As Double
    Dim objColorStop As ColorStop
    Dim colore2 As Double, colore3 As Double
    riga = Range("A1").End(xlDown).Row
    Set dati = Range("A1:A" & riga)
    minimo = Application.WorksheetFunction.Small(dati, 1)
    massimo = Application.WorksheetFunction.Large(dati, 1)
    
    For Each cella In dati
        If cella.Value > 0 Then
            colore2 = cella.Value / massimo
            colore3 = colore2 + 0.0001
            cella.Interior.Pattern = xlPatternLinearGradient
            cella.Interior.Gradient.Degree = 0
            cella.Interior.Gradient.ColorStops.Clear
            If colore2 = 1 Then
                'creates a colorstop object with the position 0
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(0)
                'changes its color to the first color
                objColorStop.Color = vbWhite
                'creates a colorstop object with the position 1
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(1)
                'changes its color to the second color
                objColorStop.Color = vbRed
            Else
                'creates a colorstop object with the position 0
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(0)
                'changes its color to the first color
                objColorStop.Color = vbWhite
                'creates a colorstop object with the position 1
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(colore2)
                'changes its color to the second color
                objColorStop.Color = vbRed
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(colore3)
                'changes its color to the second color
                objColorStop.Color = vbWhite
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(1)
                'changes its color to the second color
                objColorStop.Color = vbWhite
            End If
        Else
            colore2 = -cella.Value / -minimo
            colore3 = colore2 + 0.0001
            cella.Interior.Pattern = xlPatternLinearGradient
            cella.Interior.Gradient.Degree = 0
            cella.Interior.Gradient.ColorStops.Clear
            If colore2 = 1 Then
                'creates a colorstop object with the position 0
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(0)
                'changes its color to the first color
                objColorStop.Color = vbWhite
                'creates a colorstop object with the position 1
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(1)
                'changes its color to the second color
                objColorStop.Color = vbGreen
            Else
                'creates a colorstop object with the position 0
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(0)
                'changes its color to the first color
                objColorStop.Color = vbWhite
                'creates a colorstop object with the position 1
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(colore2)
                'changes its color to the second color
                objColorStop.Color = vbGreen
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(colore3)
                'changes its color to the second color
                objColorStop.Color = vbWhite
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(1)
                'changes its color to the second color
                objColorStop.Color = vbWhite
            End If
        End If
    Next
    
    Set dati = Nothing
    Set objColorStop = Nothing
    End Sub
    



  • di DELTAmax data: 02/11/2015 01:29:45

    WOW....

    Dovete spiegarmi come fate a fare questi codici perchè io, cerca di qua e cerca di la, non trovo mai niente....
    Ho cercato tutta ieri (non avevo visto le risposte) un codice per fare partire la macro in automatico e non ho trovato niente.... Perfino bloccare le celle ho difficolta perche mi da sempre errore run time 1004 e non so dove battere la testa....

    Preferivo la prima "grafica" delle barre di cromagno, apparte la sfumatura, ma domani do un occhio a quel codice e provo a vedere di adattarlo sul mio foglio di lavoro...

    Poi non sbatteteci troppo la testa, se mi dite che è troppo difficile fa niente....almeno sono riuscito ad avere la direzione delle barre come volevo...

    Domani provo il codice....
    Ma dovete dirmi dove trovare tutte quelle informazioni che io non riesco a trovare da nessuna parte...



  • di Marius44 data: 02/11/2015 07:29:36

    @cromagno
    Ciao Tore,
    sto studiando il tuo codice per vedere se, applicando il metodo da te utilizzato, posso ottenere qualcosa con Excel2007.
    Mi sono accorto di tre cose:
    1°) qualche riga (non sempre ma talvolta) pur avendo un valore significativo rimane senza la formattazione;
    2°) le righe dalla 24ma alla 10850ma presentano una piccola colorazione in verde a sinistra;
    3°) la riga 10851ma ha una formattazione sfumata (destra->sinistra) nera/bianca.
    Non mi spiego da cosa dipenda. Le celle non hanno alcuna formattazione condizionale, non hanno colori di sfondo, "sembra" non abbiano nulla di nulla. E allora?

    Ciao,
    Mario



  • di DELTAmax data: 02/11/2015 10:29:23

    Allora....

    Ho inserito tutto il seguente codice sul foglio di lavoro 1, ma non mi aggiorna i dati in automatico (formattazione condizionale della colonna L) quando inserisco un valore in una qualsiasi cella della colonna C (a partire da C5), ma lo fa soltanto se carico la Sub Barredati su un pulsante e uso quello....
    E' sbagliato il codice??... secondo voi cosa non va??...

    La parte automatica è quella di cromagno... 
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim riga As Long, dati As Range
    riga = Range("C5").End(xlDown).Row
    Set dati = Range("C5:C" & riga)
    
    If Range("Z1").Value = 1 Then Exit Sub
    If Not Intersect(dati, Target) Is Nothing Then
        Call barredati
    End If
    
    
    Rem COPIA I RISULTATI DELLA COLONNA "K" NELLA COLONNA "L" ALLA MODIFICA DI UNA CELLA POSTA NELLE COLONNE "C" E "G" SOLO NELLA RIGA DOVE "C" E "G" SONO SCRITTE
    
        Dim i As Long
        Dim ur As Long
        ur = Sheets("Foglio1").Range("K" & Rows.Count).End(xlUp).Row
        If Not Intersect(Target, Range("c5:c" & ur, "g5:g" & ur)) Is Nothing Then
          For i = 5 To ur
             Range("L" & i).Value = Range("K" & i).Value
          Next i
        End If
    End Sub
    
    --------------------------------------------------
    
    Sub barredati()
    Rem VISUALIZZA LA FORMATTAZIONE CONDIZIONALE NELLA COLONNA "L" IN BASE AI VALORI SCRITTI (VERDE NEGATIVI, ROSSO POSITIVI) CON PARTENZA DA SINISTRA E LUNGHEZZA VARIABILE IN BASE ALLA GRANDEZZA DEL SOLO NUMERO (SENZA SEGNO -)
    
    Dim riga As Long, cella As Range
    Dim dati As Range, minimo As Double, massimo As Double
    riga = Range("L5").End(xlDown).Row
    Set dati = Range("L5:L" & riga)
    minimo = Application.WorksheetFunction.Small(dati, 1)
    massimo = Application.WorksheetFunction.Large(dati, 1)
    
    For Each cella In dati
        cella.FormatConditions.AddDatabar
        cella.FormatConditions(cella.FormatConditions.Count).ShowValue = True
        cella.FormatConditions(cella.FormatConditions.Count).SetFirstPriority
        If cella.Value > 0 Then
            With cella.FormatConditions(1)
                .MinPoint.Modify newtype:=xlConditionValueNumber, newvalue:=0
                .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:=massimo
            End With
            With cella.FormatConditions(1).BarColor
                .ColorIndex = 3
                .TintAndShade = 0
            End With
            cella.FormatConditions(1).BarFillType = xlDataBarFillSolid
        Else
            With cella.FormatConditions(1)
                .MinPoint.Modify newtype:=xlConditionValueNumber, newvalue:=0
                .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:=minimo
            End With
            With cella.FormatConditions(1).BarColor
                .ColorIndex = 4
                .TintAndShade = 0
            End With
            cella.FormatConditions(1).BarFillType = xlDataBarFillSolid
        End If
    Next
    Set dati = Nothing
    End Sub



  • di cromagno data: 02/11/2015 11:37:40

    Buongiorno,
    @Mario
    come ti dicevo, inizialmente mi dava alcuni errori che non capivo e non riuscivo a sistemare, uno dei quali era un errore "Troppi Formati di celle diversi" (l'errore dava una sfumatura nera e bianca come descritto da te.

    Ho provato a mettere numeri oltre la riga 11000 e mi dava la cella "nera e bianca" (naturalmente con errore nel codice) se il valore della cella era uguale a zero.
    Quindi ho aggiunto una condizione per il valore uguale a zero (il pezzo evidenziato nel codice sotto).

    Per gli altri "errori" non saprei... ho provato ma non li ho riscontrati
     
         'changes its color to the second color
                objColorStop.Color = vbWhite
                Set objColorStop = cella.Interior.Gradient.ColorStops.Add(1)
                'changes its color to the second color
                objColorStop.Color = vbWhite
            End If
       ElseIf cella.Value = 0 Then
            cella.Interior.Color = vbWhite
    Else colore2 = -cella.Value / -minimo colore3 = colore2 + 0.0001 cella.Interior.Pattern = xlPatternLinearGradient cella.Interior.Gradient.Degree = 0 cella.Interior.Gradient.ColorStops.Clear



  • di cromagno data: 02/11/2015 11:51:39

    @DELTAmax
    non vuoi proprio allegarlo il tuo file eh?!?

    Questo pezzo di codice (parte iniziale di quello postato da te):
    If Range("Z1").Value = 1 Then Exit Sub

    lo usavo per un mio controllo nel foglio che ho allegato (ed è legato alla routine "cambio" - codice postato sotto). Non so se a te serva realmente...

    Per quanto riguarda il tuo problema, l'errore potrebbe essere questa dichiarazione di range all'interno di "intersect":
    Range("c5:c" & ur, "g5:g" & ur)

    dovresti creare una variabile che comprenda quei due range e utilizzare quella.
    Esempio:
    chiami la variabile "unione":
    Dim unione as Range
    set unione = Union(Range("c5:c" & ur), Range("g5:g" & ur))


    e quindi scriverai:
    If Not Intersect(Target, unione) Is Nothing Then

    ma come ti ho già detto, sarebbe meglio vedere il tuo file.

     
    Sub cambio()
    Dim campo As Range, cella As Range, negativo As Integer, positivo As Integer
    
    Set campo = Range("A1:A23")
    Range("Z1").Value = 1
    campo.Clear
    For Each cella In campo
        negativo = Rnd() * (600)
        positivo = Rnd() * (600)
        cella.Value = positivo - negativo
    Next
    Range("Z1").Value = 0
    Set campo = Nothing
    End Sub


  • Link per "colorstop"
    di cromagno data: 02/11/2015 12:00:19

    Questo è il link dove ho preso spunto per le sfumature:
    h t t p://software-solutions-online.com/excel-vba-gradients-colors/



  • di cromagno data: 02/11/2015 12:01:23

    @DELTAmax
    non vuoi proprio allegarlo il tuo file eh?!?

    Questo pezzo di codice (parte iniziale di quello postato da te):
    If Range("Z1").Value = 1 Then Exit Sub

    lo usavo per un mio controllo nel foglio che ho allegato (ed è legato alla routine "cambio" - codice postato sotto). Non so se a te serva realmente...

    Per quanto riguarda il tuo problema, l'errore potrebbe essere questa dichiarazione di range all'interno di "intersect":
    Range("c5:c" & ur, "g5:g" & ur)

    dovresti creare una variabile che comprenda quei due range e utilizzare quella.
    Esempio:
    chiami la variabile "unione":
    Dim unione as Range
    set unione = Union(Range("c5:c" & ur), Range("g5:g" & ur))


    e quindi scriverai:
    If Not Intersect(Target, unione) Is Nothing Then

    ma come ti ho già detto, sarebbe meglio vedere il tuo file.
     
     
    Sub cambio()
    Dim campo As Range, cella As Range, negativo As Integer, positivo As Integer
    
    Set campo = Range("A1:A23")
    Range("Z1").Value = 1
    campo.Clear
    For Each cella In campo
        negativo = Rnd() * (600)
        positivo = Rnd() * (600)
        cella.Value = positivo - negativo
    Next
    Range("Z1").Value = 0
    Set campo = Nothing
    End Sub



  • di DELTAmax data: 03/11/2015 01:48:21

    Ho creato un file uguale al mio, pure con gli stessi difetti xD
    Lo trovi in allegato come: copia per cromagno

    Il foglio è lentissimo ad ogni aggiornamento che fa in automatico e le barre dati sulla destra si aggiornano in modo esatto solo premendo il bottone "aggiorna barre dati"....

    Inoltre non capisco perchè io non possa aprirlo direttamente dall'icona, ma solo dal programma excel...all'avvio con l'icona comincia a fare il salvataggio del file di backup impostato come workbook_open (che sono riuscito a trovare e modificare secondo mie necessita) e li continua all'infinito.....

    Non c'è un modo per semplificare anche questa cosa??....
    Inoltre devo ancora provare a modificare la parte automatica come hai detto....
    Ormai ho troppe richieste eh??... :(

    Il messaggio precedente era:
    " Ho inserito tutto il seguente codice sul foglio di lavoro 1, ma non mi aggiorna i dati in automatico (formattazione condizionale della colonna L) quando inserisco un valore in una qualsiasi cella della colonna C (a partire da C5), ma lo fa soltanto se carico la Sub Barredati su un pulsante e uso quello....
    E' sbagliato il codice??... secondo voi cosa non va??...

    La parte automatica è quella di cromagno... "


    Ps: la colonna "L" è una copia della colonna "K" che è nascosta e contiene le formule....
    PPS: perchè poi mi da errore quando blocco tutto il foglio lasciando scrivere solo sulle colonne "C" e "G"??... non è che sia perche nelle altre ci sono formule che cambiano i valori all'interno??...



  • di cromagno data: 03/11/2015 20:42:14

    Ciao DELTAmax,
    diciamo che c'era un pò di casino
    Non capisco il codice che hai messo all'apertura del file, magari è impostato male il "loop" ma non sapendo quello che devi fare l'ho lasciato inalterato.

    Era lento perchè come richiamo della macro avevi messo la modifica della colonna "L". La macro per la formattazione agisce proprio in quella colonna, quindi ad ogni sua modifica ripartiva sempre.

    Per la password devi usare "Unprotect" e "Protect" all'interno della macro "barredati" (ma anche all'interno del codice in "Foglio1", visto che effettui un cambiamento nella colonna "K"), in modo che prima di apportare delle modifiche, la macro sprotegga il foglio e una volta finito mette di nuovo la protezione.
    Per le prove ho utilizzato come password = cromagno

    Ti lascio il file in allegato ("Barre Dati - Copia per cromagno").



  • di DELTAmax data: 04/11/2015 14:48:47

    Ok grazie...

    "diciamo che c'era un pò di casino
    Non capisco il codice che hai messo all'apertura del file, magari è impostato male il "loop" ma non sapendo quello che devi fare l'ho lasciato inalterato."

    Il codice all'apertura del file è la parte che dicevo che fa il backup all'apertura ed ogni tot di tempo (ora impostato su 1 min) [If Minute(DataFinale - DataIniziale) = 1 Then]

    Una cosa strana e che non mi piace è che mi salva anche il file che sto usando....per cui se sbaglio e devo chiudere senza salvare non posso piu perche viene salvato in automatico anche il file in uso.... si puo porre rimedio secondo te??...ti risulta??...



  • di cromagno data: 04/11/2015 21:37:11

    Se il problema è solo che non vuoi che ti salvi anche il file aperto ma ti faccia solo una copia di salvataggio ogni minuto.... ti basta eliminare la riga:
    ActiveWorkbook.Save

    Quindi il codice sarebbe quello postato sotto.

    P.S.
    Ma quindi non lo hai scritto tu quel codice?!?
     
    Private Sub Workbook_Open()
    Rem SALVATAGGIO COPIA BACKUP SU CARTELLA SCRITTA SU NOMEDESTINAZIONE
        
        Dim prova As Boolean
        Dim DataIniziale As Date
        Dim DataFinale As Date
        prova = False
        DataIniziale = Now
        Do Until prova
        DoEvents
        DataFinale = Now
        If Minute(DataFinale - DataIniziale) = 1 Then
        DataIniziale = Now
        Dim NomeOrigine As String
        Dim NomeDestinazione As String
        NomeOrigine = Left(ActiveWorkbook.Name, (Len(ActiveWorkbook.Name) - 4))
        NomeDestinazione = "C:Backup da ExcelBackup file per cromagno" & "_" & Day(Date) & "-" & Format(Month(Date), "00") & "-" & Year(Date) & "_" & Format(Hour(Time), "00") & "." & Format(Minute(Time), "00") & ".xls"
        ActiveWorkbook.SaveCopyAs NomeDestinazione
        End If
        Loop
    End Sub



  • di DELTAmax data: 04/11/2015 23:54:53

    No...come ti ho gia detto io non sono in grado di scrivere codici così complicati...purtroppo :( ....

    Ho cercato il codice sulla rete e lo ho modificato per farlo andare bene al mio file, se dovessi imparare di sana pianta a fare codici così, forse nell'anno 3500ac avro finito il file come vorrei xD

    Non so dove cercare le informazioni se non chiedendo o copiando i codici che trovo sulla rete e modificandoli finche non mi vanno bene incorporando altre parti di altri codici....

    Ad esempio, volevo chiederti come si fa ad aggiungere due operazioni diverse ad un evento tipo "Sub Workbook_Open()"...

    Ho provato a scrivere i codici prima della chiusura con end sub, ma mi da sempre errore....poi ho visto che tu in un codice hai messo un next...centra qualcosa??...mi potresti dire dove trovare qualche informazione in piu per capire questi codici e come sono strutturati??...

    L'ho richiesto piu di una vota, ma non ho ricevuto risposta...ho visto il link che avevi postato, ma mi chiedevo se c'era qualcosa di simile anche in italiano....



  • di cromagno data: 05/11/2015 00:26:51

    Ciao,
    non hai ottenuto risposte dirette perchè non ci sono risposte dirette.. bisogna partire dall'inizio.

    Anche io sono agli inizi (ho vari libri ma devo confessare di aver letto solo le prime pagine) e di volta in volta imparo qualcosa sui forum (tipo questo), provando a scrivere codici aiutandomi con il "registratore di macro", etc....
    Ma per prima cosa devi sapere almeno le basi.
    Online ci sono una marea di guide.
    Per iniziare ti posso consigliare questa:
    h t tp://excelvba.altervista.org/Corso/Indice.html

    o questa:
    h t tp://forum.wintricks.it/showthread.php?t=155252

    Per quanto riguarda la tua domanda:
    cit.
    "volevo chiederti come si fa ad aggiungere due operazioni diverse ad un evento tipo "Sub Workbook_Open()"... "

    non ho capito cosa intendi fare
    ma di sicuro non ti serve il "Next" (serve per i cicli... argomento che puoi trovare nelle guide che ti ho indicato).



  • di DELTAmax data: 05/11/2015 01:03:28

    grazie mille....

    Appena riesco comincio a guardare....

    Per la domanda che ti ho fatto intendevo dire che se io volessi eseguire piu operazioni, tipo all'apertura del file, non so come fare a scrivere la prima operazione e poi proseguire con un altra operazione (intese come codici), se io lascio solo uno spazio tra una e l'altra (per capire la fine di una e l'inizio dell'altra) mi da sempre errore perche evidentemente manca qualche comando che colleghi le due o piu operazioni....

    tipo....

    Sub Workbook_Open()"
    esegui operazione 1

    esegui operazione 2
    end sub

    Se io scrivo una cosa del genere senza scrivere niente tra operazione 1 e 2, mi da errore....

    Ps: vado a letto... ho 4 ore di sonno



  • di cromagno data: 05/11/2015 01:22:29

    Ciao,
    l'esempio che hai fatto è esattamente come si comporta un codice in esecuzione...
    cioè, fino a quando non incontra "End Sub" eseguirà in successione tutte le istruzioni che scrivi.
    Se invece, hai già fatto delle macro in alcuni moduli (es. "Macro1" e "Macro2"), se le vuoi eseguire una di seguito all'altra sempre al verificarsi di un evento (es. "Workbook_Open"), non farai altro che richiamare quelle due macro :
     
    Private Sub Workbook_Open()
    Call Macro1
    Call Macro2
    End Sub