Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Tester le fichier avant de l'ouvrir
Dans le volet précédent, nous avons appris Ã
créer des sous-dossiers en VBA lorsque ceux-ci n'existaient pas. L'objectif était de permettre à l'utilisateur de réaliser des exportations maîtrisées et organisées. Dans ce nouveau volet, nous allons voir comment
tester l'existence d'un fichier avant de tenter de restituer son contenu sur un
formulaire Access . Le but est d'informer et d'aiguiller l'utilisateur mais aussi de réaliser un programme propre, sans plantage.
Base de données Access à télécharger
Pour démontrer cette nouvelle astuce, nous proposons d'appuyer l'étude sur une petite
base de données archivant des commandes avec des
factures générées au
format PDF .
Comme vous le constatez, le
fichier de la base de données est accompagné d'un fichier de type texte et d'un sous dossier nommé
archives_factures . Le fichier texte héberge un
code VBA permettant de créer une
instance de Word pour accéder aux contenus des fichiers
Word et
PDF . Comme c'est une solution que nous avons apportée à l'occasion d'une précédente astuce, nous offrons son code ici.
Double cliquer sur le sous-dossier archives_factures pour l'ouvrir,
Comme vous pouvez le voir, il héberge quelques
factures au format PDF . Elles sont attachées à des numéros de commandes précis archivés dans la base de données. Leur présentation est basique et pas forcément très bien structurée. Il s'agit d'anciens documents. Ils iront néanmoins très bien pour les besoins des manipulations.
A la racine du dossier de décompression, double cliquer sur le fichier de base de données ,
Ainsi, nous l'ouvrons dans
Access .
Dès lors, cliquer sur le bouton Activer le contenu du bandeau de sécurité,
Sur la gauche de l'écran, le volet de navigation recense cinq tables et un formulaire. Nous avions exploité ces sources de données pour créer une
application de facturation avec gestion des stocks en VBA Access .
Dans le volet de navigation, double cliquer sur la table Commandes pour l'ouvrir,
Elle archive la
synthèse des commandes passées. Les détails de ces commandes sont hébergés quant à eux dans la table liée nommée Detail_commandes. Les numéros de ces commandes sont listés dans le premier champ. Il s'agit du
champ de la clé primaire . Il est nommé
num_com . Le dernier champ porte l'intitulé
facture_com . Nous y trouvons quelques
noms des fichiers PDF que nous avons découverts précédemment, en bas de la liste ici en l'occurrence. Cela signifie que toutes les
factures n'ont pas été créées. En d'autres termes, tous les fichiers n'existent pas. Et c'est bien tout l'intérêt de ce volet.
Cliquer sur la croix de l'onglet pour fermer la table,
Dans le volet de navigation, double cliquer sur le formulaire fParcourir pour l'ouvrir,
Il est très épuré. Il offre une
liste déroulante et une
zone de texte multiligne au
format texte enrichi pour être en mesure de restituer les attributs des fichiers PDF que nous allons tenter d'ouvrir.
La liste déroulante est reconnue sous le
nom listeCom . La zone de texte porte l'intitulé
contenu . Cette liste se charge automatiquement des numéros de commande à l'ouverture du
formulaire . C'est un
code VBA classique qui oeuvre au lancement. Comme vous l'avez sans doute constaté, ces numéros sont aussi les
suffixes des noms de factures PDF attachées. L'enjeu est simple, au choix d'un numéro, nous devons tenter de restituer le
contenu de la facture PDF associée, dans la zone de texte multiligne du formulaire.
Charger le contenu au choix dans la liste
Pour commencer, nous proposons de récupérer le
code VBA Access capable d'accéder au
contenu des fichiers Word et PDF . Ce dernier doit se déclencher au
choix d'un numéro de commande dans la liste déroulante.
A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans les propositions, choisir le mode Création ,
Sur le formulaire en conception, cliquer sur la liste déroulante pour la sélectionner,
Dès lors, activer l'onglet Evénement de sa feuille de propriétés ,
Cliquer ensuite sur la zone de son événement Sur changement ,
Dès lors, cliquer sur le petit bouton placé à l'extrémité droite,
Dans la boîte de dialogue, choisir le générateur de code et valider par Ok,
De fait, nous basculons dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle listeCom_Change .
A la racine du dossier de décompression, double cliquer sur le fichier texte pour l'ouvrir,
Sélectionner tout son code avec le raccourci clavier CTRL + A par exemple,
Le copier (CTRL + C) puis revenir dans l'éditeur VBA Access ,
Coller ce code (CTRL + V) entre les bornes de la procédure listeCom_change ,
Private Sub listeCom_Change()
Dim pos As Byte: Dim nomF As String
Dim fichier As String
Dim instanceW As Object: Dim doc As Object
contenu.Value = ""
pos = listeCom.ListIndex
nomF = listeCom.ItemData(pos)
fichier = CurrentProject.Path & "\archives_factures\facture_" & nomF & ".pdf"
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
Set doc = instanceW.Documents.Open(fichier, False, True)
instanceW.Selection.WholeStory
instanceW.Selection.Copy
contenu.SetFocus
DoCmd.RunCommand acCmdPaste
SendKeys ("^{HOME}")
doc.Close
instanceW.Quit
Set doc = Nothing
Set instanceW = Nothing
End Sub
Nous ne reviendrons pas en détail sur les explications de ces instructions. Elles ont fait l'objet d'un développement détaillé à l'occasion d'une astuce précédente. Vous remarquez néanmoins que le
chemin d'accès au fichier est reconstruit dans la
variable fichier . Le code pointe sur le
sous dossier archives_factures du dossier de l'application locale (CurrentProject.Path). Ensuite, c'est le nom du fichier qui est désigné. Il est recomposé dans la
variable nomF en fonction du choix du numéro de commande dans la liste déroulante (listeCom.ItemData(pos)). Il est préfixé du terme
facture_ et suffixé de l'
extension pdf .
Ce chemin est alors passé à la nouvelle instance de Word (
instanceW.Documents.Open(fichier,False, True) ). C'est ainsi que les propriétés et méthodes héritées entrent en jeu pour accéder à son contenu.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
Exécuter le formulaire, par exemple avec la touche F5 du clavier ,
Avec la liste déroulante, choisir l'un des derniers numéros de commandes, par exemple : 34,
Après quelques instants, le temps que le
code VBA s'approprie le contenu, il le restitue bien dans la
zone de texte enrichi . Une fois encore, la mise en forme et la mise en page ne sont pas des plus alléchantes. Mais l'essentiel est que les informations de synthèse comme le total de la commande, soient livrées.
Choisir maintenant un numéro un peu plus haut dans la liste comme le 11,
Comme vous pouvez le voir, la sentence est cette fois totalement différente. C'est une erreur d'exécution qui survient. La facture n'ayant pas été créée, le
fichier n'existe pas . Donc le code plante, d'où la nécessité de
tester l'existence de ces derniers avant de tenter de les consulter par le
code VBA .
Cliquer sur le bouton Fin de la boîte de dialogue pour terminer le code,
Tester l'existence du fichier
Pour analyser les fichiers du disque, il existe une classe que nous pouvons instancier grâce à la
fonction VBA CreateObject . Cette classe se nomme
Scripting.FileSystemObject . Pour qu'un objet hérite de ses propriétés et méthodes, nous devons commencer par le déclarer.
Revenir dans l'éditeur VBA Access entre les bornes de la procédure listeCom_Change ,
Dans la partie déclarative, ajouter la déclaration suivante :
Private Sub listeCom_Change()
Dim pos As Byte: Dim nomF As String
Dim fichier As String: Dim leFichier As Object
Dim instanceW As Object: Dim doc As Object
contenu.Value = ""
...
Nous déclarons donc la
variable leFichier comme un objet au sens large. Il prendra son véritable type au moment de l'
instanciation de la classe .
Sous l'affectation de la variable fichier, ajouter les deux instructions VBA suivantes :
...
nomF = listeCom.ItemData(pos)
fichier = CurrentProject.Path & "\archives_factures\facture_" & nomF & ".pdf"
Set leFichier = CreateObject("Scripting.FileSystemObject")
If (leFichier.FileExists(fichier)) Then
Set instanceW = CreateObject("Word.Application")
...
Nous procédons donc à l'instanciation de la classe des fichiers grâce à la
fonction VBA CreateObject . De fait, notre
variable objet leFichier hérite aussitôt des propriétés et méthodes pour piloter n'importe quel fichier désigné par son
chemin d'accès . Et pour preuve, dans l'enchaînement, nous exploitons sa
propriété booléenne FileExists sur le fichier en question.
Grâce à cette instruction conditionnelle, nous décidons donc que le traitement sur le fichier de la commande peut se poursuivre, dans la mesure où le fichier correspondant existe bien. Mais une instruction conditionnelle doit avoir une borne de fin encapsulant le dit traitement.
A la fin du code avant le End Sub, ajouter la branche Else de l'instruction conditionnelle,
...
Set doc = Nothing
Set instanceW = Nothing
Else
contenu.Value = "Désolé le fichier : <br /><br />"
contenu.Value = contenu.Value & fichier & "<br /><br/>"
contenu.Value = contenu.Value &"La <strong>facture</strong> n'a pas été créée."
End If
End Sub
...
Dans le cas contraire, donc quand
le fichier n'existe pas , son traitement est ignoré mais un message est retourné dans la zone de texte enrichi. Sa vocation est d'informer l'utilisateur sur le contexte. Grâce à cette propriété de
texte enrichi , nous pouvons exploiter des
balises Html classiques pour réaliser des retours à la ligne et un peu de mise en forme avec notamment un style gras.
Enregistrer les modifications (CTRL + S) et revenir sur le formulaire (ALT + Tab),
Avec la liste déroulante, choisir l'un des premiers numéros comme le 14,
Cette fois et comme vous pouvez l'apprécier, l'exception est gérée grâce à ce
test d'existence . Le fichier correspondant n'est pas trouvé et l'utilisateur en est averti sur les raisons, grâce à un message en retour.
Par contre, si vous choisissez un numéro plus éloigné comme le 29, étant donné que le fichier de la facture existe bien, l'instruction conditionnelle autorise la suite du traitement. De fait, l'instance de Word est créée, accède à son contenu, le récupère et le livre dans la zone de texte enrichi.