Condividi:        

funzione concatena e mantenimento del formato

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

funzione concatena e mantenimento del formato

Postdi accio1965 » 12/09/07 14:29

utilizzo la formula concatena per unire il contenuto di 2 celle ma non riesco anche a portarmi dietro il formato delle celle di aprtenza, in particolare vorrei che venisse mantenuto il grassetto od il corsivo quando presente
mi potete aiutare?
grazie
accio1965
Utente Junior
 
Post: 52
Iscritto il: 21/08/07 08:39

Sponsor
 

Postdi Ribonix » 12/09/07 22:27

Ehilà... Non ho trovato nulla a riguardo... o forse sì...
Sia il comando CONCATENA che l'unione mediante "&" di fatto non funzionano come vorresti perchè in realtà uniscono solo i valori senza formattazioni di più celle in una sola cella.

Mi è venuta in mente ed ho buttato giù "bovinamente" una macro che può fare al caso tuo. Te la propongo qui sotto:

Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
lcella1 = Len(Range("a1"))
lcella2 = Len(Range("b1"))
With Worksheets("Foglio1").Range("c1")
    .Value = Range("a1") & Range("b1")
    .Characters(1, lcella1).Font.Bold = Range("a1").Font.Bold
    .Characters(1, lcella1).Font.Color = Range("a1").Font.Color
    .Characters(1, lcella1).Font.Italic = Range("a1").Font.Italic
    .Characters(lcella1 + 1, lcella2).Font.Bold = Range("b1").Font.Bold
    .Characters(lcella1 + 1, lcella2).Font.Color = Range("b1").Font.Color
    .Characters(lcella1 + 1, lcella2).Font.Italic = Range("b1").Font.Italic
End With
Application.ScreenUpdating = True
End Sub


Se nella cella A1 metti un testo scegliendo arbitrariamente l'italico, il grassetto e il colore e in A2 fai la stessa cosa ma con parametri differenti, automaticamente in A3 comparirà il risultato voluto...

Faccio un esempio:
se in A1 inserisco ciao e in A2 inserisco accio1965
il risultato sarà: ciaoaccio1965

Non è il massimo (Excel tende a "sfarfallare") ma non ho altre idee a riguardo...

Saluti
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Postdi Anthony47 » 13/09/07 02:40

Ciao Ribonix; vedo che sei iscritto da tanto tempo e sei finalmente comparso anche su questa sezione del forum. E ti sei dato da fare su tutto il fronte!
Per quanto riguarda la macro, raccomando di inserire subito dopo il titolo
Codice: Seleziona tutto
Application.EnableEvents = False


e subito prima di End Sub
Codice: Seleziona tutto
Application.EnableEvents = True


Altrimenti la macro va in loop sull’ istruzione .Value = Range("a1") & Range("b1") con rischio di crash.

Hai gia’ cercato di far diventare il codice una Funzione User Defined?

Ciao, lieto di legerti.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Ribonix » 13/09/07 09:24

Ormai da tempo non sono più di casa in Italia. Là non ho internet a casa e quello che utilizzo x lavoro ha molte restrizioni...
Ogni volta che rientro e quando posso faccio volentieri un giretto su questo sito.

Non conoscevo la funzione "EnableEvents"... Il bello dell'informatica è che non si finisce mai di imparare... e meno male!!!

Non ho ben capito la domanda ma spero di averla interpretata in modo corretto. La mia macro non è un normale modulo VBA di Excel ma è associata all'evento Worksheet_Change del foglio. In questo modo non è necessario lanciare una macro per fondere le due celle: l'unione avviene in automatico perchè in quell'istante è stato cambiato il contenuto di una cella.

L'unico problema già riscontrato e che mi sono dimenticato di segnalare è che se all'interno della stessa cella il testo ha più stili e formattazioni la nuova cella prende i primi stili di formattazione delle due celle.
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Postdi Anthony47 » 13/09/07 10:25

EnableEvents serve a bloccare/sbloccare la decodifica degli eventi, quali Change, SelectionChange, etc; il loop si verificava perche' all' interno della macro veniva generato un evento Change (con l' istruzione segnalata) che reinvocava la macro; e cosi' all' infinito.
Credo che sia cruciale in tutte le macro di gestione eventi, anche solo per bloccare eventi imprevisti; il lato opposto della medaglia e' che se si esce senza aver riabilitato gli eventi (evidentemente per bug o per errori non gestiti correttamente) le macro di evento non scattano piu', e bisogna rimediare con il comando di abilitazione dato in modalita' "Immediata".

La domanda: visto che la macro lavora su parametri fissi, volevo sapere se avevi gia' pensato a usare istruzioni analoghe nel codice per una User Defined Function, tipo
Function RiboString(C1, Optional C2 = "")

per cui poi basta mettere in una cella =RIBOSTRING(A10;A3) per ottenere il risultato voluto.

Ciao,
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Ribonix » 13/09/07 14:17

Non ho mai provato... ci sono funzioni e parti di Excel che non conosco appieno... sorry
Come specificato la macro l'ho ideata al momento e presentata nel precedente post. Non ho pensato ad applicazioni e utilizzi particolari...
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Postdi Ribonix » 13/09/07 23:58

Ecco una variante del mio codice. Permette di unire 2 celle con all'interno svariate formattazioni (e le proprietà di "Font" che ho inserito non son tutte...)
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
Cella1 = "a1"
Cella2 = "b1"
cella3 = "c1"
lcella1 = Len(Range(Cella1))
lcella2 = Len(Range(Cella2))
Range(cella3) = Range(Cella1) & Range(Cella2)
For t = 1 To Len(Worksheets("x").Range(cella3))
    If t <= lcella1 Then
        Range(cella3).Characters(t, 1).Font.Bold = Range(Cella1).Characters(t, 1).Font.Bold
        Range(cella3).Characters(t, 1).Font.Color = Range(Cella1).Characters(t, 1).Font.Color
        Range(cella3).Characters(t, 1).Font.Italic = Range(Cella1).Characters(t, 1).Font.Italic
        Range(cella3).Characters(t, 1).Font.Size = Range(Cella1).Characters(t, 1).Font.Size
    Else
        Range(cella3).Characters(t, 1).Font.Bold = Range(Cella2).Characters(t - lcella1, 1).Font.Bold
        Range(cella3).Characters(t, 1).Font.Color = Range(Cella2).Characters(t - lcella1, 1).Font.Color
        Range(cella3).Characters(t, 1).Font.Italic = Range(Cella2).Characters(t - lcella1, 1).Font.Italic
        Range(cella3).Characters(t, 1).Font.Size = Range(Cella2).Characters(t - lcella1, 1).Font.Size
    End If
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Postdi accio1965 » 28/09/07 10:30

grazie per la vostra collaborazione ma non riesco a risolvere con i vostri suggerimenti
potrei aggirare il problema in un altro modo
è possibile condizionare la funzione alla verifica del formato?
cioe posso dirgli SE la cella è in grassetto concatena altrimenti niente?
accio1965
Utente Junior
 
Post: 52
Iscritto il: 21/08/07 08:39


Torna a Applicazioni Office Windows


Topic correlati a "funzione concatena e mantenimento del formato":


Chi c’è in linea

Visitano il forum: Nessuno e 43 ospiti