Funzione CONCATENA, rispettando le formattazioni delle celle d'origine

Anonimo
2014-01-17T14:41:39+00:00

Salve  Forum,

Dopo tanto tempo che non ci sentiamo...,  mi è subentrata  una sorta di nostalgia; ecco che, per  porvi rimedio, vi pongo un quesito:

DOMANDA: La funzione "CONCATENA"  prevede il riporto dei contenuti  così come  diversamente formattati nelle varie celle di provenienza?

Esempio:  Nella  cella A1 digitiamo: 30 con tipo di carattere Arial  11;

Nella  cella B1 digitiamo : 30 con tipo di carattere Arial  15  in grassetto.;

In C1 la Funzione: =CONCATENA( A1;B1) .

La richiesta è quella di conoscere se in C1 è possibile che venga riportata la concatenazione rispettando , però, le formattazioni originali delle celle di provenienza,  nella fattispecie in esempio, così:

3030

Un saluto, Paolo

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2014-01-19T08:59:16+00:00

...

 

Però (c'è sempre un però di mezzo), ti sei dimenticato la originaria richiesta del riporto della eventuale diversa dimensione del carattere (se non ne hai più parlato vuol dire che ciò non è possibile realizzarlo, o mi sbaglio**?**

 

...

Ciao Paolo,

non mi pareva lo avessi chiesto, tant'è che all'inizio della discussione, visto che un pochino ti conosco, ti chiesi:

Un'ultima informazione.

Deve essere 'concatenato' solamente il formato grassetto o anche altre formattazioni?

Non avendo ricevuto risposta, mi sono concentrato solamente sul grassetto. Il nuovo codice, che sostituisce il precedente, 'concatena': il tipo di carattere, la dimensione, il colore, il grassetto, il corsivo e la sottolineatura.

Spero che sia sufficiente. 

Andrea.


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rTarget As Range, rSource As Range, cel As Range

Dim sFormula  As String

Dim p As Long, l As Long

  On Error GoTo Uffa

  Set rSource = Range("D8, E8, D9, E9, G9, H9, D10, E10, E11, D12, D5, E5, D6, E6, D7, E7")

  If Intersect(Target, rSource) Is Nothing Then Exit Sub

  Set rTarget = Worksheets("ORD - GDP IND KM").[b11]

  With Application

    .ScreenUpdating = False

    .EnableEvents = False

  End With

  For Each cel In rSource

    sFormula = sFormula & cel.Value

  Next

  rTarget.Value = sFormula

  p = 1

  For Each cel In rSource

    l = Len(cel.Value)

    If l Then

      With rTarget.Characters(p, l)

        .Font.Name = cel.Font.Name

        .Font.Size = cel.Font.Size

        .Font.Color = cel.Font.Color

        .Font.Bold = cel.Font.Bold

        .Font.Underline = cel.Font.Underline

        .Font.Italic = cel.Font.Italic

      End With

    End If

    p = p + l

  Next

exitSub:

  With Application

    .ScreenUpdating = True

    .EnableEvents = True

  End With

  Exit Sub

Uffa:

  Call MsgBox("Si è verificato il seguente errore: " & Err & vbNewLine & Err.Description)

  Resume exitSub

End Sub


La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2014-01-18T16:28:09+00:00

Ciao, Andy, 

Ti ringrazio preliminarmente per  avermi fornito l'indirizzo su cui studiare qualcosina  (mi sarebbe servito già ieri**!). Più che il mare, sento nell'aria l'odore del Carnevale di Acireale, luogo in cui vado tutti gli anni, perché lì si respira tutta l'aria "du Brazil".**

 

...

Ciao Paolo,

... peccato solo che manchino le Brasiliane. ;)

Complimenti, comunque, anche questa volta sei riuscito a spingerti oltre i limiti delle funzionalità di excel.

Il problema, come hai giustamente fatto notare tu, si verifica quando la lunghezza del testo risultante eccede i 255 caratteri, è dovuto ad una limitazione della funzione evaluate.

Ti allego il nuovo codice che sostituisce interamente il precedente.

Buon carnevale,

Andrea.

PS:

visto che ti stai applicando per imparare il vba, ti elargisco un primo consiglio:

la prima riga che ho anche evidenziato non è opzionale ma obbligatoriae deve essere presente all'inizio di ogni modulo. Seleziona explicit e premi F1 per informazioni in merito.


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rTarget As Range, rSource As Range, cel As Range

Dim sFormula  As String

Dim p As Long, l As Long

On Error GoTo Uffa

Set rSource = Range("D8, E8, D9, E9, G9, H9, D10, E10, E11, D12, D5, E5, D6, E6, D7, E7")

If Intersect(Target, rSource) Is Nothing Then Exit Sub

Set rTarget = Worksheets("ORD - GDP IND KM").[b11]

With Application

.ScreenUpdating = False

.EnableEvents = False

End With

For Each cel In rSource

sFormula = sFormula & cel.Value

Next

rTarget.Value = sFormula

p = 1

For Each cel In rSource

l = Len(cel.Value)

If l Then rTarget.Characters(p, l).Font.Bold = cel.Font.Bold

p = p + l

Next

exitSub:

With Application

.ScreenUpdating = True

.EnableEvents = True

End With

Exit Sub

Uffa:

Call MsgBox("Si è verificato il seguente errore: " & Err & vbNewLine & Err.Description)

Resume exitSub

End Sub


La risposta è stata utile?

