Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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.
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.
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 ,
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,
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