VBA操作IE无法选择下拉列表,Oanda货币转换无响应求助
解决Oanda货币转换器VBA宏未触发转换逻辑的问题
我完全懂你的困扰——手动操作网页时输入数值会自动触发转换,但用VBA直接给输入框赋值后,网页的JavaScript转换逻辑完全没动静,还没法换其他网站。问题的核心很明确:直接通过VBA修改输入框的Value属性,不会触发网页绑定的JavaScript事件(比如change、input事件),而这些事件正是启动货币转换的关键触发点。
下面是针对你的代码的修复方案,我会逐点说明修改的原因:
关键修复点
- 给货币输入框和金额输入框赋值后,手动触发对应的JavaScript事件,让网页识别到值已变更
- 修正货币选择和结果获取的元素定位错误
- 优化等待逻辑,替换固定等待5秒的低效操作
修改后的完整代码
Sub converter() Dim ie As Object Dim doc As HTMLDocument Dim inputval, returnval As String Dim starttime As Double starttime = Timer Dim Curr1, Curr2 As String Dim i As Integer Dim mywb As Workbook Dim myws As Worksheet Set mywb = ThisWorkbook Set myws = mywb.Worksheets("Ui") Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True '导航至目标网站 ie.navigate "https://www1.oanda.com/currency/converter/" '等待浏览器完全加载 Do While ie.Busy Or ie.readyState <> 4 Application.Wait DateAdd("s", 1, Now) Loop Set doc = ie.document Range(Cells(4, 9), Cells(Rows.Count, 9)).ClearContents i = 0 Do While myws.Cells(4 + i, 4).Value <> "" Curr1 = myws.Cells(4 + i, 5).Value Curr2 = myws.Cells(4 + i, 7).Value inputval = myws.Cells(4 + i, 8).Value ' --- 设置目标货币并触发变更事件 --- With doc.getElementById("quote_currency_input") .Value = Curr1 ' 触发onchange事件,通知网页值已修改 .FireEvent "onchange" End With ' --- 设置基础货币并触发变更事件 --- With doc.getElementById("base_currency_input") .Value = Curr2 .FireEvent "onchange" End With ' --- 设置转换金额并触发变更事件 --- With doc.getElementById("base_amount_input") .Value = inputval .FireEvent "onchange" End With ' --- 等待转换结果加载完成 --- ' 循环等待结果框出现有效数值,避免固定等待的浪费 Do While doc.getElementById("quote_amount_input").Value = "" Or _ doc.getElementById("quote_amount_input").Value = "0" Application.Wait DateAdd("s", 0.5, Now) Loop ' --- 获取转换后的结果 --- returnval = doc.getElementById("quote_amount_input").Value myws.Cells(4 + i, 9).Value = returnval i = i + 1 Loop 'ie.Quit MsgBox "Currencies have been converted" & vbNewLine & "Time Taken - " & Format((Timer - starttime) / 86400, "hh:mm:ss") End Sub
代码细节说明
- 触发JavaScript事件:使用
.FireEvent "onchange"是IE浏览器中触发事件的兼容方式,网页的转换逻辑正是监听这个事件来执行的。手动输入时浏览器会自动触发,VBA则需要手动调用。如果onchange无效,可以尝试替换为.FireEvent "oninput",不同网页绑定的触发事件可能有差异。 - 修正元素操作:原代码中
doc.getElementById("base_currency_input").Item.innerText = Curr2是错误的,直接设置Value属性即可,配合事件触发就能完成货币选择。 - 优化等待逻辑:替换固定5秒等待为等待结果框出现有效数值,既节省时间又能确保结果已完成加载。
- 正确获取结果:转换后的目标货币金额存储在
quote_amount_input输入框中,原代码错误地获取了输入金额的框的值。
内容的提问来源于stack exchange,提问作者Rishabh Arora
相关产品推荐
相关产品推荐