0 commenti Nessun commento

44 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-01-18T00:07:16+00:00

    Ciao Paolo,

    Non avevo scaricato il file perché, a mio parere, eri in ottime mani con Andrea. Avendo letto il codice e conoscendo il suo provenienza non c'era alcun motivo per testarlo.

    Tuttavia, dato il tuo problema, ora ho scaricato il file e incollato il codice di Andrea nel modulo di codice del foglio INs e - naturalmente - funziona perfettamente!

    A questo punto, mi rendo conto che la colpa è mia ! In un altro thread, ho suggerito del codice 'normale', che è stato incollato in un modulo standard, e del codice d'evento che è stato incollato nel modulo ThisWorkbook, Come sai bene, le macro normali possono essere eseguite, tra altro, dalla finestrina di Macro (tramite Alt-F8), o chiamata da un pulsante. Col senno di poi, mi rendo conto che non sono riuscito a spiegare che il codice d'evento verrà eseguito solo in risposta ad un evento specifico. In questo caso, Andrea ha scelto di aprofittarsi dall'evento Worksheet_Change e, in conseguenza, il codice risponderà ad un cambiamento in una qualsiasi delle celle specificate nel foglio. Perciò, prova di immettere o modificare i dati in qualsiasi cella colorata sul foglio INS e poi verifica la risposta immediata sul foglio ORD - GDP IND KM.

    In sintesi, il codice di Andrea funziona perfettamente e il problema che hai incontrato è dovuta alla mia incapacità di spiegare le caratteristiche speciali del codice di evento.

    Poiché hai espresso l'obiettivo, altamente lodevole, di imparare VBA, potrebbe essere opportuno di indirizzarti alla discussione incomparabile di Chip Pearson sulle procedure di evento che troverai a :

    http://www.cpearson.com/Excel/Events.aspx

    Un cavillo, tuttavia, è che queste pagine sono in inglese ma, a mio parere, valga la pena di leggerle.

    ===

    Regards,

    Norman

    Postscriptum:

    Non appena hai verificato che il codice funzioni, dovresti segnare il post di Andrea come la Risposta.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-01-17T22:20:21+00:00

    Grazie Norman per l'intervento e, a proposito, ti invio un bel ciao

    Ho rifatto la procedura con il codice "made in Andy" applicando le procedure che mi hai appena spiegato, ma nulla è cambiato in fatto di funzionalità; la cella B11 del Foglio "ORD - GDP IND KM" (che ospita la formula CONCATENA) continua a rendermi i dati senza fare la differenza tra il contenuto in grassetto e quello non in grassetto ospitato nelle celle del foglio INS.

    Sui thread che hai letto di Andrea e la stima che nutri di lui, questo mi fa veramente piacere, non sono geloso.... ;).

    Anche Mauro Gamberini, in un'altra occasione, mi prospettò gentilmente una soluzione in VBA e mi ricordo che mi disse di non preoccuparmi che "mi avrebbe preso per mano"; in quell'occasione non se ne fece nulla, ma ciò' nulla toglie allagrandezza planetaria dello stesso, magari (sicuramente) ero io a non essere pronto, per varie motivazioni.

    Ho narrato tutto ciò per rendere chiaro il mio pensiero che non era quello di fare paragoni tra voi Professionisti, per farli occorrerebbe che anch'io lo fossi, ma io sono un semplice alunno (ancora per poco... ;) 

    Ciao Norman, salutami Londra, anche se ancora non ho avuto il piacere di conoscerla.

    A dopo, Paolo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-01-17T21:07:18+00:00

    Ciao Andy

     

    Ho creato - da Inserisci - un modulo, vi ho incollato il codice ma alla chiusura del file mi appare una finestra che recita testualmente: Errore di compilazione: Previsto: Numero di riga oppure etichetta oppure istruzione oppure fine istruzione.

     

    Cosa ho combinato**?** 

     

    E non scatenarmi altre risate,  affermando: "e non aggiungo altro visto che ultimamente sei diventato un esperto di VBA."

     

    Pero' devo confessarti seriamente che Norman è stato l'unico fra voi che è riuscito a farmi appassionare a questo famoso VBA. Sto cercando qualche corso di base (gratuito), per imparare almeno "i preliminari, e poi saprò darti risposta, dimostrandoti di sapere superare il/i maestri .......... ;) 

     

    a dopo, Paolo

    Ciao Paolo,

    Non posso parlare per il grande Andrea e, in ogni caso, non sarei così presuntuoso da tentare di farlo.

    Tuttavia, ho il sospetto che Andrea ha visto che hai usato delle procedure di evento in un altro thread e, pertanto, naturalemente, che tu ricorderesti dove incollare il suo Il codice di evento. Tuttavia il codice di evento che hai utilizzato in precedenza aveva una ambito di applicazione del workbook e quindi andeva incollato nel modulo di codice ThisWorkbook; Il codice di evento suggerito da Andrea ha un campo di applicazione del foglio di lavoro e quindi come chiaramente indicato da lui, deve essere incollata nel modulo di codice del Foglo INS. Per accedere a questo modulo:

    fai clic dx sulla linguetta del Foglio INS

    seleziona Visualizza Codice

    nella finestra del codice incolla l'ottimo codice suggerito da Andrea.

    Alt-Q per tornare in Excel

    A proposito, se le risposte di Andrea su questo forum non hanno farti appassionare per le bellezze di VBA, non hai letto i thread che ho letto io!

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento