此问题旨在增加Hidden features of VBA
中的隐藏功能问题VBA最大,最常见或最烦人的陷阱是什么?
请列出可能被描述为
的任何内容答案 0 :(得分: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)
是语法错误好哇!
答案 1 :(得分:3)
由于我已经写了一段时间的VB.net,因此我总是有一个问题是使用Set
作为对象赋值行的前缀,例如
Dim d as Object
Set D = CreateObject("SomethingUseful")
而不仅仅是
D = CreateObject("SomethingUseful")
IDE不会抱怨的,但是你得到一个运行时错误(未设置对象引用)。
但这基本上是VB.Net/VB6的区别,尤其不是VBA。
答案 2 :(得分: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
这是一篇关于它的文章http://msdn.microsoft.com/en-us/library/ee691831(office.14).aspx