![aa8634b27569ae5d17a0f92443d5eebf.png](https://img-blog.csdnimg.cn/img_convert/aa8634b27569ae5d17a0f92443d5eebf.png)
VBA实践+excel英文逐句自动有道翻译为中文
有一个需求是这样的,如下图所示,在一个excel工作表中,B列是英文,每一个单元格一句英文,在C列要填英文对应的有道机译结果。为保证准确度,要求必须一句句翻译,不能把英文做成一个文档再上传有道翻译。
![9c113833f27ae5063a994e5a81f06f32.png](https://img-blog.csdnimg.cn/img_convert/9c113833f27ae5063a994e5a81f06f32.png)
尝试使用VBA代码模拟键盘和鼠标自动完成复制单元格英文-粘贴到有道客户端的输入框-等待翻译结果-复制翻译结果-粘贴到对应的单元格中的整个过程。代码实现环境为64位win8.1,64位excel2010,有道桌面客户端,代码如下。模拟的鼠标键盘按键可能会被网站、软件等拦截,用到其他地方不一定管用哦。
Private Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongPtr 'SetCursorPos函数把光标移到屏幕的指定位置
Private Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
'这是 VB API 函数声明,
'在 WINDOWS 系统中有个文件 kernel32.dll 动态连接(函数)库文件,里面包含好多WINDOWS 功能的函数。该声明是指,在所写的程序中要用到这个库文件中的一个函数 Sleep, 它的参数是dwMilliseconds.
'功能是,让这条语句的下一条语停顿 dwMilliseconds 时间后再运行。单位为毫秒
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2 '按下左键,&H2表示2的十六进制值
Private Const MOUSEEVENTF_LEFTUP = &H4 '释放左键,&H4表格4的十六进制值
Private Sub 单击()
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 '高版本系统如win10可能需要使用call调用ddl动态连接这样才能生效,如call mouse_event (MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0).https://blog.csdn.net/qq_39533125/article/details/75220288
Sleep 50
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
Sleep 100
End Sub
Sub 自动发送翻译()
Dim WS As Worksheet
Dim xPaste&, yPaste&, xCopy&, yCopy&, xClear&, yClear&
Dim i%
Dim myData As DataObject
Set WS = ThisWorkbook.Sheets("工作表1")
'粘贴位置
xPaste = 217
yPaste = 96
'复制按钮位置
xCopy = 198
yCopy = 551
'清除按钮位置
xClear = 610
yClear = 288
For i = 2 To 5
WS.Cells(i, 2).Copy
Sleep 500 '延时500毫秒
SetCursorPos xPaste, yPaste '把光标移动到屏幕输入框位置
DoEvents '会将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys 队列中的所有键也都已送出之后,返回控制权。
Sleep 500
Call 单击
DoEvents
Sleep 500
Application.SendKeys "^V" '粘贴英文到输入框
DoEvents
Sleep 500
SetCursorPos xCopy, yCopy
DoEvents
Sleep 2000 '等待翻译结果出来
Call 单击 '单击复制按钮,复制翻译结果
DoEvents
Sleep 500
SetCursorPos xClear, yClear
DoEvents
Sleep 500
Call 单击
DoEvents
'把翻译结果输入到单元格中
Set myData = New DataObject
With myData
.GetFromClipboard
If .GetText <> "" Then WS.Cells(i, 3).Value = .GetText '把剪贴板的文本放入到单元格
End With
Set myData = Nothing
Next i
MsgBox "完成"
End Sub
想要学习更多关于excel vba的知识,可以看看这个很实用的书。