如我们的报告界面,当我们的界面继续往下进行,在第二个以及第三个按钮处我们要激活刚才打开的excel,这个按钮的代码该如何写呢?
1 用AppActivate语句
利用AppActivate语句激活EXCEL是非简单的,我们看下面的按钮代码:
Private Sub CommandButton2_Click()
AppActivate “Microsoft Excel”
End Sub
代码的截图:
代码讲解:我们先看看AppActivate语句的语法:
语法:AppActivate title [, wait]
参数title;是必须的,这是应用程序的名称,正如它显示在应用程序窗口的标题栏那样,或者它也可以是Shell函数返回的任务ID号码。注意,参数title要跟每个正运行的应用程序的标题字符串进行对比,如果没有精确的匹配,那么任何标题字符串里前面的字符和参数title一致的应用程序就会被激活。(例如,你要激活Excel,那么title参数应该是”Microsoft Excel”,如果你写的是”Microsoft”,那么激活的就也可能是Word,PowerPoint……)。
第二个参数wait是可选的,它是个布尔值(True或False),明确VB什么时候激活应用程序。如果在这里是False的话,该应用程序就立即会被激活,甚至被调应用程序并没有焦点。如果在wait参数处放置True的话,那么被调的应用程序就会等到它有了焦点,然后才会激活该应用程序。
例如,要激活Word,你就得输入下列语句:AppActivate “Microsoft Word”注意,应用程序名称用双引号引用起来。
也可以使用Shell函数返回的数值作为语句AppActivate的参数,例如:
Sub mynz()
ReturnValue = Shell(“C:Microsoft OfficeOfficeWord.exe”,1)
AppActivate ReturnValue
End sub
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 引用声明
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
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
代码截图:
代码讲解:上述代码在头部建立了引用API函数的声明,在代码中首先会查找excel程序,如果找到会将EXCEL置顶。此程序将激活主EXCEL程序,并获得焦点,注意:如果打开VBA编辑器,此操作将无法正常工作。如果打开VBA编辑器窗口,系统将设置焦点到那个窗口,而不是XLMAIN窗口。此代码可以激活任何应用程序,只需更改myCLASS到应用程序主窗口的类,这里我给大家一些常见的OFFICE应用程序常见的类:
Excel 97、2000、2002、2003、2007、2013 为 XlMain
Word 97、2000、2002、2003、2007、2013 为OpusApp
Access 2000、2002、2003、2007、2013 为OMain
下面我们看看上述代码的详细讲解:
① Const MYCLASS = “XLMAIN”
获取主’Excel应用程序窗口的窗口句柄(“XLMAIN”)。如果”正在运行Excel的多个实例”,您无法控制将检索哪个实例的HWnd。
② XLHWnd = FindWindow(lpClassName:=MyCLASS, lpWindowName:=vbNullString)
在调用’ FindWindow时,你必须使用vbNullString不是一个空字符串””,当调用API函数时,vbNullString和空字符串””之间有区别。
③ BringWindowToTop(HWnd:=XLHWnd) 将应用程序置顶
函数语法: BringWindowToTop(HWND hWnd);
函数功能:该函数将指定的窗口设置到Z序的顶部。如果窗口为顶层窗口,则该窗口被激活;如果窗口为子窗口,则相应的顶级父窗口被激活。
参数:hWnd: 设置到Z序的顶部的窗口句柄。
返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,可以调用GetLastError函数。
④ FindWindow用法
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
函数语法:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
参数:IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如”计算器”,所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如”记事本”,如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0。
⑤关于句柄,句柄是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。
⑥ SetFocus HWnd:=XLHWnd
设置焦点。
本节知识点回向:在本节中我们讲了如何做到在不同的应用程序间切换,主要利用了两种方案,一种是利用API函数,要查找到程序的局部然后置顶,一种是利用了AppActivate,这两种方法在应用上要注意测试,对于前者要注意所用的office是否合适于这种应用,后者要注意应用的稳定性。本讲的知识点:
① AppActivate 如何应用。
② FindWindow 和 SetFocus 如何应用。
③ 上述两种应用的优缺点分析。
④ 理解API函数声明与OFFICE版本的关系。
本节代码参考文件”001 在WORD中激活EXCEL.docm”
在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!学习VBA是个过程,也需要经历一种枯燥的感觉,如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。
“水善利万物而不争”,绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,用一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。学习时微而无声,利用时则巨则汹涌。
VBA是利用Office实现自己小型办公自动化的有效手段,我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了六部VBA专门教程。
第一套:VBA代码解决方案 是VBA中各个知识点的讲解,覆盖绝大多数的VBA知识点,初学必备;
第二套:VBA数据库解决方案 数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。
第三套:VBA数组与字典解决方案 数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习,是初级及中级人员代码精进的手段。
第四套:VBA代码解决方案之视频 是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。
第五套:VBA中类的解读和利用 这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。
第六套教程:《VBA信息获取与处理》,这是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。
学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。这些教程也是为帮助大家起航,助上我自己之力,我的上述教程是我多的经验的传递,大家可以根据1,3,2,6,5或者是4,3,2,6,5的顺序逐渐深入的逐渐学习。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。