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ù recente
  1. Anonimo
    2017-03-02T17:45:29+00:00

    Salve a tutti,

    spero che leggiate questo mio post; sarei interessato a utilizzare questa speciale funzione "concatena", ma complice la mia ignoranza in materia non ho idea di come utilizzare l'ottimo codice da Voi scritto.

    Potreste gentilmente spiegarmi passo passo come utilizzarlo?

    Io parto da un file excel con 2 colonne di dati (colonne A e B), con formattazioni varie e voglio concatenarle.

    Come procedo?

    Vi ringrazio per l'aiuto e la disponibilità.

    Saluti

    Stefano

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-02-20T11:16:35+00:00

    Ciao Andy

    Non mi riconosco più di quanto sono diventato bravo a .... copiare;)   tant'é che il tuo ultimo Codice, nonostante fosse privo di incongruenze..., sono riuscito a farlo funzionare lo stesso ...;)

    Andy, Scherzi a parte, il tuo codice funziona a meraviglia e, attese le mie iniziali perplessità sulla sua realizzazione, oggi mi chiedo: quando sentirò da te rispondermi: questo non è possibile farlo?

    Andy, sei una sicurezza!

    ciao, Enzo-Paolo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-02-20T07:27:04+00:00

    Ciao Andy

    Premesso che nel file in questione a me interessa solo la protezione di entrambi i fogli (senza l’immissione di alcuna password), ciò premesso,  ti comunico che ho sostituito il vecchio codice con il nuovo e ti comunico che, ogni qualvolta  inserisco  in una cella del  Foglio INS  un valore,  subito dopo l’INVIO, mi appare un fastidioso "Flah" raffigurante il Foglio ORD – GDP IND KM, per poi potere regolarmente digitare altri valori in altre celle.

    Sicuramente nel copiare il Codice avrò combinato qualche “incongruenza….”.

    Per una perfetta tua “diagnosi” ritengo che dovrai (se lo vorrai) visitare il file denominato “Decreto”  qui:

    Un saluto, Paul

    Ciao Paolo,

    serviva ad avvisarti dell'avvenuto aggiornamento ... nel caso fossi distratto. ;)

    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("C3, D3, C4, D4, C5, D5, C6, D6, C7, D7, C8, D8, C9, D9, C10, D10")

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

      With Application

          .ScreenUpdating = False

          .EnableEvents = False

      End With

      With Worksheets("ORD - GDP IND KM")

        '--- tolgo protezione al foglio

        .Unprotect

        Set rTarget = .[b11]

      End With

      For Each cel In rSource

        With cel

          If Len(.Value) Then

            sFormula = sFormula & .Value & Space(1)

          End If

        End With

      Next cel

      With rTarget

          .Value = sFormula

          .NumberFormat = "General"

      End With

      p = 1

      For Each cel In rSource

        If Len(cel.Value) Then

          l = Len(cel.Value) + 1

          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

        End If

      Next cel

    exitSub:

      '--- proteggo nuovamente il foglio

      Worksheets("ORD - GDP IND KM").Protect

      With Application

        .ScreenUpdating = True

        .EnableEvents = True

      End With

      Exit Sub

    Uffa:

      Call MsgBox("Si è verificato il seguente errore: " _

                  & Err.Number & vbNewLine & Err.Description)

      Resume exitSub

    End Sub


    La risposta è stata utile?

    0 commenti Nessun commento