VBA的隐藏陷阱

5
这个问题旨在扩充位于VBA隐藏特性的问题。
VBA最大、最常见或最烦人的陷阱是什么?
请列出任何可能被描述为: - 程序员需要注意的事项 - 需要痛苦和不断变通的 VBA 行为。 - 经常导致错误的事情。 - 使程序员感到困惑的事情 - 与其他语言相比不寻常的语法或行为等。

2
我曾经考虑过添加另一个关于“On Error Resume Next”的答案,但后来我认为那是一个巨大的缺陷而不是一个隐藏的陷阱。 - Derrick Turk
Eric J:现在它是一个社区维基了。 - Kimball Robinson
3个回答

4
整个语言?
嗯,具体点说:
- `x = f(y)`、`f(y)`、`f y`、`Call f(y)` 这些代码的语义略有不同,取决于 `f` 是 `Function` 还是 `Sub`,以及 `y` 是 `ByRef` 还是 `ByVal`。 - 如果 `f` 是一个函数: - `x = f(y)` 就按照你期望的方式执行。 - `f(y)` 会调用 `f` 并且忽略返回值,但如果 `y` 是 `ByRef`,则它将作为特殊情况传递 `ByVal`。 - `f y` 是语法错误。 - `Call f(y)` 和上面的 `f(y)` 类似,但没有 `ByVal` 的限制。 - 另一方面,如果 `f` 是一个 `Sub`: - `f(y)` 是语法错误。 - `f y` 是正确的。 - `Call f(y)` 是语法错误。
万岁!

此外,本文还解释了一些额外的注意事项--例如当y是一个对象时,您不能使用括号。http://www.cpearson.com/Excel/byrefbyval.aspx - Kimball Robinson
1
@k.robinson:太棒了!我会把它加入书签,以防我再次被卷入宏维护的漩涡。 - Derrick Turk
@Derrick Turk:对于子程序,Call f(y) 绝对不是语法错误!此外,f(y) 将会编译,因为整个 (y) 将被视为参数,即包括括号。 - Jean-François Corbett
f(y)f y的区别在于前者跳过了关键字Call并将yByVal方式传递,而后者允许以ByRef方式传递。我认为这不是令人烦恼的事情,只是需要记住 :) - user2140173

3

由于我已经写了一段时间的VB.net,所以对我来说,在对象分配行前加上Set总是一个问题,例如:

Dim d as Object
Set D = CreateObject("SomethingUseful")

而不仅仅是

D = CreateObject("SomethingUseful")

虽然IDE不会报错,但你会得到一个运行时错误(对象引用未设置)。

但这基本上是VB.Net/VB6的区别,而不是特别针对VBA。


3

如果在64位系统上或使用Office 2010 x64进行API调用,您需要重新编写代码。您仍然可以在早期版本的VBA中编写它,但需要使用VBA7和/或Win64的条件编译变量。例如:

#If VBA7 Then
   Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
   Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If

这里有一篇关于it技术的文章:http://msdn.microsoft.com/en-us/library/ee691831(office.14).aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接