Mes premiers pas en VBA - 07 (Intervnir sur le contenu, les paragraphes et les tableaux)

Olivier Lebeau

Cet article fait partie d'une série de petits articles pour débuter en VBA pour Word.
De cette série, il est le septième.
Dans ce tutoriel, vous trouverez comment manipuler le contenu des documents.

- Titre : Mes premiers pas en VBA - 07 (Intervnir sur le contenu, les paragraphes et les tableaux)

- Auteur : Olivier Lebeau

- Parution : 1 janvier 2009

- Licence : Copyright ® 2009 Olivier Lebeau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Introduction

- 2. Range et Selection

- 3. Les paragraphes

- 3-A. En pratique

- 3-A-1. Récupérer l'Id d'un paragraphe

- 3-A-2. Les styles et les caractères d'un paragraphe

- 3-A-3. Parcourir les paragraphes d'un document

- 3-B. Méthodes

- 3-B-1. Add

- 3-B-2. Space1 - Space15 - Space2

- 3-B-3. OutlineDemote - OutlinePromote

- 3-C. Propriétés

- 3-C-1. Alignment

- 3-C-2. Borders

- 4. Les tableaux

- 4-A. En pratique

- 4-A-1. Ajout d'un tableau dans un document

- 4-A-2. Ajouter une ligne ou colonne à un tableau

- 4-A-3. Contenu d'une cellule

- 4-A-4. Format d'une cellule

- 4-B. Méthodes

- 4-B-1. Add

- 4-B-2. Delete

- 4-B-3. Select

- 4-B-4. Sort

- 4-C. Propriétés

- 4-C-1. Count

- 4-C-2. AllowAutofit

- 4-C-3. AllowPageBreaks

- 4-C-4. Borders

- 4-C-5. Range

- 4-C-6. Tables

- 5. Solutions

- 5-A. Compter les mots des phrases

- 5-B. Mettre troisième mot en gras et double souligné

- 5-C. Ajouter un document contenant une table

- 5-D. Table de multiplication

- 6. Liens Utiles

- 7. Remerciements

1 - Introduction

Dans les articles précédents, nous avons découvert les bases du VBA.
Le dernier en date vous à proposé de minipuler l'Objet Application Word et les documents.
Cet article va vous apprendre à manipuler les paragraphes et les tableaux contenus dans vos documents .

2 - Range et Selection

Avant d'aborder le contenu du document, nous allons voir deux objets : Range et Selection. Ces deux objets sont fort semblables. L'objet Range représente une plage de données alors que l'objet Selection est la Selection opérée par le curseur. Le point d'insertion dans votre document est la plus simple expression de votre Selection.
Mais un exemple est bien plus pratique pour la compréhension.

Tapez un texte dans un document, si vous n'avez pas vraiment envie d'écrire, utiliser l'expression suivante :

=Rand(10,10)

suivi de Enter dans votre document, vous verrez qu'il se remplit tout seul d'un texte sans queue ni tête qui est malgé tout utilisable pour nos manipulation.

Sélectionnez une portion de texte à la souris et exécutez ce code :

Sub AfficherSelection()
Debug.Print Selection.Text

End Sub

Vous venez de découvrir l'objet Selection.

Il ne peut y avoir qu'un seul objet Selection !

Pour imager un objet Range, nous allons procéder différemment, toujours avec le même texte utilisez ce code :

Sub AfficherRange()
Debug.Print ActiveDocument.Paragraphs(2).Range.Text

End Sub

L'objet Range réprésente la plage de données contenue dans un objet Paragraphe.
Essayez cette fois le même code sans faire appel à l'objet Range.

Sub AfficherRange()
Debug.Print ActiveDocument.Paragraphs(2).Text

End Sub

Vous recevez un magnifique message : Erreur de compilation !

Il est possible d'obtenir un objet sélection au départ du code, essayez :

Sub SelectionnerTexte()
ActiveDocument.Paragraphs(4).Range.Select

End Sub

Vous verrez que le quatrième paragraphe de votre document est sélectioné comme si vous l'aviez fait à la souris.

Nous aurons l'occasion de revenir plus en détail sur ces objets. Mais il était nécessaire de les aborder sommairement pour la suite.

3 - Les paragraphes

