formateur informatique

Importations multiples avec une boîte de dialogue VBA Word

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Importations multiples avec une boîte de dialogue VBA Word
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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.

Boîte de dialogue VBA Word pour sélectionner plusieurs fichiers en même temps

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. Sources du projet VBA Word avec sous dossiers pour fichiers à 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.

Formulaire Word pour importer de multiples fichiers externes

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,
Formulaire VBA Word d-importation de fichiers en mode conception

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,
Ecrire les noms des fichiers à importer dans la boîte de dialogue Word

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,
Gérer les accents pour importation de fichiers externes en VBA Word

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.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn