2010-03-22 15 views
5

Esta pregunta tiene la intención de aumentar la pregunta Características ocultos en Hidden features of VBAtrampas ocultas de VBA

Cuáles son las dificultades más grandes, más comunes, o más molestos de VBA?

Por favor escriba cualquier cosa que pueda ser descrito como

  • programador tenga cuidado
  • comportamiento de VBA que requiere soluciones dolorosas y constantes.
  • Cosas que constantemente hacen que los errores sean fáciles de producir.
  • cosas que confunden a los programadores
  • sintaxis no convencional o el comportamiento en comparación con otros langauges, etc
+7

Wiki de la Comunidad? –

+2

Consideré agregar otra respuesta sobre 'On Resume Resume Next', pero pensándolo bien es una falla enorme en lugar de una trampa oculta. –

+0

Eric J: ahora es un wiki de la comunidad. –

Respuesta

3

Desde que he estado escribiendo VB.net por un tiempo, siempre es un problema para mí como prefijo asignación de objetos líneas con Set, como

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

en lugar de sólo

D = CreateObject("SomethingUseful") 

que el IDE no se quejaría, pero se obtiene un error de tiempo de ejecución (no se establece la referencia del objeto).

Pero esto es básicamente una diferencia VB.Net/VB6, no especialmente VBA.

4

¿El lenguaje completo?

Eh, voy a ser concreto: el hecho de que:

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

Todos tienen sutilmente semántica diferente, dependiendo de si f es un Function o Sub y si y es ByRef o ByVal.

A saber, si f es una función:

  • x = f(y) hace lo que esperas
  • f(y) no llamar f y descartar el valor de retorno, pero si y es ByRef será pasado ByVal como un especial caso
  • f y es un error de sintaxis
  • Call f(y) hace como f(y) arriba, pero sin la ByVal salvedad

Por otro lado, si f es una Sub:

  • f(y) es un error de sintaxis
  • f y es correcta
  • Call f(y) es un error de sintaxis

Huzzah!

+0

Esto de hecho aclaro algunas cosas para mí. +1! – PowerUser

+0

Además, este artículo explica algunos errores adicionales, como cuando y es un objeto, no puede usar paréntesis. http://www.cpearson.com/Excel/byrefbyval.aspx –

+1

@ k.robinson: ¡Excelente! Estoy marcando eso en caso de que alguna vez me arrastren a otro ejercicio macro de mantenimiento. –

3

Para cualquier llamada API en un sistema de 64 bits o con Office 2010 x64, debe volver a escribir el código. Todavía puede escribirlo en y para versiones anteriores de VBA, pero necesita usar variables de compilación condicional de VBA7 y/o Win64. Por ejemplo:

#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 

He aquí un artículo sobre ella http://msdn.microsoft.com/en-us/library/ee691831(office.14).aspx