La collection la plus importante d'un document est celle qui contient les paragraphes "Paragraphs". Ce sont eux qui contiennent le texte, la mise en forme, ...

Comme nous travaillons avec une collection, il est possible d'atteinde un membre de cette collection par son Index.
Si vous désirez atteindre le quatrième paragraphe de votre document, vous devrez utiliser :

ActiveDocument.Paragraphs(4)....

Dans ce cas, vous renvoyez un objet Paragraph de la collection

3-A - En pratique

3-A-1 - Récupérer l'Id d'un paragraphe

Pour récupérer l'ID d'un paragraphe, il est nécessaire de ruser.
Dans le code ci-dessous, nous partons du point d'insertion, nous étendons la sélection jusqu'au début du document, il ne nous reste qu'à compter le nombre de paragraphes que la sélection contient.

Sub RecuperationIDPara()

Selection.HomeKey Unit:=wdStory, Extend:=wdExtend
Debug.Print Selection.Paragraphs.Count

End Sub

3-A-2 - Les styles et les caractères d'un paragraphe

Comme déjà mentionné, le style ainsi que la police de caractère ne sont pas appliqués aux paragraphes mais aux données qu'ils contiennent.

Appliquer Style

Sub AppliquerStyle()
ActiveDocument.Paragraphs(1).Range.Style = "Titre 1"

End Sub

Pour appliquer un style, vous avez plusieurs possibilités pour le nom du style. Vous pouvez utiliser le nom qui apparait dans la galerie des styles, dans notre exemple "Titre 1", ou utiliser une constante Word : wdStyleHeading1.

De la même manière nous pouvons récupérer le style apliqué au paragraphe :

Récupérer Style

Sub RecupererStyle()
Debug.Print ActiveDocument.Paragraphs(1).Range.Style

End Sub

Si vous appliquez le style au paragraphe et pas à son contenu, vous ne rencontrerez pas de problème, mais par habitude travaillez avec l'objet Range.

Dans la même optique, vous pouvez modifier la police de caractère d'un paragraphe sans passer par les styles.

Modifier la police de caractère

Sub ModifierPolice()
With ActiveDocument.Paragraphs(3).Range.Font
.Name = "Arial"
.Bold = True
.StrikeThrough = True
End With

End Sub

Nous l'avons vu plus tôt, With permet d'appliquer à un même objet plusieurs instructions. Instruction With ... End With

3-A-3 - Parcourir les paragraphes d'un document

Pour parcourir les paragraphes d'un document, nous allons avoir besoin d'utiliser une boucle.
Les boucles

Les paragraphes (Paragraph) font partie de la collection Paragraphs, nous allons utiliser une boucle For Each ... Next.

Sub ParcourirParagraphes()
'Déclaration de l'objet paragraphe
Dim pAra As Paragraph
'Comme nous allons parcourir la collection, il n'est pas utile d'utiliser
'l'opérateur d'affectation Set
For Each pAra In ActiveDocument.Paragraphs
Debug.Print Len(pAra.Range.Text)
Next pAra

End Sub

La variable pAra a volontairement été écrite avec une majuscule en seconde posisition. De cette manière, lorsque vous saissisez le nom de la variable en minuscule, le VBE corrige automatiquement et vous êtes certain de la bonne orthographe.

Une paragraphe peut contenir des phrases Sentences. Créez un document vierge, tapez : =rand(1,10) suivi Enter pour ensuite essayer ce code.

Compter les phrases d'un paragraphe

Sub CompterPhrases()
Debug.Print ActiveDocument.Paragraphs(1).Range.Sentences.Count
End Sub

Vous devriez obtenir 10. Ce code compte le nombre de phrases contenue dans le premier paragraphe du documet.

Malheureusement, les mots ne sont pas des objets en Word, mais malgré tout, il existe une collection Words qui représente les mots contenus dans une portion du document.

Sub CompterMots()
Debug.Print ActiveDocument.Paragraphs(1).Range.Words.Count
End Sub

Exercice :
Dans ce même morceau de document, vous allez compter le nombre de mots dans chaque phrase du premier paragraphe.
Attention, l'objet Word n'existe pas, vous devrez le déclarer en tant que variant.

Exercice :
Créez un nouveau document, remplissez le avec : =rand(10,2), supprimez le dernier paragraphe vide
Mettez en gras et double souligné le troisième mot de chaque paragraphe.

