我目前正在使用Excel中的VBA项目,我需要解锁VBProject并锁定另一个VBProject。到目前为止,我一直在使用SendKeys,但我一直在读它不是一个好方法,那API更好? (例如,在此主题中:Unprotect VBProject from VB code)
但是,在我的研究期间,我找不到有关原因的详细信息。
有人可以告诉我为什么SendKeys确实不好?哪些事情可能出错? (请注意,我的SendKeys序列最多只有1.5秒。) 另外,为什么API是更好的方法?
谢谢! :)
答案 0 :(得分:3)
WinAPI使用窗口句柄之类的东西(您之前可能在代码中看到hWnd
?)来定位特定窗口。一旦你有这个,你可以发送和接收消息到该窗口,无论它的窗口状态(活动/非活动)等。
你正在使用对象直接 ,这就是编程的方式。
SendKeys()
方法只是模拟用户敲击键盘上的键,无论打开什么窗口和位置 - 因此它自然地将输出发送到任何活动的对象并能够接收它。
另一种思考方式
如果您正在编码以在VBA中的某个工作表的单元格中放置值,则可以执行以下操作:
Range("A1").Value = "Foo"
这一切都很好,但它假设我们想要的工作表是那个时刻的活动工作表。如果不是,则会填充错误工作表上的错误单元格。这实际上就是您使用SendKeys()
另一方面:
Workbooks("Target Workbook.xlsx").Sheets("Target Sheet").Range("A1").Value = "Foo"
在我们要定位的确切工作簿中指定精确工作表中的确切单元格 - 因此,如果该工作表在该时间点处于活动状态,则无需担心!它仍然会到正确的位置(这是你用API做的那种)
谨慎之词
如果您不知道自己在做什么,在VBA 中使用WinAPI 会有风险 - 这些方法的代码是在外部库中预编译的,这意味着您的VBE错误处理程序不会有任何用处。如果您在使用API时出错,则可能会损坏您的工作簿(或者更糟糕,具体取决于您实际执行的操作)。
您还需要在VBA中查看条件编译,因为您必须根据您是否使用32位或64位版本来声明函数和参数。