【分享成果,随喜正能量】心有时就跟屋子一样,需要定期打扫一下。该洗的洗,该丢的丢,然后再把喜欢的生活装进去,日子就会明亮起来。好好生活,好好爱自己,把期待降低,把依赖减少,你会过得更好。 。
《VBA信息获取与处理》教程(10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,二十个专题。今日分享内容是:VBA代码如何切换word和excel(2)
第二节 在word和excel两个应用程序间的激活操作
如我们的报告界面,当我们的界面继续往下进行,在第二个以及第三个按钮处我们要激活刚才打开的excel,这个按钮的代码该如何写呢?
2 利用API函数
如本讲的内容,在Word中使用代码自动化激活Excel,其实,在我们写程序的时候,会发现,当运行某个活动应用程序时(如word),从这个运行程序的代码激活另外一个应用程序作为主窗口(如在word运行时激活Excel窗口)对于用户来说是非常有用的。这时我们可以尝试使用上面的AppActivate语句,但这要求事先知道要激活的窗口的标题。而且,从实际的表现看,AppActivate有点给人不靠谱的感觉,有时工作,有时不工作(会提示:引发错误5,无效的过程调用)。所以,我给大家讲解下面的第二种方案就是调用API函数的方案。
我们可以使用几个简单的Windows API函数完成同样的任务。API是直接调用组成Windows的DLL库文件的过程。可以使用API函数完成VBA本身无法执行的操作。但是有一点值得注意。就是API没有VBA代码的错误处理功能,如果使用无效参数调用API函数,可能会导致Excel崩溃并丢失所有工作。API函数的使用应该非常谨慎。
以下代码将激活主Excel窗口并将键盘焦点设置为Excel中的活动工作表。我这里给出的代码在13版32位office中已经实测,在16版及64位ofiice或许不能完全得到你需要的效果,这一点要注意。当然为了保证代码应适用于其他的场合我给出的是通用的版本,可以将MyCLASS的值从xlmain更改为其他应用程序的WINDOW类从而完成实际的需要。
Option Compare Text '声明比较字符串数据时要使用的默认比较方法按TEXT比较。
' Window API 引用声明
#If VBA7 Then
Private Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal HWnd As LongPtr) As Long
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function SetFocus Lib "user32" (ByVal HWnd As LongPtr) As Long
#Else
Private Declare Function BringWindowToTop Lib "user32" (ByVal HWnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetFocus Lib "user32" (ByVal HWnd As Long) As Long
#End If
Private Sub CommandButton1_Click()
Dim Res As Long
Dim XLHWnd As Long
Const MyCLASS = "XLMAIN"
'假如有多个EXCEL运行,程序是无法判断是要激活哪一个EXCEL的;
'同时必须使用vbNullString调用,而不是""的空字符串的调用在FindWindow函数中两者有不同
XLHWnd = FindWindow(lpClassName:=MyCLASS, lpWindowName:=vbNullString)
If XLHWnd > 0 Then
'设置活动窗口
Res = BringWindowToTop(HWnd:=XLHWnd)
If Res = 0 Then
MsgBox "置顶激活错误,错误代码: " & CStr(Err.LastDllError)
Else
SetFocus HWnd:=XLHWnd
End If
Else
MsgBox "没有发现 Excel被打开"
End If
End Sub
代码截图:
【待续】
本节代码参考文件“001 在WORD中激活EXCEL.docm”
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:
【分享成果,随喜正能量】凡是经不起时光沉淀的生命喧嚣,都不算伤痛,更不算创伤,它就是像浮云片片,来了去了,如果你心大点,它既不是来也不是去,它就是一片风景。。