Oggi vediamo un primo esempio sulla personalizzazione del Ribbon di Word 2007, con la creazione di una scheda aggiuntiva contenente, per il momento, un comando che modifica lo stile Titolo 1 nell'intero documento.
Le operazioni da eseguire sono molto simili a quelle già eseguite per Excel e descritte nei post precedenti, che riassumo sinteticamente:
- aprire Visual Studio 2007 e creare un Word addin (in C# o Visual Basic);
- aggiungere un item di tipo RibbonSupport che creerà la classe Ribbon1.cs (Ribbon1.vb per visual basic) e il file di struttura Ribbon1.xml (comune ad entrambi i linguaggi);
- sostituire la struttura del Ribbon1.xml con la seguente:
Ribbon1.xml
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad">
<ribbon startFromScratch ="false">
<tabs>
<tab id="MenùAzienda"
label="Menù aziendale VB">
<group id="FormatoCarattere"
label="Formati carattere">
<button id ="FormattaTitolo1"
size ="normal"
label ="Formatta Titolo 1"
screentip ="Formatta il testo con stile Titolo 1"
supertip ="Porta lo stile Titolo 1 a 16 punti,carattere Arial Black, grassetto e corsivo"
onAction = "myFunctions"
imageMso ="ChangeStylesMenu"/>
</group>
</tab>
<tab idMso ="TabHome">
<group idMso="GroupFont" >
<comboBox idMso ="fontSize" visible ="false"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
- attivare il codice commentato (indicato con il commento TODO), nella classe Ribbon1.cs (e analogamente nella classe Ribbon1.vb)
- aggiungere la callback myFunctions nella regione delle callbacks del file Ribbon1.cs (e Ribbon1.vb):
C#
#region Ribbon Callbacks
public void MyFunctions(Office.IRibbonControl control)
{
//chiamata alle diverse funzioni corrispondenti ai diversi comandi del ribbon
//attualmente esiste un solo comandoswitch (control.Id)
switch(control.Id)
{
case "FormattaTitolo1":
Globals.ThisAddIn.FormattaTitolo1();
break;
default:
// aggiungere codice per altre funzioni
break;
}
}
#endregion
VB
#Region "Ribbon Callbacks"
Public Sub myFunctions(ByVal control As Office.IRibbonControl)
'chiamata alle diverse funzioni corrispondenti ai diversi comandi del ribbon
'attualmente esiste un solo comando
Select Case control.Id
Case "FormattaTitolo1"
Globals.ThisAddIn.FormattaTitolo1()
Case Else
'aggiungere codice per altre funzioni
End Select
End Sub
#End Region
- creare il metodo per l'esecuzione della funzionalità nella classe ThisAddin.cs (ThisAddin.vb per Visual Basic):
C#
public void FormattaTitolo1()
{
try
{
//impostiamo la variabile per il documento attivo
Word.Document myDoc = Application.ActiveDocument;
//impostiamo la variabile oggetto per passare il nome dello stile
object styleName = "Titolo 1";
//impostiamo la variabile per lo stile Titolo 1
Word.Style myStyle = myDoc.Styles.get_Item(ref styleName);
//impostiamo la variabile booleana
Boolean updAutom = false;
//rileviamo l'impostazione della proprietà "aggiorna automaticamente" dello stile Titolo 1
//in modo da poterla impostare a true prima di effettuare le modifiche
//e poterla poi riportare al valore precedente al termine delle modifiche
updAutom = myStyle.AutomaticallyUpdate;
//impostiamo a true l'aggiornamento automatico
myStyle.AutomaticallyUpdate.Equals(true);
//apportiamo le modifiche necessarie allo stile Titolo 1
myStyle.Font.Size = 22;
myStyle.Font.Name = "Tahoma";
myStyle.Font.Color = Word.WdColor.wdColorDarkRed;
myStyle.Font.Bold = 1;
myStyle.Font.Italic = 0;
//assegnamo un bordo inferiore al paragrafo
myStyle.ParagraphFormat.Borders[Word.WdBorderType.wdBorderBottom].LineStyle = Word.WdLineStyle.wdLineStyleSingle;
myStyle.ParagraphFormat.Borders[Word.WdBorderType.wdBorderBottom].LineWidth = Word.WdLineWidth.wdLineWidth100pt;
myStyle.ParagraphFormat.Borders[Word.WdBorderType.wdBorderBottom].Color= Word.WdColor.wdColorDarkRed;
//allinemanto centrato
myStyle.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
//riportiamo l'opzione di aggiornamento automatico allo stato originale
myStyle.AutomaticallyUpdate = updAutom;
}
catch
{
MessageBox.Show("Operazione non riuscita");
}
}
VB
Public Sub FormattaTitolo1()
Dim myDoc As Word.Document
Dim myStyle As Word.Style
Dim updAutom As Boolean
Try
'impostiamo la variabile per il documento attivo
myDoc = Application.ActiveDocument
'impostiamo la variabile per lo stile da modificare
myStyle = myDoc.Styles('Titolo 1')
'rileviamo l'impostazione della proprietà "aggiorna automaticamente" dello stile Titolo 1
'in modo da poterla impostare a true prima di effettuare le modifiche
'e poterla poi riportare al valore precedente al termine delle modifiche
updAutom = myStyle.AutomaticallyUpdate
'impostiamo a true l'aggiornamento automatico
myStyle.AutomaticallyUpdate = True
'apportiamo le modifiche necessarie allo stile Titolo 1
With myStyle.Font
.Name = "Haettenschweiler"
.Color = Word.WdColor.wdColorDarkRed
.Size = 22
.Bold = False
.Italic = False
End With
'assegnamo un bordo inferiore al paragrafo
With myStyle.ParagraphFormat
.Borders(Word.WdBorderType.wdBorderBottom).LineStyle = Word.WdLineStyle.wdLineStyleSingle
.Borders(Word.WdBorderType.wdBorderBottom).LineWidth = Word.WdLineWidth.wdLineWidth100pt
.Borders(Word.WdBorderType.wdBorderBottom).Color = Word.WdColor.wdColorDarkRed
'allinemanto centrato
.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
End With
'riportiamo l'opzione di aggiornamento automatico allo stato originale
myStyle.AutomaticallyUpdate = updAutom
Catch ex As Exception
MessageBox.Show("Operazione non riuscita")
End Try
End Sub
Per fare delle prove potete usare un qualsiasi documento con del testo che abbia, tra gli altri, lo stile Titolo 1, e vedere il risultato.
Io ho utilizzato il file WordCustomRibbon_01.docx (contenuto nell'allegato) che, oltre a prestarsi allo scopo, contiene tutto il codice necessario, da copiare e incollare nei nuovi progetti.
Il file contiene diversi titoli con lo stile Titolo 1 e una nuova scheda Menù Aziendale (nel mio caso sono due perchè ho caricato entrambi gli addins) con il comando Formatta Titolo 1:

Dopo aver fatto click sul comando, tutti i titoli assumono la formattazione assegnata:

Naturalmente, come sempre, in allegato trovate entrambe le applicazioni e il file per l'esempio.
Ciao a tutti
Laura
Come promesso, ecco tutto il materiale relativo alla sessione di Office che ho tenuto a Bari il 23 Marzo:
- la presentazione;
- il progetto in C# e in Visual basic;
- l'elenco dei controlli del Ribbon per excel, indispensabile per reperire i corretti id di tabs, gruppi e controlli vari ;
- un file excel con le galleries di immagini Office da assegnare ai comandi personalizzati del Ribbon.
E' possibile scaricare il tutto all'indirizzo: http://www.dotnetside.org/files/folders/ready_for__a_new_day/category1218.aspx
Per poter accedere al download è necessario essere registrati al sito.
In particolare, il file con le galleries, reperibile anche su Internet, è in una versione personalizzata da me, come spiegato anche nel mio post: Office Icon Gallery
Un ringraziamento a Dotnetside, per avermi dato questa possibilità; a tutti i partecipanti, che hanno pazientemente subito la mia "corsa" finale mentre Tiziana mi diceva di "stringere"; e, in particolare, a Mighell e a Gerardo per aver risolto brillantemente il problema del monitor, che avrebbe potuto compromettere la sessione!
Grazie ancora a tutti
Laura
Nel post precedente : Personalizzazione del Ribbon di Access 2007 (1) ho creato una nuova scheda per il Ribbon di Access utilizzando delle macro per le callbacks relative ai bottoni.
Nell'esempio di questo post, invece, ho utilizzato una subroutine creata in un modulo di VBA, che costituisce un'alternativa migliore e più flessibile alle macro.
Allo scopo, ho suddiviso la scheda del Ribbon in due gruppi: Reportistica e Inserimento dati.
Nel primo, ho lasciato i due comandi già presenti nell'allegato al post precedente; nel secondo, ho aggiunto un bottone per l'apertura di un semplice form di inserimento dati, mediante la callback InserisciStudenti.
La struttura xml è la seguente:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="GestioneGeneraleID" label="Gestione generale">
<group id="ReportisticaID" label="Reportistica">
<button id="RubricaStudenti" label="Rubrica Studenti" size="large" screentip="Elenco telefonico Studenti" supertip="elenco esportabile in excel" onAction="RubricaStudenti" imageMso="CreateReport" />
<button id="StudentiLivello" label="Studenti per livelloi" size="large" screentip="Elenco degli studenti" supertip="elenco esportabile in excel" onAction="StudentiLivello" imageMso="CreateReport" />
</group>
<group id="InserimentoDatiID" label="Inserimento Dati">
<button id="InserisciStudenti" label="Nuovi studenti" size="large" screentip="Aggiunta e modifica studenti" supertip="Consente l'immissione di nuovi studenti e la gestione di quelli esistenti" onAction="InserisciStudenti" imageMso="RecordsAddFromOutlook" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Successivamente, ho eseguito le seguenti operazioni:
- creazione di un nuovo modulo denominato CallBack;
- aggiunta del riferimento alla libreria Microsoft Office 12.0 Object Library;
- creazione della seguente public sub:
Public Sub InserisciStudenti(control As IRibbonControl)
DoCmd.OpenForm "InserisciStudenti"
End Sub
Ed ecco il risultato:
Errata corrige al post precedente
Riguardando il post precedente, mi sono accorta della mancanza di un'operazione fondamentale da eseguire per attivare il ribbon personalizzato, senza la quale, pur essendo tutto corretto, la nuova scheda non verrà visualizzata.
L'operazione mancante è costituita dall'attivazione della nuova scheda nel database corrente, mediante il valore del campo RibbonName della tabella USysRibbons:
- aprire il Menù Office;
- click su Opzioni di Access;
- click su Database corrente;
- nella sezione Barra multifunzione e barra degli strumenti, selezionare il nome del Ribbon (già presente in elenco);
- chiudere e riaprire il db

Come sempre, vi allego l'esempio completo.
Ciao a tutti
Laura
A differenza delle altre applicazioni di Office, la personalizzazione del Ribbon in Access 2007 non avviene mediante la creazione di un Add-in.
La struttura xml che rappresenta la configurazione del Ribbon, può essere gestita in due modalità, delle quali vedremo la prima in questo post: la creazione di una tabella all'interno del database.
Allo scopo, dobbiamo:
- creare un nuovo database basato, ad esempio, sul modello Studenti;
- creare una tabella denominata USysRibbons;
- all'interno di tale tabella, creare i due campi RibbonName (formato testo) e RibbonXML(formato memo);
- inserire nel primo campo un nome per il Ribbon personalizzato;
- inserire nel secondo campo la struttura xml del Ribbon (gruppi, comandi, ecc), esattamente nello stesso modo in cui abbiamo realizzato il Ribbon per Word o Excel (post precedenti).
Nel mio esempio, ho assegnato i seguenti valori ai due campi:
- RibbonName: MyRibbonHome
- RibbonXML:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon startFromScratch="false">
<tabs>
<tab id="ReportisticaID" label="Reportistica">
<group id="ProgettiID" label="Progetti">
<button id="RubricaStudenti" label="Rubrica Studenti" size = "large" screentip = "Elenco telefonico Studenti" supertip = "elenco esportabile in excel" onAction = "RubricaStudenti" imageMso = "CreateReport"/>
<button id="StudentiLivello" label="Studenti per livelloi" size = "large" screentip = "Elenco degli studenti" supertip = "elenco esportabile in excel" onAction = "StudentiLivello" imageMso = "CreateReport"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
A ciascuno dei due comandi creati, ho assegnato il nome di una semplice macro che apre un report e il gioco è fatto!
Basta chiudere e riaprire il database ed ecco il risultato:

In allegato trovate il database pronto.
Per chiarimenti di ogni genere su Access lasciate un commento.
Ciao a tutti
Laura