MsgBox con valori



  • MsgBox con valori
    di Langdon74 (utente non iscritto) data: 30/01/2015 10:30:57

    Buongiorno a tutti, in una colonna ho un elenco di numeri, alcuni hanno la cella di colore rosso, volevo sapere come fare ad avere una msgbox che mi mostri solo i valori delle celle che hanno il colore rosso.

    Grazie mille



  • di Vecchio Frac data: 30/01/2015 10:56:58

    Il colore rosso è applicato a mano o attraverso una formattazione condizionale?




  • MsgBox con valori
    di Langdon74 (utente non iscritto) data: 30/01/2015 11:07:43

    attraverso una formattazione condizionale



  • di Lucas87 data: 30/01/2015 12:10:12

    Ciao
    Quale è la condizione della formattazione condizionale che colora di rosso le celle?



  • di Vecchio Frac data: 30/01/2015 14:42:24

    Io suggerisco una soluzione un po' complessa, tratta dal sito di cpearson.com, adattata per quanto riguarda la richiesta (l'ultima Function che ho chiamato "CellsByCFColorIndex" fa tutto).
    Utilizzo:
    MsgBox CellsByCFColorIndex(Range("B:B"), 3)
    mostra in una finestra di messaggio le celle che soddisfano la condizione e che si tingono di rosso, insieme ai valori che contengono.

    In Excel 2007 e superiori c'è la possibilità di utilizzare Trova le celle con formattazione condizionale, ma si limita a evidenziare le celle con formattazione mentre tu vuoi un report più completo.
     
    Option Explicit
    
    Function ActiveCondition(Rng As Range) As Integer
    Dim i As Long
    Dim FC As FormatCondition
    Dim Temp As Variant
    Dim Temp2 As Variant
    
        If Rng.FormatConditions.Count = 0 Then
            ActiveCondition = 0
        Else
            For i = 1 To Rng.FormatConditions.Count
                Set FC = Rng.FormatConditions(i)
                Select Case FC.Type
                    Case xlCellValue
                    Select Case FC.Operator
                        Case xlBetween
                            Temp = GetStrippedValue(FC.Formula1)
                            Temp2 = GetStrippedValue(FC.Formula2)
                            If IsNumeric(Temp) Then
                               If CDbl(Rng.Value) >= CDbl(FC.Formula1) And _
                                   CDbl(Rng.Value) <= CDbl(FC.Formula2) Then
                                   ActiveCondition = i
                                   Exit Function
                               End If
                           Else
                              If Rng.Value >= Temp And _
                                 Rng.Value <= Temp2 Then
                                 ActiveCondition = i
                                 Exit Function
                              End If
                           End If
        
                        Case xlGreater
                            Temp = GetStrippedValue(FC.Formula1)
                            If IsNumeric(Temp) Then
                               If CDbl(Rng.Value) > CDbl(FC.Formula1) Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            Else
                               If Rng.Value > Temp Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            End If
        
                        Case xlEqual
                            Temp = GetStrippedValue(FC.Formula1)
                            If IsNumeric(Temp) Then
                               If CDbl(Rng.Value) = CDbl(FC.Formula1) Then
                                   ActiveCondition = i
                                   Exit Function
                               End If
                            Else
                               If Temp = Rng.Value Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            End If
        
        
                        Case xlGreaterEqual
                            Temp = GetStrippedValue(FC.Formula1)
                            If IsNumeric(Temp) Then
                               If CDbl(Rng.Value) >= CDbl(FC.Formula1) Then
                                   ActiveCondition = i
                                   Exit Function
                               End If
                            Else
                               If Rng.Value >= Temp Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            End If
        
                       
                        Case xlLess
                            Temp = GetStrippedValue(FC.Formula1)
                            If IsNumeric(Temp) Then
                                If CDbl(Rng.Value) < CDbl(FC.Formula1) Then
                                   ActiveCondition = i
                                   Exit Function
                                End If
                            Else
                                If Rng.Value < Temp Then
                                   ActiveCondition = i
                                   Exit Function
                                End If
                            End If
        
                        Case xlLessEqual
                            Temp = GetStrippedValue(FC.Formula1)
                            If IsNumeric(Temp) Then
                               If CDbl(Rng.Value) <= CDbl(FC.Formula1) Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            Else
                               If Rng.Value <= Temp Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            End If
        
        
                        Case xlNotEqual
                            Temp = GetStrippedValue(FC.Formula1)
                            If IsNumeric(Temp) Then
                               If CDbl(Rng.Value) <> CDbl(FC.Formula1) Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            Else
                               If Temp <> Rng.Value Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            End If
        
                       Case xlNotBetween
                            Temp = GetStrippedValue(FC.Formula1)
                            Temp2 = GetStrippedValue(FC.Formula2)
                            If IsNumeric(Temp) Then
                               If Not (CDbl(Rng.Value) <= CDbl(FC.Formula1)) And _
                                  (CDbl(Rng.Value) >= CDbl(FC.Formula2)) Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            Else
                               If Not Rng.Value <= Temp And _
                                  Rng.Value >= Temp2 Then
                                  ActiveCondition = i
                                  Exit Function
                               End If
                            End If
                     
                       Case Else
                            Debug.Print "UNKNOWN OPERATOR"
                   End Select
        
        
                Case xlExpression
                    If Application.Evaluate(FC.Formula1) Then
                       ActiveCondition = i
                       Exit Function
                    End If
        
                Case Else
                    Debug.Print "UNKNOWN TYPE"
               End Select
        
            Next
        
        End If
        
        ActiveCondition = 0
    
    End Function
     
    
    
    Function GetStrippedValue(CF As String) As String
        Dim Temp As String
        If InStr(1, CF, "=", vbTextCompare) Then
           Temp = Mid(CF, 3, Len(CF) - 3)
           If Left(Temp, 1) = "=" Then
               Temp = Mid(Temp, 2)
           End If
        Else
           Temp = CF
        End If
        GetStrippedValue = Temp
    End Function
    
    
    Function CellsByCFColorIndex(InRange As Range, CI As Integer) As String
    Dim Count As Long
    Dim cell As Range
    Dim FCNum As Integer
    Dim s As String
    
        For Each cell In InRange.Cells
            FCNum = ActiveCondition(cell)
            If FCNum > 0 Then
                s = s & cell.Address & " = " & cell & vbCrLf
            End If
        Next
        
        CellsByCFColorIndex = s
    End Function
    






  • di Lucas87 data: 30/01/2015 15:49:52

    Ciao
    Io pensavo a una cosa un po' più semplice. Il codice sotto verifica la condizione della formattazione condizionale e indica i valori delle celle che la soddisfano. Il controllo però è indipendente dalla formattazione condizionale.
     
    For i = 1 To Range("h" & Rows.Count).End(xlUp).Row
        If Cells(i, 8) < Cells(i, 11) Then
            tex = tex & vbCrLf & Cells(i, 8)
        End If
    Next
    MsgBox "Le celle rosse sono:" & tex



  • di Vecchio Frac data: 30/01/2015 16:08:17

    Buona pensata, perché aggiri il problema applicandolo al caso concreto di Langdon74.
    In pratica verifichi la condizione da lui impostata nella formattazione condizionale, e ci può stare benissimo perché gli dà una soluzione concreta.
    Io cercavo una cosa più generica e adattabile ad ogni caso senza conoscere a priori le condizioni della formattazione (funziona anche nel caso che le condizioni impostate siano multiple).




  • MsgBox con valori
    di Langdon74 (utente non iscritto) data: 04/02/2015 15:38:57

    Ragazzi scusatemi ma sono un novello, entrambi i codici, per avere una msgbox dove devo inserirli?
    Mi potete fare un esempio per favore?

    Grazie mille



  • di Vecchio Frac data: 04/02/2015 20:14:33

    Apri l'editor di codice (Alt-F11), accedi alla finestra dei progetti (Ctrl-R), individua il Foglio1 (quello che vuoi testare), facci due volte clic sinistro, si apre una pagina di codice tutta bianca, si chiama area codice del foglio; incolla in quest'area il codice di Lucas87 (che è semplificato rispetto al mio e va bene per imparare) che ti riporto sotto incastonato in una sub. Torna a Excel (Alt-F11) quindi avvia la macro (Alt-F8 ed esegui "test")
     
    option explicit
    
    sub test
    dim i as long, tex as string
    
        For i = 1 To Range("h" & Rows.Count).End(xlUp).Row
            If Cells(i, 8) < Cells(i, 11) Then
                tex = tex & vbCrLf & Cells(i, 8).address & " --> " & cells(i, 8)
            End If
        Next
        MsgBox "Le celle rosse sono queste: " & tex
    end sub





  • MsgBox con valori
    di Langdon74 (utente non iscritto) data: 05/02/2015 08:49:53

    mi dà una intera colonna, ma poi non riesco a sapere se alla fine continua, come posso fare?


  • MsgBox con valori
    di Langdon74 (utente non iscritto) data: 05/02/2015 09:31:01

    scusate ragazzi, un'altra cosa, vorrei far in modo da concatenare due celle che hanno un contenuto.
    In pratica mi dovrebbe uscire una msgbox tipo così: Descrizione Cella A ------- Limoni Cella C = Pz. 5
    sempre e solo se la cella è di colore rosso

    mi aiutate per favore?


  • MsgBox con valori
    di Langdon74 (utente non iscritto) data: 06/02/2015 15:38:30

    Ragazzi scusate, non c'è nessuno che puo' aiutarmi?



  • di Vecchio Frac data: 06/02/2015 15:45:20

    La stringa di ritorno (nel msgbox) è lunghissima perchè probabilmente ci sono tantissime celle a zero.
    Forse vuoi escludere queste celle dal conteggio.
    Sul far comparire altre informazioni nel messaggio, ti è chiaro nel dettaglio cosa fa il codice proposto? secondo me se ci pensi un attimo sei in grado anche tu di apportare la modifica richiesta ;)
    Comunque puoi anche allegare un pezzo di file (non un'immagine) con dei dati di esempio in modo da riprodurre la tua situazione.