Search code examples
vbaexcel-2010vba6

Google translate cell value using VBA


I'm trying to convert other languages to English using auto detect by triggering the below code.

Sub transalte_using_vba()

Dim ie As Object, i As Long
Dim inputstring As String, outputstring As String, text_to_convert As String, result_data As String, CLEAN_DATA

Set ie = CreateObject("InternetExplorer.application")
        
        inputstring = "auto"
    
        outputstring = "en"
        
        text_to_convert = Sheet3.Range("A2")

 'open website

    ie.Visible = False
    ie.navigate "http://translate.google.com/#" & inputstring & "/" & outputstring & "/" & text_to_convert
   
    Do Until ie.ReadyState = 4
        DoEvents
    Loop
  
    Application.Wait (Now + TimeValue("0:00:5"))
    
    Do Until ie.ReadyState = 4
        DoEvents
    Loop

    CLEAN_DATA = Split(Application.WorksheetFunction.Substitute(ie.Document.getElementById("result_box").innerHTML, "</SPAN>", ""), "<")

    For i = LBound(CLEAN_DATA) To UBound(CLEAN_DATA)
        result_data = result_data & Right(CLEAN_DATA(i), Len(CLEAN_DATA(i)) - InStr(CLEAN_DATA(i), ">"))
    Next
    Sheet3.Range("B2") = result_data
    ie.Quit
    MsgBox "Done", vbOKOnly
    
End Sub

However i'm facing Runtime error 424 object required in line CLEAN_DATA = Split(Application.WorksheetFunction.Substitute(ie.Document.getElementById("result_box").innerHTML, "</SPAN>", ""), "<")

What is wrong with the code?

This code is working bit slow.. as I need to work on bulk data more than 70K is there any quick way to do this?

In my system I have google chrome as default browser and can we use it for translation, which may help to run the script faster?


Solution

  • A solution based on Internet Explorer is very slow by definition. Please, try the next function:

    Private Function GTranslate(strInput As String, strFromLang As String, strToLang As String) As String
        Dim strURL As String, objHTTP As Object, objHTML As Object, objDivs As Object, objDiv As Variant
        
        strInput = WorksheetFunction.EncodeURL(strInput)
        strURL = "https://translate.google.com/m?hl=" & strFromLang & _
            "&sl=" & strFromLang & _
            "&tl=" & strToLang & _
            "&ie=UTF-8&prev=_m&q=" & strInput
            
        Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
        objHTTP.Open "GET", strURL, False
        objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
        objHTTP.Send ""
        
        Set objHTML = CreateObject("htmlfile")
        With objHTML
            .Open
            .Write objHTTP.responseText
            .Close
        End With
        
        Set objDivs = objHTML.getElementsByTagName("div")
        For Each objDiv In objDivs
            If objDiv.className = "t0" Then
                GTranslate = objDiv.innerText: Exit For
            End If
        Next objDiv
        
        Set objHTML = Nothing: Set objHTTP = Nothing
    End Function
    

    It can be tested in this simple way:

    Sub testTranslateG()
      Debug.Print GTranslate("Libro muy grande", "auto", "en")
    End Sub
    

    Or to translate the cells value in a range:

    Private Sub Google_translate()
      Dim thisWbs As Worksheet
      Dim i As Long, lastRow As Long
      
      Set thisWbs = ActiveSheet
      lastRow = thisWbs.Range("B" & rows.count).End(xlUp).row
      thisWbs.Range("C2:C" & lastRow).Clear
      
      For i = 2 To lastRow
        thisWbs.Range("C" & i).Value = GTranslate(thisWbs.Range("B" & i).Value, "auto", "en")
      Next i
      MsgBox "Ready..."
    End Sub
    

    In order to obtain a more accurate translation, you can use (instead of "auto"): "es" for Spanish, "ru" for Russian, "ro" for Romanian, "nl" for "Duch" etc. You can find a language abbreviation by looking into Google Translate source and searching for 'English'. You will find an area where all possible language appear with their abbreviation to be used...