VBA隐藏的陷阱

时间:2010-03-22 20:01:30

标签: vba

此问题旨在增加Hidden features of VBA

中的隐藏功能问题

VBA最大,最常见或最烦人的陷阱是什么?

请列出可能被描述为

的任何内容
  • 程序员要小心
  • VBA行为需要痛苦且持续的解决方法。
  • 一直使错误容易产生的事情。
  • 让程序员感到困惑的事情
  • 与其他语言等相比的非常规语法或行为

3 个答案:

答案 0 :(得分:4)

整个语言?

呃,我会具体:事实:

  • x = f(y)
  • f(y)
  • f y
  • Call f(y)

所有语义都略有不同,具体取决于fFunction还是Sub以及yByRef还是ByVal

即使f是函数:

  • x = f(y)符合您的期望
  • f(y)会调用f并放弃返回值,但如果yByRef则会将ByVal作为特殊情况传递
  • f y是语法错误
  • Call f(y)与上面的f(y)相同,但没有ByVal警告

另一方面,如果fSub

  • 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