【分享成果,随喜正能量】心有时就跟屋子一样,需要定期打扫一下。该洗的洗,该丢的丢,然后再把喜欢的生活装进去,日子就会明亮起来。好好生活,好好爱自己,把期待降低,把依赖减少,你会过得更好。 ​​。

《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实践经验,全部浓缩在下面的各个教程中,教程学习顺序:


【分享成果,随喜正能量】凡是经不起时光沉淀的生命喧嚣,都不算伤痛,更不算创伤,它就是像浮云片片,来了去了,如果你心大点,它既不是来也不是去,它就是一片风景。。