3-B - Méthodes

3-B-1 - Add

Comme pour toutes les collections, cette méthode va ajouter un paragraphe.

Sub AjouterParagraph()

ActiveDocument.Paragraphs.Add Range:=Paragraphs(3).Range

End Sub

L'argument Range passé à la méthode peut être omis et dans ce cas, le paragraphe est ajouté au point d'insertion.

Sub AjouterParagraph()

ActiveDocument.Paragraphs.Add

End Sub

Il existe une méthode de l'objet Selection qui produit le même effet :

Sub AjouterParagraphe()
Selection.InsertParagraph
End Sub

3-B-2 - Space1 - Space15 - Space2

Cette méthode ajoute un interligne Simple, de 1,5 ou double aux paragraphes spécifiés.
La mise en oeuvre est assez simple :

ActiveDocument.Paragraphs.Space15

Cette méthode peut s'appliquer à la collection ou à un membre de la collection.

ActiveDocument.PAragraphs(1).Space2

3-B-3 - OutlineDemote - OutlinePromote

Ces deux propriétés sont similaires, seule leur action est différente. Dans le case de Promote, on va changer le niveau de titre des paragraphes spécifiés pour monter le niveau de titre de 1 et pour Demote, on va diminuer le niveau de titre de 1.

Si vous avez un paragraphe de niveau de titre 2 et que vous lui appliquez la méthode OutlinePromote, vous aurez un paragraphe de niveau de titre 1.
De la même manière, la méthode OutlineDemote va diminuer le niveau de titre de 1, si vous appliquez cette méthode à un paragraphe de titre 2, vous obtiendrez un titre de niveau 3.

Il est beaucoup plus facile d'attribuer un style de titre que de passer par cette méthode.

ActiveDocument.Paragraphs(4).OutlineDemote

3-C - Propriétés

Les propriétés pour les objets paragraphes sont plus interressantes que les methodes.

3-C-1 - Alignment

Cette propriété permet l'alignement du paragraphe, vous avez plus de possibilités qu'avec l'interface graphique.

ActiveDocument.Paragraphs(1).Alignment = wdAlignParagraphRight

L'alignement peut prendre les valeurs ci-dessous :

Valeur

Description

wdAlignParagraphCenter

Aligné au centre.

wdAlignParagraphDistribute

Les caractères du paragraphe sont distribués équitablement pour remplir toute la largeur du paragraphe.

wdAlignParagraphJustify

Totalement justifié.

wdAlignParagraphJustifyHi

Justifié avec un rapport élévé de compression de caractères.

wdAlignParagraphJustifyLow

Justifié avec un faible rapport de compression de caractères.

wdAlignParagraphJustifyMed

Justifié avec un rapport moyen de compression de caractères.

wdAlignParagraphLeft

Aligné à gauche.

wdAlignParagraphRight

2 Aligné à droite.

3-C-2 - Borders

Ajoute des bordures au paragraphe spécifié. Un exemple sera plus intéressant qu'une description.

Ajouter une bordure

Sub AjouterBordure()
'Ajoute les bordures au paragraphe
With ActiveDocument.Paragraphs(6)
.Borders(wdBorderLeft).Visible = True
.Borders(wdBorderBottom).Visible = True
.Borders(wdBorderTop).Visible = True
.Borders(wdBorderRight).Visible = True
End With
'Modifie l'aspect de la bordure
With ActiveDocument.Paragraphs(6).Borders
.OutsideLineStyle = wdLineStyleDashDot
End With

End Sub

4 - Les tableaux

4-A - En pratique

Les tableaux font partie de la collection Tables. Le plus simple pour les adresser est de passer par leur index.

ActiveDocument.Tables(1)

Il est possible de parcourir les différentes tables de votre document à l'aide d'une boucle.

Sub ParcourirTables()
Dim oTbl As Table

For Each oTbl In ActiveDocument.Tables
...
Next oTbl
End Sub

Il n'est pas possible d'affecter un nom à une table en Word.

Les tableaux sont constitués de lignes et de colonnes.

Sub CompterLignesEtColonnes()
Debug.Print ActiveDocument.Tables(1).Rows.Count 'Nombre de lignes
Debug.Print ActiveDocument.Tables(1).Columns.Count 'Nombre de colonnes
End Sub

