У меня есть эта функция, которая переводит все выбранные ячейки с помощью 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, """, """")
val = Replace(val, "%2C", ",")
val = Replace(val, "'", "'")
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
Кроме того, что происходит? Вы говорите, что это не работает... но что происходит? Выдает ошибку... в какой строке?
Привет герой Excel. Я просто получаю сообщение об ошибке, вызванное оператором Else.
Вы проверили, что такое objHTTP.responseText, когда вы достигаете этого оператора if? Он все еще включает div dir = "ltr"? Я предполагаю, что нет, так что это будет означать, что Google изменил что-то, что вам теперь нужно выяснить.


Я предполагаю, что 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 Я нашел ваш вопрос интересным и решил создать на его основе определяемую пользователем функцию. Я ответил на древний вопрос здесь с 2013 года только сейчас, используя UDF. Вам может быть полезно: stackoverflow.com/a/65417789/3566998
Рад слышать! Я обязательно этим тоже воспользуюсь. Еще раз спасибо :)
Пожалуйста, укажите код для
ConvertToGet()иRegexExecute()иClean().