formateur informatique

Supprimer tous les accents dans une table Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Supprimer tous les accents dans une table Access
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 :


Convertir les accents

Dans bien des cas, les accents sont problématiques pour le traitement des données. Par exemple, l'URL d'une page Web doit en être dépourvue. En programmation, il est très vivement conseillé d'utiliser des variables sans accents. A l'importation de données externes, si le système d'encodage n'est pas bien géré, tous les accents apparaissent mal transcrits et corrompent le fichier. C'est la raison pour laquelle cette nouvelle astuce VBA Access démontre comment automatiser un traitement de manière à remplacer tous les accents dans une table de base de données.

Base de données Access à télécharger
Pour la mise en place de cette nouvelle astuce, nous suggérons d'appuyer l'étude sur une base de données offrant de nombreuses informations gorgées d'accents. Ainsi il s'ouvre en mode exécution et dans une fenêtre indépendante comme vous pouvez le voir. Au passage, vous avez noté la présence d'un fichier texte qui livre une portion de code que nous exploiterons.

Formulaire Access avec bouton pour corriger les accents dans la table

Au clic sur le bouton central, la vocation de ce formulaire est simplement de corriger tous les accents présents dans la table societes. L'idée est de remplacer chaque lettre accentuée trouvée par son homologue sans accents. Dans le volet de navigation, vous notez la présence de deux tables. La table societes2 est une copie de la table societes pour pouvoir réaliser éventuellement quelques essais successifs.
  • Fermer le formulaire en cliquant sur la croix de sa fenêtre,
  • Dans ce volet de navigation, double cliquer sur la table societes,
De cette manière, nous affichons son contenu en mode feuille de données.

Table Access avec de nombreux accents

Cette table compte plus de 1200 enregistrements. Les accents sont nombreux dans les champs societes_nom, societes_activite et societes_departement. Ce sont les trois champs que nous comptons corriger par le code VBA et ce, pour tous les enregistrements de la table.

Code VBA au clic sur le bouton
Nous l'avons dit, le traitement de la table doit s'opérer au clic sur le bouton du formulaire. Nous devons donc associer un code VBA à cet événement.
  • Fermer la table en cliquant sur la croix de son onglet,
  • Dans le volet de navigation, cliquer droit sur le formulaire f_nettoyer,
  • Dans le menu contextuel, choisir de l'ouvrir en mode création,
  • Sur le formulaire en conception, cliquer sur le bouton Nettoyer la table,
  • Puis, activer l'onglet Evénement de sa feuille de propriétés,
Créer un événement au clic sur un bouton du formulaire Access

Comme vous pouvez le voir, une procédure événementielle est déjà associée à l'événement du clic sur ce bouton.
  • Cliquer sur le petit bouton situé à l'extrémité droite de la zone de l'événement,
Ainsi, nous basculons directement dans l'éditeur de code VBA Access, entre les bornes de la procédure Nettoyer_Click.

Private Sub Nettoyer_Click()

End Sub


La déclaration des variables
Pour mener à bien l'opération de nettoyage de la table, nous avons besoin de déclarer d'assez nombreuses variables, notamment pour piloter les objets de la base de données mais aussi pour gérer les accents.
  • Dans les bornes de la procédure, ajouter les déclarations de variables suivantes :
Private Sub Nettoyer_Click()
Dim base As Database: Dim enr As Recordset
Dim i As Integer: Dim lid As Integer
Dim nom As String: Dim act As String: Dim dep As String
Dim requete As String: Dim lesAccents() As String: Dim lesLettres() As String


End Sub


Nous déclarons la variable base comme un objet de type Database pour pouvoir pointer sur la base de données en cours. Puis, nous déclarons la variable enr comme un objet de type Recordset pour pouvoir piloter les enregistrements de cette base de données. Nous exploiterons la variable i dans une boucle pour parcourir tous les accents à trouver, que nous stockerons dans un tableau de variables.

Les variables lid, nom, act et dep doivent servir à stocker les informations de champs de chaque enregistrement que nous parcourrons. C'est ainsi que nous pourrons analyser chaque chaîne à la recherche d'accents à remplacer.

La variable requete doit accueillir la syntaxe Sql de la requête de mise à jour pour la correction des accents, enregistrement par enregistrement. Enfin, les tableaux de variables lesAccents et lesLettres doivent énumérer respectivement les lettres avec accents et ces mêmes lettres sans accents.

Les tableaux de lettres
Précisément, nous devons maintenant construire les tableaux représentant chacune de ces lettres. Et c'est ce code qui est offert.
  • A la racine du dossier de décompression, double cliquer sur le fichier tableauxAccents.txt,
  • Sélectionner (CTRL + A) et copier (CTRL + C) les deux lignes de code,
  • Revenir dans l'éditeur VBA Access,
  • Puis, coller (CTRL + V) ces deux instructions après les déclarations de variables,