En plus de l'addressage des tableaux, il est possible d'adresser chaque cellule de chaque table. Pour l'adressage des cellules, c'est toujours le même principe, on utilise les coordonées de la cellule.

Coordonnées d'une table

Pour ajouter du texte dans une cellule, vous devez l'adresser et ensuite affecter à l'objet Range de la cellule le texte voulu.

Sub AjouterTexte()
ActiveDocument.Tables(1).Cell(1,1).Range.Text = "A1"
End Sub

Exercice
Récuperez le texte que vous venez d'ajouter dans la cellule avec un Debug.Print.

4-A-1 - Ajout d'un tableau dans un document

Comme pour beaucoup d'objet, la méthode pour ajouter est Add.

Ajouter une table

Sub AjouterTableau()
ActiveDocument.Tables.Add Range:=Selection.Range, numrows:=5, numcolumns:=6
End Sub

Cette table de 5 lignes et 6 colonnes sera ajoutée à l'emplacement du curseur de la souris.

Exercice
En vous basant sur le tuto précédent sur les documents, vous allez sur le document actif créer un table de 3 colonnes et 3 lignes.
Par le code, vous allez créer un nouveau document dans lequel vous allez ajouter une table contenant le même nombre de lignes et de colonnes.

4-A-2 - Ajouter une ligne ou colonne à un tableau

En Word, un tableau ou table est constitué de lignes et de colonnes, vous avez utilisé l'exercice précédent deux arguments pour ces objets. Vous pouvez récupérer le nombre de lignes et de colonnes de votre tableau en utilisant la propriété Count.

Nombre de lignes et de colonnes

Sub AfficherLignesEtColonnes()
Dim intR As Integer
Dim intC As Integer
Dim strMessage As String
'Récupération du nombre de lignes et de colonnes
intR = ActiveDocument.Tables(1).Rows.Count
intC = ActiveDocument.Tables(1).Columns.Count
'Élaboration du message par concaténation
strMessage = "Votre tableau contient : " & vbCrLf
strMessage = strMessage & intC & " colonnes " & vbCrLf
strMessage = strMessage & intR & " lignes."
'Affichage du message
MsgBox strMessage

End Sub

Pour ajouter une ligne ou une colonne à un tableau, nous allons procéder de la même façon, mais nou sallons utiliser la méthode Add au lieu de la propriété Count.

Ajouter une ligne et une colonne

Sub AjouterLigneEtColonne()
Dim oTbl As Table

Set oTbl = ActiveDocument.Tables(1)
oTbl.Rows.Add
oTbl.Columns.Add
Set oTbl = Nothing
End Sub

Ce code va simplement ajouter un ligne et une colonne à la fin de votre tableau pour la ligne et à la droite pour la colonne. Ce serait beaucoup plusinéteressant de pouvoir ajouter cette ligne ou cette colonne à un endroit de votre choix.
La méthode Add peut prendre un argument pour l'ajout.

Ajouter une ligne et une colonne 2

Sub AjouterLigneEtColonne()
Dim oTbl As Table

Set oTbl = ActiveDocument.Tables(1)
oTbl.Rows.Add BeforeRow:=oTbl.Rows(2)
oTbl.Columns.Add BeforeColumn:=oTbl.Columns(2)
Set oTbl = Nothing
End Sub

Dans l'exemple ci-dessus, nous ajoutons un ligne avant la seconde et pareil pour la colonne. La seule difficulté est la valeur passée à l'argument, ce n'est pas un entier, mais un objet ligne ou colonne.

4-A-3 - Contenu d'une cellule

Lorsque vous ajoutez ou utilisez une table dans un document, vous pouvez aussi ajouter des données dans les cellules. Pour ajouter des données dans une cellule, la méthode est assez simple, il suffit d'adresser cette cellule est d'affecter les données au Range de la cellule

Ajouter du contenu à un cellule

ActiveDocument.Tables(1).Cell(1,1).Range.Text = "Mon Texte"

Pour récupérer le contenu d'une cellule, la méthode est le même que pour l'ajout de données.

Récupérer le contenu d'une cellule

Debug.Print ActiveDocument.Tables(1).Cell(1,1).Range.Text

