formateur informatique

Tester si un fichier existe avant ouverture en VBA

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Tester si un fichier existe avant ouverture en VBA
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 :


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,
factures Access archivées en fichiers PDF dans un dossier

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.

Formulaire Access pour afficher la facture PDF en fonction du numéro de commande choisi avec la liste déroulante

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,
Afficher le contenu du fichier PDF sur le formulaire Access

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,
Le code VBA Access plante car le fichier cherché n-existe pas

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&nbsp;<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,
Code VBA Access indiquant que le fichier à ouvrir n-existe pas

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.

 
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