Функция Google Translate для Excel не работает

У меня есть эта функция, которая переводит все выбранные ячейки с помощью Google Translate.

Я работал нормально в течение многих лет, но он внезапно перестал работать по какой-то причине.

Есть идеи, почему? Я использую Эксель 2010.

заранее спасибо

Sub TranslateCell()
        Dim getParam As String, trans As String, translateFrom As String, translateTo As String
        translateFrom = "en"
        translateTo = "fr"
        Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
        Dim r As Range, cell As Range
        Set cell = Selection
        For Each cell In Selection.Cells
            getParam = ConvertToGet(cell.Value)
            URL = "https://translate.google.fr/m?hl = " & translateFrom & "&sl = " & translateFrom & "&tl = " & translateTo & "&ie=UTF-8&prev=_m&q = " & getParam
            objHTTP.Open "GET", URL, False
            objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
            objHTTP.send ("")
            If InStr(objHTTP.responseText, "div dir = ""ltr""") > 0 Then
                trans = RegexExecute(objHTTP.responseText, "div[^""]*?""ltr"".*?>(.+?)</div>")
                cell.Value = Clean(trans)
            Else
                MsgBox ("Error")
            End If
        Next cell
    End Sub
'----Used functions----
Function ConvertToGet(val As String)
    val = Replace(val, " ", "+")
    val = Replace(val, vbNewLine, "+")
    val = Replace(val, "(", "%28")
    val = Replace(val, ")", "%29")
    ConvertToGet = val
End Function
Function Clean(val As String)
    val = Replace(val, "&quot;", """")
    val = Replace(val, "%2C", ",")
    val = Replace(val, "&#39;", "'")
    Clean = val
End Function
Public Function RegexExecute(str As String, reg As String, _
                             Optional matchIndex As Long, _
                             Optional subMatchIndex As Long) As String
    On Error GoTo ErrHandl
    Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = reg
    regex.Global = Not (matchIndex = 0 And subMatchIndex = 0) 'For efficiency
    If regex.Test(str) Then
        Set matches = regex.Execute(str)
        RegexExecute = matches(matchIndex).SubMatches(subMatchIndex)
        Exit Function
    End If
ErrHandl:
    RegexExecute = CVErr(xlErrValue)
End Function

Пожалуйста, укажите код для ConvertToGet() и RegexExecute() и Clean().

Excel Hero 22.12.2020 21:24

Кроме того, что происходит? Вы говорите, что это не работает... но что происходит? Выдает ошибку... в какой строке?

Excel Hero 22.12.2020 21:25

Привет герой Excel. Я просто получаю сообщение об ошибке, вызванное оператором Else.

Marrone 22.12.2020 21:35

Вы проверили, что такое objHTTP.responseText, когда вы достигаете этого оператора if? Он все еще включает div dir = "ltr"? Я предполагаю, что нет, так что это будет означать, что Google изменил что-то, что вам теперь нужно выяснить.

braX 22.12.2020 22:23
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
4
1 781
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что Google изменил HTML-код ответа, а DIV, который ищет ваш код для перевода, больше не является частью формата ответа.

Я побежал и получил действительную страницу ответа. Я изменил ваш код, чтобы он работал с этим «новым» ответом.

Попробуй это:

Sub TranslateCell()
    Dim objHTTP As Object, URL$
    Dim getParam As String, trans As String, translateFrom As String, translateTo As String
    translateFrom = "en"
    translateTo = "fr"
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    Dim r As Range, cell As Range
    Set cell = Selection
    For Each cell In Selection.Cells
        getParam = ConvertToGet(cell.Value)
        URL = "https://translate.google.fr/m?hl = " & translateFrom & "&sl = " & translateFrom & "&tl = " & translateTo & "&ie=UTF-8&prev=_m&q = " & getParam
        objHTTP.Open "GET", URL, False
        objHTTP.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
        objHTTP.Send
        'If InStr(objHTTP.responseText, "div dir = ""ltr""") > 0 Then
        If InStr(objHTTP.responseText, "<div class = ""result-container"">") Then
            'trans = RegexExecute(objHTTP.responseText, "div[^""]*?""ltr"".*?>(.+?)</div>")
            trans = RegexExecute(objHTTP.responseText, "div[^""]*?""result-container"".*?>(.+?)</div>")
            cell.Value = Clean(trans)
        Else
            MsgBox "Error"
        End If
    Next cell
End Sub

Вот оно! Теперь снова работает нормально. Большое спасибо, настоящий герой Excel :)

Marrone 22.12.2020 22:40

@Marrone Я нашел ваш вопрос интересным и решил создать на его основе определяемую пользователем функцию. Я ответил на древний вопрос здесь с 2013 года только сейчас, используя UDF. Вам может быть полезно: stackoverflow.com/a/65417789/3566998

Excel Hero 23.12.2020 02:15

Рад слышать! Я обязательно этим тоже воспользуюсь. Еще раз спасибо :)

Marrone 24.12.2020 15:24

Другие вопросы по теме