Nous avons vu comment ajouter un contenu à une cellule et un exercice pour le récupérer. Lors de cette récupération, vous aurez pobablement remarqué que le texte récupéré est plus long que le texte ajouté. Ce phénomène est dû aux caractères non imprimables qui délimitent la cellule. Pour remédier à cet inconvénient, nous allons fabriquer une petite fonction utilisant certaines fonctions que nous avons vu dans les chapitres précédents, les fonctions Len et Left.

Nous allons récupérer le contenu, mesurer sa taille en comptant le nombre de caractères présents et nous allons prendre tous les caractères sans les deux derniers. Nous allons appeler cette fonction NetText et lui passer en paramètre le texte contenu dans la cellule qui est à traiter.

Petit rappel
Appel d'une procédure

Fonction NetText

Public Function NetText(stTemp As String) As String
'Nous utilisans les caractères de la chaîne sans les deux derniers
NetText = Left( stTemp , Len(stTemp) - 2 )
End Sub

Souvenez vous de cette focntion, vous en aurez souvent besoin.

L'utilisation de l'ensemble est assez simple :

Utilisation de notre Fonction

Debug.Print NetText ActiveDocument.Tables(1).Cell(1,1).Range.Text

Il est fréquent que l'on soit tenu d'ajouter un ligne à un table pour y injecter des données. Pour y parvenir nous allons utiliser la méthode Add et ensuite la propriété Count pour obtenir le nombre de ligne et de cette manière, nous pourrons adresser la dernière.

Sub AjouterLigneEtDonnees()
Dim oTbl As Table

Set oTbl = ActiveDocument.Tables(1)
oTbl.Rows.Add
oTbl.Rows(oTbl.Rows.Count).Cell(1).Range.Text = "Dernière Ligne"
Set oTbl = Nothing
End Sub

Exercice
Nous avons vu comment ajouter un tableau à un document et comment adresser les cellules de ce tableau.
Vous allez créer un nouveau document y ajouter un table qui sera une table de multiplication pour les nombres de 1 à 10 et 20 valeurs par nombre. Vous ajouterez des titres aux colonnes et aux lignes.

4-A-4 - Format d'une cellule

En plus d'un contenu, le Range de la cellule possède des attributs permettant de définir le format du texte contenu et de la cellule elle-même.

ous aurez probablement remarqué que lorsque vous insérez un tableau dans un document, toutes les lignes sont transparentes. Le code ci-dessous va ajouter une bordure au tableau et definir des lignes pour border les cellules.

Sub AjouterContour()
Dim oTbl As Table

Set oTbl = ActiveDocument.Tables(1)

With oTbl.Borders
.Enable = True
.InsideLineStyle = wdLineStyleDot
.OutsideLineStyle = wdLineStyleSingle
.InsideLineWidth = wdLineWidth050pt
.OutsideLineWidth = wdLineWidth100pt
End With

End Sub

Le texte que vous allez insérer aura le format par défaut des cellules, mais vous pouvez modifier le format du texte contenu dans une cellule.

With oTbl.Rows(1).Range.Font
.Bold = True
.Underline = wdUnderlineDouble
.UnderlineColor = wdColorBrightGreen
End With

4-B - Méthodes

4-B-1 - Add

Nous avons déjà utilisé cette méthode, elle permet l'ajout d'une table à la collection des tables du document.

ActiveDocument.Tables.Add Range:=Selection.Range, numrows:=5, numcolumns:=6

Les trois arguments ne sont pas facultatifs, Range représente l'endroit où la table sera ajoutée, numrows le nombre de lignes et numcolumns le nombre de colonnes.

4-B-2 - Delete

Sans aucune surprise, cette méthode va supprimer une table de votre document.

ActiveDocument.Tables(1).Delete

4-B-3 - Select

Cette méthode va sélectionner une table de votre document. Vous pourrez ensuite utiliser l'objet Selection pour effectuer certaines actions.

ActiveDocument.Tables(1).Select
Selection.Copy
Documents.Add
ActiveDocument.Select
Selection.Paste

4-B-4 - Sort

Méthode intéressante, elle permet de trier le contenu d'une table. Il existe trois méthodes de tri pour une table :

- SortAscending

- SortDescending

- Sort

Les deux premières méthodes permettent un tri rapide d'une table. Le tri sera croissant ou décroisant selon que l'on utilise l'un ou l'autre. Leur utilisation est simple et ne comporte pas d'argument.

