miércoles, 22 de abril de 2015

VBA: Traduciendo a otros idiomas celdas en Excel.

Un lector solicitaba ayuda para traducir los contenidos de nuestras celdas.. preguntando si existía alguna función en Excel que realzara tal acción.
Aunque no existe una función estándar que haga lo que necesitamos, buscando por la web encontré un código de una UDF (función personalizada) que adapté a la necesidad.

El código siguiente requiere la instalación de la Referencia: Microsoft Internet control, ya que vamos a emplear el traductor de Google, accediendo al formulario de esa web.

Al realizar una conexión a Internet, el proceso de traducción para cada celda se demora algo.. pero al menos tenemos una traducción válida (más o menos.. ya sabemos todos cómo funciona el traductor de Google...)


La función solo requiere dos argumentos. El primero la celda a traducir, y el segundo el código del idioma al que queremos traducirlo (por defecto está al español).
Más abajo en este post aparece una lista de los códigos identificados por Google.


Insertamos el código de la función en un módulo estándar de nuestro proyecto de VBA desde el editor de VB:

Function Traducir(texto_a_traducir As String, Optional CodSalida As String = "es") As String
'Emplearemos el traductor de Google a través de Internet Explorer...
'OJO!!! MUY IMPORTANTE: Debe estar seleccionada la Referencia > Microsoft Internet Control
Dim IE As Object, i As Long
Dim IdiomaOriginal As String, IdiomaSalida As String
Dim texto_traducido As String, Txt_Limpio

'Abrimos Internet Explorer
Set IE = CreateObject("InternetExplorer.application")

'Elegimos el idioma original del texto a traducir
'lo dejamos en Auto para que el sistema detecte cuál es...
IdiomaOriginal = "auto"

'Elegimos el idioma al que queremos traducirlo
'en este caso al español (es)   Ver listado códigos de idioma en el post.
IdiomaSalida = CodSalida

'hacemos invisible el navegador
IE.Visible = False
'Abrimos la web del traductor de Google
IE.navigate "http://translate.google.com/#" & IdiomaOriginal & "/" & IdiomaSalida & "/" & texto_a_traducir

'trabajamos sobre el traductor...
'ver también esta entrada del blog
'http://excelforo.blogspot.com.es/2014/10/vba-rellenando-un-formulario-web-html.html
Do Until IE.ReadyState = 4
    DoEvents
Loop
Application.Wait (Now + TimeValue("0:00:5"))
Do Until IE.ReadyState = 4
    DoEvents
Loop

'Obtenemos el texto traducido del campo de Google 'Result_box'
'sería algo así: <span class="hps">texto traducido</span>
'y lo dejamos limpio del código o etiquetas de html
'además con Split conseguimos separarlo en una matriz de valores.
Txt_Limpio = Split(Application.WorksheetFunction.Substitute(IE.Document.getElementById("result_box").innerHTML, "</SPAN>", ""), "<")
'en este paso recorremos los elementos de la matriz de elementos resultantes de la traducción
'y lo recomponemos en una frase (si fuera el caso)
For j = LBound(Txt_Limpio) To UBound(Txt_Limpio)
    texto_traducido = texto_traducido & Right(Txt_Limpio(j), Len(Txt_Limpio(j)) - InStr(Txt_Limpio(j), ">"))
Next

'cerramos Internet Explorer
IE.Quit
'devolvemos el texto traducido a la hoja de cálculo
Traducir = texto_traducido

End Function



Para localizar el código HTML del elemento por Id podremos seleccionar el código traducido y presionar Inspeccionar elemento desde el navegador. En este caso sería:



Un ejemplo del uso de la función 'Traducir':

VBA: Traduciendo a otros idiomas celdas en Excel.



Finalmente dejo aquí el listado de los códigos de idioma de Google:

2 comentarios:

  1. Buenos dias, muchas gracias por el codigo a la primera no me funciono pero despues de unos cambios menores funciona perfectamente. Los cambios fueron:

    1. la pagina web me toco ponerle translate.google.es
    2. Despues del loop puse un msgbox que dijera que se realizo la traducción de no ponerlo me sale en blanco el resultado

    Nuevamente muchas gracias,

    ResponderEliminar
    Respuestas
    1. Gracias por el comentario Juan Pablo!
      la verdad es que el código subido estaba probado y funcionando...
      No parece los cambios que has realizado sean sustanciales para un mejor funcionamiento... pero en todo caso, si con ellos lo has conseguido pues mejor :D

      Un cordial saludo!!!

      Eliminar