Comment traduire un texte dans toutes les langues en utilisant une fonction Excel
Dans ce tutoriel, je vais vous montrer comment mettre en place une petite fonction de traduction des textes multilingue et automatisée.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
1. Présentation
Pour découvrir comment mettre en place notre fonction de traduction automatique en plusieurs langue dans Excel, nous allons partir du tableau suivant :
Dans celui-ci, nous retrouvons simplement quatre phrases (assez banales je vous l’accorde) en français, et que nous allons souhaiter traduire dans trois langues différentes : l’anglais, l’espagnol et l’italien.
Pour cela, nous allons bien entendu devoir passer par le développement d’une petite macro-commande en VBA qui permettra de récupérer une fonction simplifiée que nous pourrons ensuite utiliser directement depuis une feuille de calcul.
Évidemment, si nous n’avons aucune notion du langage de programmation VBA, vous pouvez quand même suivre ce tutoriel, nous reviendrons en effet dans le détail sur les différents aspects de cette macro-commande.
Mais bien sûr, si vous souhaitez aller plus loin dans la découverte du langage VBA, vous pouvez évidemment consulter la formation disponible sur le blog en cliquant ici.
2. La fonction SERVICEWEB()
Avant de commencer le développement de la macro-commande, nous allons tout d’abord découvrir deux fonctions Excel très puissantes, qui vont nous permettre parvenir à nos fins.
La première de ces deux fonctions est SERVICEWEB().
Celle-ci permet de récupérer très simplement des informations depuis un service internet.
Le type d’information récupéré dépendra du service appelé en tant qu’argument, sachant que le cas le plus courant consiste à récupérer le code source d’une page internet à partir de son adresse.
Attention toutefois à trois limitations de la fonction :
- La fonction SERVICEWEB() n’est disponible sur Excel qu’à partir de la version 2013,
- La fonction SERVICEWEB() n’est fonctionnelle que sous système Windows (elle est proposée sous MacOs, mais ne fonctionne pas)
- La fonction SERVICEWEB() ne peut pas retourner une chaîne de plus de 32767 caractères, il s’agit en effet du nombre de caractères maximal pouvant être inséré dans une cellule
Pour récupérer la valeur d’un service web, il suffit de saisir son adresse URL en tant qu’unique argument.
=SERVICEWEB(url)
Comme vous pouvez l’imaginer, nous allons utiliser le service de Google pour effectuer cette traduction.
Pour cela, nous allons rendre à l’adresse suivante : https://translate.google.com/m
La dernière partie de l’adresse (« /m ») permet d’accéder directement à la partie mobile du site, ce qui permettra d’obtenir une page plus légèrement et donc plus rapide à charger, et également plus simple à analyser.
Pour commencer, nous allons demander à Google une traduction d’un terme très simple, par exemple « Bonjour » :
À partir de là, nous allons pouvoir nous intéresser à l’adresse utilisée par Google : « https://translate.google.com/m?sl=fr&tl=en&hl=fr&q=bonjour »
Celle-ci est très simple à analyser et à comprendre, nous y retrouvons en effet trois arguments :
- La langue d’origine : « sl=fr »,
- La langue de traduction : « tl=en »
- Le terme à traduire : « q=bonjour »
Notez que l’argument supplémentaire « hl=fr » correspond à l’interface de la page web, nous pouvons simplement l’ignorer.
À partir de là, nous pouvons simplement imaginer construire notre propre traduction dans la langue de notre choix.
Par exemple, pour traduire le mot « travailler » en espagnol : « https://translate.google.com/m?sl=fr&tl=es&q=travailler »
3. La fonction URLENCODAGE()
Maintenant, si nous essayons de traduire, non plus un simple mot, mais une phrase, nous allons pouvoir constater que l’adresse va automatiquement s’adapter pour que l’adresse reste valide : « https://translate.google.com/m?sl=fr&tl=en&q=il%20fait%20beau »
Les espaces sont ainsi transformés en « %20 ».
Pour obtenir le même résultat avec Excel, nous allons devoir utiliser une nouvelle fonction : la fonction URLENCODAGE().
Cette fonction connait à peu près les mêmes limites que la fonction SERVICEWEB() : celle-ci fonctionne sur les versions 2013 et suivantes d’Excel et uniquement sous Windows :
L’exemple suivant va ainsi retourner pour valeur « il%20fait%20beau » :
=URLENCODAGE("il fait beau")
4. Le traitement des données
La dernière opération que nous devons découvrir avant d’attaquer le développement de la macro va consister à explorer les données récupérées pour obtenir la traduction du terme d’origine.
Pour cela nous allons fonctionner par étapes avec le petit tableau suivant :
En cellule B15, nous saisissons un terme à traduire.
Ensuite, nous allons convertir celui-ci pour pouvoir l’utiliser dans une adresse URL :
=URLENCODAGE(B15)
Puis nous construisons l’adresse complète qui permet d’obtenir la traduction de ce terme, en utilisant la première partie de celle-ci, puis en ajoutant à la fin le résultat de la cellule B16 :
="https://translate.google.com/m?sl=fr&tl=en&q="&B16
Une fois que l’adresse est correctement formatée, nous pouvons l’utiliser en tant qu’argument de la fonction SERVICEWEB() :
=SERVICEWEB(B17)
Et voilà, nous avons maintenant récupéré le code source de la page, dans lequel se trouve justement la valeur traduite du terme.
Pour le retrouver, nous allons revenir dans la cellule B18, puis appuyer sur la touche [F9] pour visionner la valeur de la cellule.
Tout à la fin, nous retrouvons la traduction de notre terme avec la chaîne suivante : « <div class="result-container">The weather is nice</div> »
Cette traduction est donc comprise entre les deux balises « <div class="result-container"> » et « </div> ».
Retenez bien ces informations, nous en aurons bientôt besoin !
5. Créer la fonction TRADUIRE()
Maintenant que nous en savons assez, nous allons pouvoir construire notre fonction TRADUIRE().
La première chose à faire est alors de lancer l’éditeur de code VBE (pour Visual Basic Editor), qui est l’éditeur de code intégré dans les différentes applications de la suite Office et qui permet de développer des macro-commandes en VBA.
Pour cela, nous appuyons simplement sur les touches [Alt]+[F11] :
VBE s’ouvre alors et nous allons commencer par créer un nouveau module, c’est-à-dire est une feuille de saisie de code vide dans laquelle nous allons pouvoir saisir nos macros et fonctions.
Pour insérer un nouveau module, nous nous rendons dans le menu Insertion > Module :
Une fois dans le nouveau module, nous pouvons créer notre fonction en utilisant le mot clé Function, suivi du nom de la fonction :
Lorsque nous appuyons sur la touche [Entrée], VBE nous insère automatiquement les parenthèses pour y insérer les trois arguments qui vont nous intéresser :
Function TRADUIRE(texte As String, langueEntree As String, langueSortie As String) As String
End Function
Ces arguments sont les suivants :
- texte : il s’agit du texte que nous souhaitons traduire,
- langueEntree : il s’agit de la langue d’origine de ce terme,
- langueSortie : il s’agit de la langue dans laquelle la traduction doit être faite
Et enfin, nous pouvons typer la fonction en tant que String, c’est-à-dire une chaîne de caractères.
Pour commencer, nous allons constituer l’adresse d’accès au service Google :
Dim url As String
url = "https://translate.google.com/m?&sl=" & langueEntree & "&tl=" & langueSortie & "&q=" & WorksheetFunction.EncodeURL(texte) (texte)
Pour utiliser la fonction SERVICEWEB() dans VBA, nous allons appeler celle-ci à partir de l’objet principal WorksheetFunction.
Évidemment, nous devons utiliser le terme anglais de la fonction WorksheetFunction.EncodeURL().
Ensuite, nous allons nous assurer qu’il n’y a aucune majuscule dans cette adresse, qui entrainerait un résultat erroné, pour cela nous utilisons la fonction VBA LCase() :
url = LCase(url)
Pour l’étape suivante, nous allons stocker le code source de la page dans une variable que nous appelons « html » :
Dim html As String
html = WorksheetFunction.WebService(url)
Le plus « dur » est fait !
Maintenant, il ne va plus rester qu’à réduire la chaîne au seul terme traduit, et pour cela nous allons pouvoir utiliser les balises que nous avons identifiées un peu plus tôt.
Tout d’abord, nous stockons la balise d’ouverture dans une variable :
Dim baliseDebut As String
baliseDebut = "<div class=""result-container"">"
Attention de bien doubler les guillemets à l’intérieur de la chaîne de caractères.
Ensuite, nous allons rechercher la position de cette balise dans la chaîne html en utilisant la fonction InStr() :
Dim positionDebut As Integer
positionDebut = InStr(html, baliseDebut)
Puis la position de la balise de fin, en utilisant encore une fois la fonction InStr(), mais utilisant le premier paramètre optionnel qui permet de définir la position à partir de laquelle la recherche doit commencer :
Dim positionFin As Integer
positionFin = InStr(positionDebut, html, "</div>")
Pour finir, nous pouvons récupérer la chaîne située entre les deux bornes que nous venons de déterminer, en utilisant la fonction Mid() :
texte = Mid(html, positionDebut, positionFin - positionDebut)
Il ne reste plus qu’à exclure la balise de début de cette chaîne, et à retourner le résultat obtenu à la fonction TRADUIRE() :
TRADUIRE = replace(texte, baliseDebut, "")
Et voilà, il ne reste plus qu’à utiliser la fonction TRADUIRE() directement depuis la feuille de calcul, en l’appelant comme nous le ferions pour n’importe quelle autre fonction Excel
=TRADUIRE($A9;$A$8;B$8)
Voici la fonction personnalisée complète :
Function TRADUIRE(texte As String, origine As String, destination As String)
Dim URL As String
URL = "https://translate.google.com/m?sl=" & origine & "&tl=" & destination & " &q=" & WorksheetFunction.EncodeURL(texte)
URL = LCase(URL)
URL = Replace(URL, "zh-tw", "zh-TW")
Dim HTML As String
HTML = WorksheetFunction.WebService(URL)
Dim baliseDebut As String
baliseDebut = "<div class=""result-container"">"
Dim positionDepart As Integer
positionDepart = InStr(HTML, baliseDebut)
Dim positionFin As Integer
positionFin = InStr(positionDepart, HTML, "</div>")
texte = Mid(HTML, positionDepart, positionFin - positionDepart)
texte = Replace(texte, baliseDebut, "")
texte = Replace(texte, "'", "'")
TRADUIRE = texte
End Function