SortAscending ou SortDescending

Sub TriTable()
ActiveDocument.Tables(1).SortDescending

End Sub

La première ligne de la table est systématiquement exclue du tri avec ces deux méthodes.

La méthode Sort est un peu plus complexe, mais plus performante. Vous pouvez avec cette méthode effectuer un tri sur plusieurs colonnes, inclure la première ligne dans votre tri,...

4-C - Propriétés

4-C-1 - Count

La propriété la plus universelle s'applique aussi aux tables d'un document, elle va renvoyer le nombre d'objets de la collection.

debug.Print ActiveDocument.Tables.Count

4-C-2 - AllowAutofit

Si vous voulez redimentionner un tableau en fonction de son contenu, c'est la propriété que vous devez utiliser.

ActiveDocument.Tables(1).AllowAtofit

4-C-3 - AllowPageBreaks

Il est très embêtant de voir un tableau coupé en deux par un saut de page. Lorsque cette propriété est sur False, votre tableau sera en un seul morceau si c'est possible. En effet, si votre tableau fait plusieurs pages, vous n'aurez pas d'autre solution que de le scinder.

ActiveDocument.Tables(1).AllowPageBreaks = False

4-C-4 - Borders

4-C-5 - Range

Cette propriété renvoie la partie du document cntenue dans un tableau.

Sub TablesRange()
Debug.Print ActiveDocument.Tables(2).Range.Text
End Sub

Ce code va renvoyer le contenu de toutes les cellules de votre tableau.

4-C-6 - Tables

Cette propriété peut parraître déplacée, mais une table peut contenir une autre table.

Ajout d'une table dans une cellule

Sub AjouterTables()
Dim oTbl As Table
Set oTbl = ActiveDocument.Tables.Add(Range:=Selection.Range, numrows:=2, numcolumns:=2)
oTbl.Cell(1, 1).Select

Selection.Tables.Add Range:=Selection.Range, numrows:=1, numcolumns:=2
End Sub

5 - Solutions

5-A - Compter les mots des phrases

Nous allons parcourir la collection des phrases pour compter le nombre de mots contenu dans chaque phrase. du premier paragraphe.

Sub CompterMots()
Dim wdSentence
' ne pas donner de type à la variable équivaut à la déclarer
' comme variant
' Faire une boucle sur la collection Sentence et en compter les mots
For Each wdSentence In ActiveDocument.Paragraphs(1).Range.Sentences
Debug.Print wdSentence.Words.Count
Next wdSentence
End Sub

Ne pas déclarer le type de la variable ne doit être utilisé que si ce type n'existe pas.

5-B - Mettre troisième mot en gras et double souligné

Comme nous devons parcourir tous les paragraphes de la collection, nous allons déclarer un objet paragraphe et une boucle For Each ... Next. Pour chaque paragraphe, nous allons adresser le troisième mot de la collection des mots de ce paragraphe.

Mot trois gras et souligné

Sub MettreMot3Gras()
'Déclaration des variable
Dim pAra As Paragraph
'Boucle sur les paragraphes du document
For Each pAra In ActiveDocument.Paragraphs
With pAra.Range.Words(3).Font
.Bold = True
.Underline = wdUnderlineDouble
End With
Next pAra

End Sub

5-C - Ajouter un document contenant une table

Pour ajouter une table vous devez spécifier le nombre de lignes et de colonnes que votre table va contenir. Pour y parvenir, nous allons utiliser deux variables qui vont contenir le nombre de lignes (intR) et de colonnes (intC). Pour l'ajout de la nouvelle table, nous utiliserons ces deux variables.

Sub AjouterDocEtTable()
Dim intR As Integer
Dim intC As Integer

With ActiveDocument.Tables(1)
intR = .Rows.Count 'Nombre de lignes
intC = .Columns.Count 'Nombre de colonnes
End With
'Ajout du nouveau document
Documents.Add
'Ajout d'une table
ActiveDocument.Tables.Add Range:=Selection.Range, numrows:=intR, numcolumns:=intC

End Sub

Comme le document ajouté devient le Document Actif, pour ajouter la table, nous utiliserons l'ActiveDocument.

5-D - Table de multiplication

