un Range promiscuo



  • un Range promiscuo
    di Textomb data: 06/03/2013 23:47:57

    Salve a tutti,
    vorrei capire come procedere nel caso avessi l'esigenza di costruirmi un intervallo Range formato da celle che sono localizzate all'interno di una tabella (TotalRange) ma posizionate in righe e colonne diverse.
    Per semplicità ipotizziamo di dover effettuare dei cicli in un range costituito da celle che hanno tutte il colore di fondo giallo. ColorIndex=6 e sono tutte nella tabella TotalRange
    Il codice postato funziona se le celle con il colore giallo non sono oltre 45. Dopo mi da errore...
    Ma se le celle in giallo fossero più di 45, come nel mio caso (122) ? Come si procede in questo caso????


     
    Sub YellowRange()
    Dim TotalRange As Range, MyYellowRange As Range, cell As Range, i As Byte, matrixY() As String
    
    Set TotalRange = Range("a1").CurrentRegion
    i = 1
    For Each cell In TotalRange
    If cell.Interior.ColorIndex = 6 Then
    ReDim Preserve matrixY(1 To i)
    matrixY(i) = cell.Address
    i = i + 1
    End If
    Next
    
    ' Assegno a MyYellowRange il Range con solo le celle in giallo.
    Set MyYellowRange = Range(Join(matrixY, ","))
    
    For Each cell In MyYellowRange
    '---- ecc ecc
    Next
    
    
    End Sub
    



  • di Vecchio Frac data: 07/03/2013 14:58:48

    Sai qual è il problema?
    La lunghezza della stringa risultante da Join :)
    Dopo 44 celle gialle, la stringa che assegni a MyYellowRange con
    Join(matrixY, ",")
    eccede i 255 caratteri e quindi il limite imposto da VBA per la costruzione del Range.
    Magari bisogna passare da Union, adesso vedo come fare.





  • di Vecchio Frac data: 07/03/2013 15:17:09

    Ho modificato il codice come segue, vedi se ti può servire perlomeno l'idea (ho utilizzato Union).
     
    Sub YellowRange()
    Dim TotalRange As Range, MyYellowRange As Range, cell As Range, i As Byte, matrixY() As String
    
        Set TotalRange = Range("a1").CurrentRegion
        For Each cell In TotalRange
            If cell.Interior.ColorIndex = 6 Then
                ' Assegno a MyYellowRange il Range con solo le celle in giallo.
                If MyYellowRange Is Nothing Then
                    Set MyYellowRange = cell
                Else
                    Set MyYellowRange = Union(MyYellowRange, cell)
                End If
            End If
        
        Next
        
        MsgBox "My Yellowrange: " & MyYellowRange.Address, , MyYellowRange.Cells.Count & " cells"
        
        For Each cell In MyYellowRange
            '---- ecc ecc
        Next
    
    
    End Sub






  • di Textomb data: 07/03/2013 17:39:11

    cit.: eccede i 255 caratteri e quindi il limite imposto da VBA per la costruzione del Range.
    Non lo sapevo!!!
    Utilizzando il metodo Union funziona. Grazie mille.