Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Importations multiples en VBA Word
Dans le volet précédent, nous avons appris Ã
importer des données externes dans un
document Word avec le
code VBA . Et à cette occasion, nous avons découvert comment gérer les
spécificités d'encodage de ces fichiers. Sur cette base, nous souhaitons maintenant offrir à l'utilisateur la possibilité de gérer des
importations de masse afin de
consolider de nombreux fichiers externes sur un même
document Word .
Sur l'exemple finalisé illustré par la capture, un
formulaire d'importation est proposé à l'utilisateur. Lorsqu'il clique sur le
bouton Parcourir , une
boîte de dialogue apparaît. Celle-ci a la faculté d'autoriser les
sélections multiples de fichiers . C'est ainsi, dans un répertoire désigné, que l'utilisateur sélectionne tous les
fichiers externes qu'il souhaite
importer . De retour sur le
formulaire , il n'a plus qu'Ã cliquer sur le
bouton Importer pour procéder à la
consolidation de tous ces fichiers sur le
même document Word .
Base de travail
Pour réaliser ce
développement , nous proposons de récupérer des sources offrant déjà ce
formulaire dans un
document Word ainsi que des
fichiers externes à y
importer .
La décompression livre donc le
document Word au
format docm pour gérer les
macros VBA . Il est accompagné des fichiers de texte dans les
sous dossiers iso et utf . Il s'agit exactement des mêmes groupes de fichiers au détail près que selon le dossier, ils ne sont pas
encodés de la même façon. Si vous les ouvrez dans un fichier texte, vous ne verrez pas de différence. A l'importation, elle est majeure en revanche.
Double cliquer sur le fichier Word pour l'ouvrir,
Cliquer alors sur le bouton Activer la modification puis sur le bouton Activer le contenu ,
Ces barrières existent au premier chargement du document en raison de sa nature étrangère et de la présence de
code VBA .
Comme vous pouvez le voir, un
formulaire se dresse à l'ouverture. Un texte est présent en arrière-plan. Il s'agit des mêmes blocs que ceux contenus dans les
fichiers à importer . Notre
code VBA Word se chargera entre autres de les supprimer avant de procéder.
Cliquer sur le bouton Annuler pour fermer le formulaire ,
A ce stade bien sûr, il s'agit de la seule fonctionnalité disponible. Néanmoins, nous allons constater que nous bénéficions d'ores et déjà des travaux produits à l'occasion du volet précédent sur l'
importation des fichiers avec gestion de l'encodage .
Réaliser le raccourci ALT + F11 pour basculer dans l'éditeur VBA Word ,
Nous débouchons sur la
feuille de code VBA associée au
formulaire . Si vous ne la visualisez pas, il suffit de double cliquer sur l'icône du
formulaire F_Import dans l'
explorateur de projet , sur la gauche de l'écran.
Dim cheminAbs As String
Private Sub Annuler_Click()
F_Import.Hide
End Sub
Nous constatons la déclaration d'une
variable publique . Elle est nommée
cheminAbs et elle est destinée à mémoriser le
chemin d'accès au dossier choisi par l'utilisateur pour les
importations . En effet, le processus s'exécute sur deux étapes. Il y a le choix des
fichiers à importer au clic sur le
bouton Parcourir . Et puis, il y a le lancement du processus au clic sur le
bouton Importer . Une
variable publique est donc nécessaire pour porter la valeur entre ces deux actions. Ces actions sont volontairement dissociées puisqu'il est permis de définir le
système d'encodage adapté par le biais des cases à cocher, avant de procéder.
Dans l'explorateur de projet , déployer l'affichage du dossier Modules ,
Puis, double cliquer sur le module M_Import pour afficher son code,
Sub Import(chemin As String,encodage As String)
Dim texte As String
Dim objFlux
Set objFlux = CreateObject("ADODB.Stream")
objFlux.Charset = encodage
objFlux.Open
objFlux.LoadFromFile (chemin)
texte = objFlux.ReadText()
objFlux.Close
Selection.InsertAfter texte
End Sub
C'est cette procédure que nous devrons appeler en boucle pour traiter l'
importation de tous les fichiers désignés par l'utilisateur. Elle exploite la
classe VBA ADODB.Stream pour récupérer les contenus en tenant compte du
système d'encodage défini. Cette procédure attend d'ailleurs deux paramètres : Le
chemin d'accès au fichier et son
système d'encodage .
Sélection de multiples fichiers
Désormais, le premier challenge que nous devons relever consiste à permettre à l'utilisateur de sélectionner autant de fichiers que souhaité en pointant dans un dossier du disque. Pour cela, nous devons lui offrir une
boîte de dialogue standard de Windows . C'est la
classe VBA FileDialog qui permet de piloter ces boîtes. Nous devons donc l'instancier.
Dans l'explorateur de projets , double cliquer sur l'élément F_Import ,
De cette manière, nous affichons le
formulaire dans sa vue en conception au centre de l'écran.
Dès lors, double cliquer sur le bouton Parcourir de ce formulaire ,
Nous basculons ainsi dans le
code VBA associé, plus précisément entre les bornes de la
procédure événementielle Parcourir_Click . Son code s'exécutera au clic sur le
bouton Parcourir .
Dans les bornes de cette procédure, ajouter les déclarations de variables suivantes :
Private Sub Parcourir_Click()
Dim boite As FileDialog
Dim chaque_fichier: Dim position As Byte
End Sub
Nous déclarons tout d'abord un objet de type boîte de dialogue. Nous le nommons boite. C'est volontairement que la
variable chaque_fichier n'est pas typée. Nous devons l'utiliser pour parcourir tous les éléments sélectionnés par l'utilisateur. C'est à cette occasion, dans une
boucle for each , qu'elle adoptera son type. Enfin, la
variable position est typée comme un entier court. Elle doit être exploitée pour déceler l'emplacement de la fin du chemin d'accès afin de ne conserver que le nom du fichier à afficher et ce, pour tous les éléments sélectionnés.
Après les déclarations, le temps des initialisations et affectations est venu.
A la suite du code VBA , ajouter les deux instructions suivantes :
Private Sub Parcourir_Click()
Dim boite As FileDialog
Dim chaque_fichier: Dim position As Byte
Liste.Clear
Set boite = Application.FileDialog(msoFileDialogOpen)
End Sub
Notre
zone de liste , destinée à recevoir les noms des
fichiers à importer , se nomme liste. A toutes fins utiles, nous commençons par la purger de ses éventuelles précédentes informations grâce à sa
méthode Clear . Puis, nous créons la
boîte de dialogue d'ouverture de fichiers grâce à la
méthode FileDialog de l'
objet VBA Application . C'est le
paramètre msoFileDialogOpen qui la définit comme une
boîte de dialogue d'ouverture de fichiers . Mais par défaut, elle ne gère pas la multi-sélection. Qu'à cela ne tienne, elle offre de nombreuses
propriétés pour la paramétrer.
A la suite du code VBA , ajouter les instructions suivantes:
Private Sub Parcourir_Click()
Dim boite As FileDialog
Dim chaque_fichier: Dim position As Byte
Liste.Clear
Set boite = Application.FileDialog(msoFileDialogOpen)
boite.AllowMultiSelect = True
boite.Show
End Sub
La
propriété AllowMultiSelect porte bien son nom. Réglée à True, elle autorise l'utilisateur à réaliser des sélections multiples et à réceptionner les chemins des fichiers ainsi désignés. La
méthode Show permet d'afficher la
boîte de dialogue d'ouverture de fichiers .
Suite à l'
ouverture de la boîte de dialogue et après validation, nous devons scruter chacun des éléments sélectionnés.
A la suite du code VBA , créer la boucle For Each suivante :
Private Sub Parcourir_Click()
Dim boite As FileDialog
Dim chaque_fichier: Dim position As Byte
Liste.Clear
Set boite = Application.FileDialog(msoFileDialogOpen)
boite.AllowMultiSelect = True
boite.Show
For Each chaque_fichier In boite.SelectedItems
Next chaque_fichier
End Sub
Grâce à la
boucle For Each , nous parcourons tous les éléments d'un même groupe. Ce groupe concerne tous les fichiers sélectionnés. Pour cela, nous exploitons notre variable non typée. C'est alors la propriété
SelectedItems de
l'objet de boîte de dialogue qui les retourne un à un. La variable est maintenant typée.
Désormais, l'objectif est de restituer les noms de ces fichiers dans la
zone de liste du formulaire et de mémoriser leurs
chemins d'accès dans la
variable publique . C'est ainsi que nous pourrons ensuite procéder à leur
importation .
Pour cela, ajouter les instructions VBA suivantes dans les bornes de la boucle ,
Private Sub Parcourir_Click()
Dim boite As FileDialog
Dim chaque_fichier: Dim position As Byte
Liste.Clear
Set boite = Application.FileDialog(msoFileDialogOpen)
boite.AllowMultiSelect = True
boite.Show
For Each chaque_fichier In boite.SelectedItems
position = InStrRev(chaque_fichier,"\") + 1
Liste.AddItem Mid(chaque_fichier, position)
If cheminAbs = "" Then cheminAbs = Left(chaque_fichier, position - 1)
Next chaque_fichier
End Sub
Nous exploitons tout d'abord la
fonction VBA InStrRev . Elle permet de trouver la position du dernier antislash dans le nom du fichier en cours d'analyse. Cette valeur incrémentée d'une unité est stockée dans la
variable position . Cette incrémentation permet de placer le pointeur juste après ce dernier antislash. L'objectif est de ne conserver que le nom du fichier dans un premier temps pour l'ajouter dans la zone de liste. C'est ce que nous faisons par la suite grâce à la
méthode AddItem de l'
objet Liste . Grâce à la
fonction VBA Mid , nous prélevons le reste de la chaîne en partant de la position située juste après l'emplacement de ce dernier antislash (position). Il en résulte le nom du fichier en cours d'analyse. Ensuite, dans la mesure où la
variable publique n'a pas déjà été renseignée (If cheminAbs = ""), nous lui affectons l'autre partie de la chaîne, c'est-à -dire le
chemin d'accès jusqu'à ce nom de fichier. En effet, nous considérons qu'ils sont tous placés dans le même dossier. Il n'est donc pas utile de l'affecter à chaque fois qu'un fichier de la liste est analysé. Et donc, nous exploitons la
fonction VBA Left pour prélever du début de la chaîne jusqu'à l'emplacement de cet antislash. Nous lui retranchons une unité (-1) car il s'agit de la longueur et non plus de la position qui elle part de l'indice 0.
Enregistrer les modifications (CTRL + S),
Enfoncer la touche F5 du clavier pour exécuter le code VBA ,
Sur le formulaire surgissant, cliquer sur le bouton Parcourir ,
Pointer dans l'un des deux sous dossiers du dossier de décompression,
Sélectionner les trois fichiers puis cliquer sur le bouton Ouvrir ,
Comme vous pouvez l'apprécier, les
noms des fichiers sélectionnés par l'utilisateur sont parfaitement restitués dans la
zone de liste du formulaire . Et nous pouvons gager que leur
chemin d'accès est quant à lui précieusement conservé au chaud dans la
variable publique . Il va nous être fort utile pour le
processus d'importation .
Importer les fichiers sélectionnés
Maintenant, au clic sur le
bouton Importer du formulaire , nous devons parcourir l'ensemble des éléments contenus dans la
zone de liste . Pour chacun, nous devons appeler la
procédure Import du module que nous avons présenté en préambule de cette formation. Nous devons lui passer le
nom du fichier en cours associé à son
chemin mémorisé dans la
variable publique , ainsi que le
type d'encodage , selon la case cochée par l'utilisateur sur le
formulaire VBA Word . Ensuite, elle se charge du reste.
Dans l'explorateur de projet, double cliquer sur l'élément F_Import pour afficher le formulaire ,
Puis, double cliquer sur le bouton Importer pour créer sa procédure événementielle ,
Nous basculons ainsi dans le
code VBA entre les bornes de la
procédure Importer_Click .
Private Sub Importer_Click()
End Sub
Nous avons besoin d'une
variable numérique pour parcourir la
liste des fichiers et d'une autre de
type texte pour stocker le
type d'encodage .
Dans les bornes de la procédure, ajouter les deux déclarations de variables suivantes :
Private Sub Importer_Click()
Dim compteur As Byte: Dim encodage As String
End Sub
Désormais et avant de procéder, nous devons donc récupérer l'
encodage choisi. Pour cela, nous devons tester les cases à cocher.
A la suite du code VBA , ajouter l'instruction conditionnelle suivante :
Private Sub Importer_Click()
Dim compteur As Byte: Dim encodage As String
If Iso.Value = True Then encodage ="iso-8859-1" Else encodage = "utf-8"
End Sub
Ensuite et nous l'avions annoncé, nous devons purger le document des potentielles précédentes importations.
Toujours à la suite du code, ajouter les instructions VBA suivantes :
Private Sub Importer_Click()
Dim compteur As Byte: Dim encodage As String
If Iso.Value = True Then encodage = "iso-8859-1" Else encodage ="utf-8"
Selection.WholeStory
Selection.Delete
End Sub
Dans les volets précédents, nous avons eu l'occasion d'insister sur l'
objet VBA Selection . Il est précieux et souvent incontournable. Il désigne la
sélection active sur le document et à défaut, l'
emplacement du point d'insertion . Sa
méthode WholeStory permet de sélectionner l'intégralité des paragraphes dans le document. Ensuite et comme ils sont sélectionnés, sa
méthode Delete permet de les supprimer tous. Nous devrions donc retrouver un document vierge avant importation.
Maintenant, il s'agit de récupérer chaque nom de fichier contenu dans la
zone de liste du
formulaire .
A la suite du code VBA , créer la boucle suivante :
Private Sub Importer_Click()
Dim compteur As Byte: Dim encodage As String
If Iso.Value = True Then encodage = "iso-8859-1" Else encodage ="utf-8"
Selection.WholeStory
Selection.Delete
For compteur = 0 To Liste.ListCount - 1
Next compteur
End Sub
Il s'agit d'une
boucle For Next classique. Nous exploitons notre
variable compteur que nous faisons varier de 0 jusqu'au dernier indice de la
zone de liste . Et pour cela, nous exploitons sa
propriété ListCount qui renvoie le nombre total de ses éléments. Nous lui retranchons une unité puisque nous partons de l'indice zéro.
Grâce à cette
boucle , nous allons maintenant pouvoir récupérer chaque fichier choisi pour les passer en traitement tour à tour à la
procédure Import .
Dans les bornes de la boucle , ajouter la ligne de code suivante :
Private Sub Importer_Click()
Dim compteur As Byte: Dim encodage As String
If Iso.Value = True Then encodage = "iso-8859-1" Else encodage ="utf-8"
Selection.WholeStory
Selection.Delete
For compteur = 0 To Liste.ListCount - 1
Import cheminAbs & Liste.List(compteur),encodage
Next compteur
End Sub
Nous appelons donc la
procédure Import . En premier paramètre, nous lui passons le chemin d'accès complet au fichier en cours d'analyse dans la boucle. Nous reconstruisons ce chemin par concaténation (&). Il s'agit d'un assemblage de l'adresse du dossier et mémorisée dans la
variable publique cheminAbs et du
nom du fichier en cours. En second paramètre, nous lui passons le
type d'encodage nécessaire pour le traitement des fichiers.
Enregistrer les modifications (CTRL + S) et enfoncer la touche F5 du clavier ,
Cliquer sur le bouton Parcourir du formulaire ,
Avec la boîte de dialogue, pointer dans le sous dossier iso ,
Sélectionner les trois fichiers et cliquer sur le bouton Ouvrir ,
Puis, cliquer sur le bouton Importer du formulaire ,
Comme vous pouvez l'apprécier, les fichiers désignés sont parfaitement
consolidés . L'
importation multiple est un succès.
Réitérer exactement les mêmes étapes mais avec les fichiers du sous dossier utf ,
Les contenus sont bien importés mais cette fois un problème surgit. Tous les accents ne sont pas correctement retranscrits. Pourtant, ces fichiers hébergent les mêmes textes d'un dossier à l'autre. Mais ils ne sont pas encodés de la même façon. C'est tout l'intérêt de nos cases à cocher qui fournissent le
type d'encodage à utiliser selon le cas.
Si vous importez de nouveau ces fichiers en cochant préalablement la seconde case (Encodage Utf-8), vous obtenez un résultat fidèle au précédent avec des
accents correctement encodés .