...
lesAccents =Split("à, á, â, ã, ä, å, ç, è, é, ê, ë, ì, í, î, ï, ð, ò, ó, ô, õ, ö, ù, ú, û, ü, ý, ÿ", ", ")
lesLettres =Split("a, a, a, a, a, a, c, e, e, e, e, i, i, i, i, o, o, o, o, o, o, u, u, u, u, y, y", ", ")
...


Comme vous pouvez le voir, les lettres avec et sans accents sont énumérées strictement dans le même ordre. Grâce à la fonction VBA Split et au séparateur de la virgule passé en second paramètre, chacune de ces lettres est rangée dans un étage différent de son tableau. C'est ainsi qu'ils sont automatiquement initialisés et dimensionnés.

Les objets de base de données
Désormais et avant de pouvoir parcourir les enregistrements de la table à la recherche des accents à remplacer, nous devons initialiser les objets de base de données. C'est ainsi que nous pourrons atteindre la table et ses enregistrements.
  • A la suite du code VBA, ajouter les deux initialisations suivantes :
...
Set base = CurrentDb()
Set enr = base.OpenRecordset("societes")
...


La fonction VBA CurrentDb permet à l'objet base de pointer sur la base de données en cours. Comme vous le savez, une variable objet s'initialise nécessairement grâce au mot clé Set en préfixe. Et grâce à la méthode OpenRecordset ainsi héritée, nous faisons pointer l'objet enr sur la table societes. Celui-ci dispose donc désormais des propriétés et méthodes pour piloter ses enregistrements.

Maintenant et avant d'enclencher la boucle destinée à parcourir tous les enregistrements, nous devons tout d'abord placer le pointeur de lecture sur le premier d'entre eux. Et comme l'objet enr est amené à être appelé massivement, nous proposons d'optimiser le code VBA dans un bloc With. De cette manière, nous ne serons pas obligés de répéter le nom de l'objet (enr) à chaque fois qu'il est utilisé.
  • A la suite du code VBA, ajouter les instructions suivantes :
...
With enr
.MoveFirst

End With
...


Très simplement donc, nous exploitons la méthode MoveFirst de l'objet enr pour placer le pointeur sur le premier enregistrement de la table et ainsi initialiser la lecture.

Parcourir les enregistrements de la table
Maintenant, en partant du premier enregistrement, nous devons les parcourir tous jusqu'au dernier grâce à une classique boucle Do.
  • Dans le bloc With et après la méthode MoveFirst, créer la boucle Do comme suit :
...
Do

.MoveNext
Loop While Not .EOF
...


Grâce à la propriété EOF (End Of File) de l'objet enr, nous bouclons tant que le dernier enregistrement de la table n'est pas atteint. Et pour bien les passer tous en revue, nous exploitons la méthode MoveNext à chaque passage dans la boucle. De cette manière, nous déplaçons le pointeur de lecture sur l'enregistrement suivant. Mais avant cela bien entendu, nous avons des analyses et des traitements à entreprendre.

Stocker les informations de champs
Puisque la boucle est initialisée, nous pouvons maintenant en profiter pour récupérer les informations de certains champs, pour chaque enregistrement passé en revue. En les stockant dans des variables distinctes déclarées à cet effet, nous pourrons les étudier à la recherche d'accents à remplacer.
  • Dans la boucle et avant la méthode MoveNext, ajouter les quatre affectations suivantes :
...
lid = .Fields("societes_id").Value
nom = .Fields("societes_nom").Value
act = .Fields("societes_activite").Value
dep = .Fields("societes_departement").Value
...


La propriété Fields de l'objet enr renvoie la collection des champs de la table. En lui précisant le nom du champ en paramètre, nous pointons directement sur ce dernier. Et grâce à la propriété enfant Value, nous récupérons et stockons l'information sur l'identifiant, le nom, l'activité et le département de l'enregistrement en cours d'analyse par la boucle.

Parcourir tous les accents du tableau
Désormais et pour chaque enregistrement, nous avons besoin d'une nouvelle boucle capable de passer en revue tour à tour chaque accent du tableau de variables. C'est ainsi et dans un second temps que nous serons en mesure de rechercher chacun d'entre eux dans chacun de ces champs si d'aventure ils étaient trouvés. Comme nous connaissons la dimension du tableau de variables, nous pouvons exploiter une classique boucle bornée For Next.
  • Toujours dans la boucle Do et avant la méthode MoveNext, créer la boucle For Next suivante :
...
For i = 0 To UBound(lesAccents)

Next i
...


La fonction UBound appliquée sur un tableau de variables (lesAccents) renvoie le nombre d'éléments (Accents) qu'il contient. En partant du premier élément (0) pour rejoindre le dernier (UBound), nous les passons tous en revue.

Remplacer tous les accents
Puisque les informations de champs sont stockées et que tous les accents sont passés en revue, nous allons pourvoir les rechercher dans chaque chaîne pour entreprendre leurs remplacements grâce à la fonction VBA Replace et à l'autre tableau de variables, celui des mêmes lettres mais sans les accents.
  • Dans les bornes de la boucle For Next, ajouter les instructions VBA suivantes :
