You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA调用谷歌翻译报错424及70K批量数据提速方案咨询

关于VBA翻译脚本的错误排查与优化方案

一、Runtime Error 424(对象要求)的问题原因及修复

你碰到的这个错误,核心问题出在ie.Document.getElementById("result_box")这部分,主要有几个可能的诱因:

  • Google翻译页面结构变更:目前Google翻译的前端页面已经更新,result_box这个旧ID大概率已经被替换成了动态生成的新标识(比如现在检查页面的话,翻译结果容器可能用yDmH0d或其他CSS选择器定位),导致IE找不到对应对象。
  • 页面加载等待逻辑不完善:你虽然加了Application.Wait和两次ReadyState检查,但Google翻译是动态渲染页面,即使ReadyState显示为4(加载完成),翻译结果可能还没通过JS渲染出来,这时候去获取元素自然会返回空对象。
  • IE的兼容性缺陷:Google翻译现在对IE的支持已经非常有限,很多现代JS逻辑在IE里无法正常执行,直接导致页面元素无法正确加载。

临时修复思路(针对IE方案)

如果一定要继续用IE,可以调整等待逻辑和元素选择器:

' 替换原有的等待和元素获取代码段
Do While ie.Busy Or ie.ReadyState <> 4
    DoEvents
Loop
' 循环等待,直到找到翻译结果元素
Dim resultBox As Object
Set resultBox = Nothing
Do Until Not resultBox Is Nothing
    On Error Resume Next
    ' 改用CSS选择器定位英文结果容器
    Set resultBox = ie.Document.querySelector("div[lang='en']")
    On Error GoTo 0
    DoEvents
    Application.Wait Now + TimeValue("0:00:01")
Loop
' 直接提取文本内容
result_data = resultBox.innerText

二、70K+条数据的批量处理提速方案

用浏览器逐条处理70K条数据效率极低,每次都要加载页面、等待渲染,完全不适合批量场景。推荐以下两种更高效的方案:

方案1:使用Google翻译API(最优选择)

Google提供了官方翻译API,支持批量请求,速度快且稳定(需申请API密钥,有免费额度,超出后按用量收费)。VBA可以通过WinHTTP发送HTTP请求直接调用API,无需打开浏览器:

Sub BatchTranslateWithAPI()
    Dim http As Object, url As String, apiKey As String
    Dim dataArr As Variant, resultArr As Variant, i As Long
    apiKey = "你的API密钥" ' 替换为你的官方API密钥
    url = "https://translation.googleapis.com/language/translate/v2?key=" & apiKey
    
    ' 一次性读取所有数据到数组(减少工作表IO操作)
    dataArr = Sheet3.Range("A2:A" & Sheet3.Cells(Sheet3.Rows.Count, "A").End(xlUp).Row).Value
    ReDim resultArr(1 To UBound(dataArr, 1), 1 To 1)
    
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    
    For i = 1 To UBound(dataArr, 1)
        If dataArr(i, 1) <> "" Then
            http.Open "POST", url, False
            http.SetRequestHeader "Content-Type", "application/json"
            ' 转义文本中的引号,避免JSON格式错误
            http.Send "{""q"": """ & Replace(dataArr(i, 1), """", "\""") & """, ""target"": ""en"", ""source"": ""auto""}"
            
            ' 解析JSON结果(需导入VBA-JSON库)
            Dim json As Object
            Set json = JsonConverter.ParseJson(http.ResponseText)
            resultArr(i, 1) = json("data")("translations")(1)("translatedText")
        End If
    Next i
    
    ' 批量写入翻译结果
    Sheet3.Range("B2:B" & Sheet3.Cells(Sheet3.Rows.Count, "A").End(xlUp).Row).Value = resultArr
    MsgBox "批量翻译完成", vbOKOnly
End Sub

注意:需要先下载并导入VBA-JSON库到你的VBA项目中,才能解析API返回的JSON数据。

方案2:复用浏览器会话+批量打包文本

如果不想使用API,可以复用同一个浏览器窗口,将多条文本(比如100条)用换行符合并后一次性输入翻译,再拆分结果。这种方式能大幅减少页面加载次数,提升批量处理效率。

三、用Chrome替代IE执行翻译的实现思路

当然可以用Chrome替代IE,推荐使用Selenium Basic——这是一个能在VBA中调用的WebDriver工具,支持Chrome、Firefox等现代浏览器,速度和兼容性远优于IE。

步骤1:安装依赖

  1. 下载并安装Selenium Basic
  2. 下载与你的Chrome版本匹配的ChromeDriver,放到Selenium Basic的安装目录(比如C:\Program Files\SeleniumBasic

步骤2:VBA代码示例

Sub TranslateWithChrome()
    Dim driver As New ChromeDriver
    Dim dataArr As Variant, resultArr As Variant, i As Long
    
    ' 读取所有待翻译数据到数组
    dataArr = Sheet3.Range("A2:A" & Sheet3.Cells(Sheet3.Rows.Count, "A").End(xlUp).Row).Value
    ReDim resultArr(1 To UBound(dataArr, 1), 1 To 1)
    
    ' 启动Chrome并打开翻译页面
    driver.Start "chrome"
    driver.Get "https://translate.google.com/"
    
    For i = 1 To UBound(dataArr, 1)
        If dataArr(i, 1) <> "" Then
            ' 清空输入框并输入待翻译文本
            driver.FindElementById("source").Clear
            driver.FindElementById("source").SendKeys dataArr(i, 1)
            
            ' 等待翻译结果加载完成
            Do While driver.FindElementByCss("div[lang='en']").Text = ""
                DoEvents
            Loop
            
            ' 获取翻译结果
            resultArr(i, 1) = driver.FindElementByCss("div[lang='en']").Text
        End If
    Next i
    
    ' 批量写入结果到工作表
    Sheet3.Range("B2:B" & Sheet3.Cells(Sheet3.Rows.Count, "A").End(xlUp).Row).Value = resultArr
    
    driver.Quit
    MsgBox "翻译完成", vbOKOnly
End Sub

注意:要在VBA编辑器的「工具→引用」中勾选Selenium Type Library,才能正常调用相关对象。


内容的提问来源于stack exchange,提问作者Linga

火山引擎 最新活动