Estrarre testo in grassetto



  • Estrarre testo in grassetto
    di Mauro (utente non iscritto) data: 21/11/2012 08:20:22

    Ciao, vorrei estrarre da una cella di Excel solo il testo in grassetto.
    Qualcuno può aiutarmi con una macro?
    Grazie



  • di HarryBosch data: 21/11/2012 10:03:39

    Ciao Mauro
    ovvero in una cella potresti avere del testo in grassetto e altro no?

    Si potrebbe ciclare l'intera stringa, controllare ogni carattere e memorizzarlo se si presenta in grassetto.
    Con la proprietà .FontStyle = "Grassetto" puoi verificare se il carattere è grassetto.
    Ti dò un ulteriore suggerimento: con
    .Characters(Start, Length) controlli da dove devi partire e la lunghezza del testo.

    Si potrebbe creare una funzione personalizzata; quella che ho preparato funziona bene. Se ti va di provare, altrimenti ti posto quella che ho pronto ^_^



  • di Mauro (utente non iscritto) data: 21/11/2012 10:18:37

    Ciao HarryBosch, si ho una cella che contiene del testo in grassetto e del testo non i n grassetto.
    A me interessa estrarre solo quello in grassetto.
    Sono inesperto quindi se vuoi postarmi la tua macro la provo volentieri.
    Grazie



  • di HarryBosch data: 21/11/2012 10:34:56

    Ok, allora inserisci il codice sotto in un modulo.
    Nell'elenco delle formule, troverai una nuova funzione. Se scrivi la formula:
    =fnzGrassetto(A1)
    dove tra parentesi indicherai il riferimento, quindi la cella dove hai il testo.

    Eventualmente, sarà da vedere se ci sono degli spazi tra le parole.
     
    Function fnzGrassetto(cella As Range) As String
    Dim i as integer
        For i = 1 To Len(cella)
            If cella.Characters(i, 1).Font.FontStyle = "Grassetto" Then
                fnzGrassetto = fnzGrassetto & Mid(cella, i, 1)
            End If
        Next i
    End Function
    



  • di Mauro (utente non iscritto) data: 21/11/2012 10:54:50

    Grazie mille, funziona ed è spettacolare anche se non mi fa lo spazio fra una parola e l'altra. c'è soluzione?
    Grazie
    Mauro



  • di HarryBosch data: 21/11/2012 11:43:50

    Infatti, quello che pensavo...
    Prova ora: ho aggiunto alcuni controlli per verificare se il ciclo sta passando uno spazio vuoto e se l'ultimo carattere della stringa memorizzata non sia già uno spazio vuoto.

    Magari si poteva risolvere anche con lo Split... sicuramente più elegante. Ci penso anche per una variante.
     
    Function fnzGrassetto(cella As Range) As String
    Dim i As Integer
        For i = 1 To Len(cella)
            If Mid(cella, i, 1) <> " " And cella.Characters(i, 1).Font.FontStyle = "Grassetto" Then
                fnzGrassetto = fnzGrassetto & Mid(cella, i, 1)
            End If
            If Mid(cella, i, 1) = " " And Right(fnzGrassetto, 1) <> " " Then
                fnzGrassetto = fnzGrassetto & " "
            End If
        Next i
    End Function
    



  • di Vecchio Frac data: 21/11/2012 14:17:27

    Curioso che abbia pensato a Font.FontStyle = "Grassetto" e non a .Font.Bold = True
    Soprattutto per evitare i problemi legati alle localizzazioni.
    Che succede con una versione di Excel inglese, spagnola o araba? :)





  • di Mauro (utente non iscritto) data: 21/11/2012 15:37:16

    Grazie mille HarryBosch, risolto.
    Alla prossima



  • di Vecchio Frac data: 21/11/2012 15:39:07

    Aspettate!
    Ecco la mia soluzione con Split ^_^
     
    Function get_bold_chars(cella As Range) As String
    Dim i As Integer, s As String
    
        For Each v In Split(cella, " ")
            s = s & IIf(cella.Characters(InStr(cella, v), Len(v)).Font.Bold, Trim(v) & " ", "")
        Next
        
        get_bold_chars = Trim(s)
    End Function






  • di HarryBosch data: 22/11/2012 10:08:58

    @VecchioFrac
    a dir la verità .Font.Bold = True è stato il mio primo pensiero ma, per strani motivi, non riconosceva il Grassetto.
    Prima di impazzire, ho dirottato sul Style "estraendo" la parte che mi interessava dopo la registrazione; per scoprire più tardi (ma era ovvio che un infido errore si nascondeva), mancava una "a" nella proprietà Characters che avevo inserito... AHhh

    Come immaginavo, la soluzione con lo Split è ottimizzata al massimo



  • di Vecchio Frac data: 22/11/2012 10:46:35

    Purtroppo gli errori infidi sono quelli che si fanno senza pensarci.
    ...per esempio, ho dimenticato di dichiarare v (As Variant possibilmente) :)
    Comunque cari amici, questa discussione mi ha soddisfatto... e diventerà un articoletto per il mio blog :P

    Naturalmente risponde solo all'obiettivo principale: estrarre le singole parole, non una sequenza di caratteri arbitraria.
    Si potrebbe rendere più generica e farle accettare un parametro per estrarre parole in grassetto, corsivo, rosse, blu, etc :) bisogna poi vedere l'impiego pratico!