...
nom = Replace(nom, lesAccents(i), lesLettres(i))
act = Replace(act, lesAccents(i), lesLettres(i))
dep = Replace(dep, lesAccents(i), lesLettres(i))
...


En premier argument de la fonction Replace, nous désignons la chaîne dans laquelle il est question de rechercher l'accent en cours de consultation. Il s'agit tout simplement de la variable stockant l'information de champ pour l'enregistrement en cours. En deuxième argument, nous désignons l'accent à trouver grâce à la variable de boucle passée en argument du premier tableau de variables. En troisième argument, nous désignons la lettre de remplacement en pointant sur le même indice du second tableau de variables, grâce à cette même variable de boucle.

Nettoyer la table de tous les accents
Il ne nous reste plus qu'à exploiter ces variables purgées de leurs accents pour réaliser une requête de mise à jour sur chaque enregistrement de la table. De cette manière, nous allons remplacer tous les accents par leurs homologues sans accents. Et pour cela, nous avons besoin d'exécuter une requête Update sur la table source grâce à une méthode de l'objet base.
  • Après la boucle For et avant la méthode MoveNext, ajouter les instructions VBA suivantes :
...
requete = "Update societes SET societes_nom = '" & nom & "', societes_activite='" & act & "', societes_departement='" & dep & "' WHERE societes_id=" & lid
base.Execute requete
...


Nous exploitons une classique syntaxe Sql pour bâtir une requête de mise àjour (Update). Pour chaque enregistrement passé en revue dans la table societes, son rôle est de mettre à jour les informations de champs grâce aux variables correspondantes mais purgées de leurs accents et ce, pour l'enregistrement en cours de lecture, grâce à la clause WHERE sur le champ societes_id, avec la variable lid ayant prélevé cette information plus tôt dans la boucle. Dès lors, c'est la méthode Execute de l'objet base avec la syntaxe de cette requête en paramètre qui permet de l'exécuter.

Vider les objets de base de données
Le développement n'est pas totalement terminé pour autant. Comme vous le savez désormais, chaque variable objet doit être détruite dès lors qu'elle n'est plus utilisée. C'est ainsi que nous allons libérer proprement les ressources exploitées.
  • Après le bloc With, ajouter les quatre instructions VBA suivantes :
...
enr.Close
base.Close

Set enr = Nothing
Set base = Nothing
...


Nous exploitons la méthode Close des objets de base de données, suite à quoi nous les réinitialisons à Nothing pour les détruire et ainsi les sortir de la mémoire de l'ordinateur.

Il est temps de tester le bon fonctionnement de cette procédure pour supprimer les accents.
  • Enregistrer les modifications (CTRL + S), puis basculer sur le formulaire Access (ALT + Tab),
  • L'enregistrer à son tour et l'exécuter par exemple avec la touche F5 du clavier,
  • Puis, cliquer sur le bouton Nettoyer la table,
  • Dès lors, double cliquer sur la table societes pour l'ouvrir,
Supprimer tous les accents de la table dans la base de données Access par le code VBA

Comme vous pouvez l'apprécier, tous les accents ont été automatiquement supprimés de la table Access et ce, quel que soit le champ. Vous imaginez facilement le gain de temps que procure un tel traitement automatisé lorsque la table héberge plusieurs milliers d'enregistrements.

Le code VBA complet que nous avons construit pour corriger tous les accents dans la table de la base de données Access, est le suivant :

Private Sub Nettoyer_Click()
Dim base As Database: Dim enr As Recordset
Dim i As Integer: Dim nb As Integer: Dim lid As Integer
Dim nom As String: Dim act As String: Dim dep As String
Dim requete As String: Dim lesAccents() As String: Dim lesLettres() As String

lesAccents =Split("à, á, â, ã, ä, å, ç, è, é, ê, ë, ì, í, î, ï, ð, ò, ó, ô, õ, ö, ù, ú, û, ü, ý, ÿ", ", ")
lesLettres =Split("a, a, a, a, a, a, c, e, e, e, e, i, i, i, i, o, o, o, o, o, o, u, u, u, u, y, y", ", ")

Set base = CurrentDb()
Set enr = base.OpenRecordset("societes")

With enr
.MoveFirst
Do
lid = .Fields("societes_id").Value
nom = .Fields("societes_nom").Value
act = .Fields("societes_activite").Value
dep = .Fields("societes_departement").Value

For i = 0 To UBound(lesAccents)
nom = Replace(nom, lesAccents(i), lesLettres(i))
act = Replace(act, lesAccents(i), lesLettres(i))
dep = Replace(dep, lesAccents(i), lesLettres(i))
Next i

requete = "Update societes SET societes_nom = '" & nom &"', societes_activite='" & act & "', societes_departement='" & dep & "' WHERE societes_id=" & lid
base.Execute requete

.MoveNext
Loop While Not .EOF
End With

End Sub


 
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