Excel VBA:为什么API比SendKeys更好?

时间:2016-05-10 09:00:24

标签: excel vba api excel-vba sendkeys

我目前正在使用Excel中的VBA项目,我需要解锁VBProject并锁定另一个VBProject。到目前为止,我一直在使用SendKeys,但我一直在读它不是一个好方法,那API更好? (例如,在此主题中:Unprotect VBProject from VB code

但是,在我的研究期间,我找不到有关原因的详细信息。

有人可以告诉我为什么SendKeys确实不好?哪些事情可能出错? (请注意,我的SendKeys序列最多只有1.5秒。) 另外,为什么API是更好的方法?

谢谢! :)

1 个答案:

答案 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位版本来声明函数和参数。