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

我目前正在Excel中的一个VBA项目,我需要解锁一个VBProject,并locking另一个VBProject。 到目前为止,我一直在用SendKeys来做这件事,但是我一直在读,它不是一个好的方法,而且API更好? (例如在这个线程中: 从VB代码解除VBProject的保护 )

然而,我无法find任何详细的信息,为什么在我的研究。

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

谢谢! 🙂

WinAPI使用诸如窗口句柄之类的东西(你可能已经在代码中看到了hWnd ?)来定位一个特定的窗口。 一旦你有这个,你可以发送和接收消息,该窗口,无论它的窗口状态(主动/非主动)等

您正在直接使用对象,这是编程的方式。

SendKeys()方法只是模拟用户在键盘上敲击键,而不pipe打开哪个窗口和哪里 – 所以它自然地将输出发送到任何活动的对象并且能够接收它。


另一种思考方式

如果您正在编码以在VBA中的某个工作表的单元格中放置值,则可以执行以下操作:

 Range("A1").Value = "Foo" 

这一切都很好,但是假设我们要的表格是那个时刻的活动表格。 如果不是,错误表单中的错误单元格将被填充。 这实际上是你在用SendKeys()

另一方面:

 Workbooks("Target Workbook.xlsx").Sheets("Target Sheet").Range("A1").Value = "Foo" 

在准确的工作表中指定准确的单元格,在我们想要定位的确切工作簿中 – 因此,如果该表单在该时间点处于非活动状态,则不用担心! 它仍然会去正确的地方(这是你在做什么用API)


一个小心的词

在VBA中使用WinAPI 可能会有风险,如果您不知道自己在做什么 – 这些方法的代码是预编译在外部库中的,这意味着您的VBEerror handling程序不会有任何用处。 如果您在API中犯了错误,您可能会损坏工作簿(或者更糟糕的取决于您实际执行的操作)。

您还需要查看VBA中的条件编译,因为您必须根据您使用的是32位版本还是64位版本来声明函数和参数。