Avant de créer notre document, nous devons déterminer combien lignes et de colonnes votre table va comporter.
L'ennoncé demande 10 nombres, 20 valeurs et un titre par colonne et par ligne. Ce qui va nous donner 11 colonnes et 21 lignes.
Nous allons en profiter pour changer l'apparence de notre table en ajoutant des bordures extérieures et intérieures, les titres des lignes et colonnes seront en gras souligné.

Pour l'ajout d'un nouveau document, nous l'avons déjà vu plus tôt.

Dim oDoc As Document

Set oDoc = Application.Documents.Add

Pour l'ajout d'une table, vous l'avez déjà fait.

Dim oTbl As Table
Dim intR As Integer 'Nombre de lignes
Dim intC As Integer 'Nombre de colonnes

' Ajout de notre table
Set oTbl = oDoc.Tables.Add (Range:=Selection.Range, NumRows:= 21 , NumColumns:=11)

Pour les résultats, nous allons utiliser une boucle

For intR = 2 To 21
For intC = 2 To 11
oTbl.Cell(intR, intC).Range.Text = (intC - 1) * ( intR - 1)
Next intC
Next intR

Il nous manque les données pour les titres des lignes et colonnes et nous allons en profiter pour mettre notre test en forme.

For intR = 2 To 21
'Données de la première ligne
oTbl.Cell(intR, 1).Range.Text = intR - 1
'Mise en forme de chaque cellule
With oTbl.Cell(intR, 1).Range.Font
.Bold = True
.Underline = wdUnderlineDouble
.UnderlineColor = wdColorBlack
End With
Next intR
For intC = 2 To 11
'Données de la première colonnes
oTbl.Cell(1, intC).Range.Text = intC - 1
'Mise en forme
With oTbl.Cell(1, intC).Range.Font
.Bold = True
.Underline = wdUnderlineDouble
.UnderlineColor = wdColorBlack
End With
Next intC

Finalement, il nous reste la mise en forme de la table

With oTbl.Borders
.Enable = True
.InsideLineStyle = wdLineStyleDot
.OutsideLineStyle = wdLineStyleSingle
.InsideLineWidth = wdLineWidth050pt
.OutsideLineWidth = wdLineWidth100pt
End With

Si nous assemblons tous nos petits morceaux de code, nous obtenons ceci :

Le code complet

Sub TableDeMultiplication()
Dim oDoc As Document
Dim oTbl As Table
Dim intR As Integer 'Nombre de lignes
Dim intC As Integer 'Nombre de colonnes

Set oDoc = Application.Documents.Add
' Ajout de notre table
Set oTbl = oDoc.Tables.Add(Range:=Selection.Range, NumRows:=21, NumColumns:=11)
'Les résultats
For intR = 2 To 21
For intC = 2 To 11
oTbl.Cell(intR, intC).Range.Text = (intR - 1) * (intC - 1)
Next intC
Next intR
'Les titres
intR = 0
intC = 0
For intR = 2 To 21
oTbl.Cell(intR, 1).Range.Text = intR - 1
With oTbl.Cell(intR, 1).Range.Font
.Bold = True
.Underline = wdUnderlineDouble
.UnderlineColor = wdColorBlack
End With
Next intR
For intC = 2 To 11
oTbl.Cell(1, intC).Range.Text = intC - 1
With oTbl.Cell(1, intC).Range.Font
.Bold = True
.Underline = wdUnderlineDouble
.UnderlineColor = wdColorBlack
End With
Next intC

'Mise en forme
'Bordure
With oTbl.Borders
.Enable = True
.InsideLineStyle = wdLineStyleDot
.OutsideLineStyle = wdLineStyleSingle
.InsideLineWidth = wdLineWidth050pt
.OutsideLineWidth = wdLineWidth100pt
End With

End Sub

6 - Liens Utiles

Titre de l'article

01

Ma première macro

Fondements sur les variables et les constantes

02

Modifier notre code et introduction aux variables

Les conventions typographiques en VBA (illustrées sur Access)

03

Introduction aux Sub et Function

04

Opérateurs et Structures décisionnelles

05

Boucles et fonctions VBA

06

L'objet Application et les documents

Initiation au VBA d'Outlook

7 - Remerciements

Je tiens à remercier pour leurs contributions à ce projet :
- lorenzole+bo
- Philippe JOCHMANS
- Caro-Line
- Arkham46
- Jeannot45