Concatena con VBA Excel 2003



  • Concatena con VBA (Excel 2003)
    di TheProphet (utente non iscritto) data: 29/12/2012 02:03:44

    Ho creato questa funzione per poter concatenare in una cella tutti i valori del range con stesso font di colore.
    Funziona, ma ho due domande da fare:
    -Perchè inserisce lo spazio prima della prima parola (ogni cella contiene una parola)?? e come toglierlo??
    -Si può andare a capo tra una parola e l'altra modificando la mia funzione?? o bisogna per forza cambiare il formato della cella su Excel??

    Grazie in anticipo per l'aiuto!!!
     
    Function CCC(SCells As Range, WhatColorIndex As Integer)
    
    Application.Volatile
    
    For Each Cella In SCells
    If Cella.Cells.Value <> "" Then
    If Cella.Font.ColorIndex = WhatColorIndex Then CCC = CCC & " " & Cella
    End If
    Next Cella
    
    End Function



  • di Vecchio Frac data: 29/12/2012 09:50:03

    1) perchè CCC alla prima esecuzione del ciclo è vuoto e tu gli aggiungi comunque uno spazio. Usa Trim() al termine;
    2) usa un LineFeed per andare a capo e allora non serve lo spazio;

    e aggiungo:
    3) perchè usi ColorIndex? usando solo Color puoi specificare le costanti vb: vbBlack, vbRed, vbYellow ecc.
    4) un nome più esplicito di CCC sarebbe meglio :)
    5) ho modificato la firma della tua funzione per fargli accettare un parametro "a_capo", se lo imposti su True il risultato sarà una concatenazione di stringhe separate da line feed altrimenti la separazione avviene mediante spazio vuoto.
     
    Option Explicit
    
    Function CCC(SCells As Range, WhatColorIndex As Integer, a_capo As Boolean)
    Dim s As String, cella As Range
    
        For Each cella In [SCells]
            If cella <> "" And cella.Font.ColorIndex = WhatColorIndex Then s = s & IIf(a_capo, vbLf, " ") & cella
        Next cella
    
        CCC = Trim(s)
    End Function
    






  • di TheProphet (utente non iscritto) data: 29/12/2012 16:22:54

    Ho provato la tua funzione ma nella cella mi dava #VALORE!.
    Dopo un bel po di tentativi ho risolto tutto con la funzione sottostante. Magari come struttura non è delle migliori ma ho iniziato a usare vb da un paio di settimane.

    Nella nuova funzione:
    -Ho creato una variabile 'a' per il problema del primo ciclo, che mi lasciava la prima riga vuota;
    -Ho creato una variabile 'b' di appoggio per CCC;

    -Uso il ColorIndex solo perchè non conoscevo le costanti vb

    Grazie mille dell'aiuto!!
     
    Function CCC(SCells As Range, WhatColorIndex As Integer) As String
    Application.Volatile
    a = "PRIMA"
    For Each cella In SCells
    If cella.Cells.Value <> "" Then
          If (cella.Font.ColorIndex = WhatColorIndex) Then
           If (a = "PRIMA") Then
             b = b & cella
             a = "DOPO"
           Else
             b = b & vbLf & cella
           End If
          End If
    End If
    Next cella
    CCC = Trim(b)
    End Function



  • di Vecchio Frac data: 29/12/2012 21:17:03

    Ho capito dal tuo ultimo post che volevi utilizzare questa function dal foglio di lavoro, ma è impossibile ottenere il ritorno a capo in cella. L'utilizzo era per essere richiamato da altro codice, non come UDF.
    La versione seguente è leggermente migliore ma devi utilizzarla da VBA in questo modo:
    Sia in A1:A10 l'elenco di parole alcune delle quali in rosso.
    Con questa istruzione:
    Range("C1") = CCC([A1:A10], 3)
    ottieni in cella C1 l'elenco delle parole rosse ciascuna a capo nella cella C1.
    Altro modo non saprei.

     
    Option Explicit
    
    Function CCC(SCells As Range, WhatColorIndex As Integer)
    Dim s As String, cella As Range
        
        s = ""
        For Each cella In SCells
            If cella <> "" And cella.Font.ColorIndex = WhatColorIndex Then s = cella & vbLf & s
        Next cella
        
        s = Left(s, Len(s) - 1)
        CCC = Trim(s)
    End Function