Este tema le ofrece algunos consejos sobre los problemas que pueden surgir al programar en Visual Basic.
Uso de la instrucci贸n Set al asignar la propiedad Value a variables
Problemas al utilizar valores de color de tipo OLE_COLOR
Eliminaci贸n de objetos FlexPro de una lista dentro de un bucle For-Each
Conversi贸n de n煤meros en cadenas con la funci贸n CStr
Evitar mensajes de error en acciones totalmente automatizadas
Evaluaci贸n de expresiones en VBA (nota para desarrolladores de C/C++)
Uso de la instrucci贸n Set al asignar la propiedad Value a variables
Al asignar la propiedad Value de un objeto ValueObject a una variable, hay que asegurarse de que la propiedad Value es de tipo Variant y puede devolver no solo campos o valores escalares, sino tambi茅n valores complejos, se帽ales y listas. Los valores complejos, se帽ales y listas son en s铆 mismos objetos en FlexPro y deben ser asignados a variables usando la instrucci贸n Set.
La siguiente instrucci贸n solo es una asignaci贸n de valor v谩lida si el valor de oValueObject no es ni complejo, ni se帽al, ni lista:
Dim聽vtValue聽As聽Variant
Dim聽oValueObject聽As聽ValueObject
聽聽聽聽...
vtValue聽=聽oValueObject.Value
Si oValueObject.Value es complejo, una se帽al o una lista, se muestra el mensaje de error "Object does not support this property or method". Utilice la instrucci贸n Setcuando asigne valores complejos, se帽ales o listas:
set聽vtValue聽=聽oValueObject.Value
Si al escribir una macro no se sabe si un valor es complejo o real en tiempo de ejecuci贸n, puede utilizarse la instrucci贸n IsObject para garantizar que no se produzca ning煤n error al ejecutar la macro:
If聽IsObject(oValueObject.Value)聽Then
聽聽聽聽Set聽vtValue聽=聽oValueObject.Value
Else
聽聽聽聽vtValue聽=聽oValueObject.Value
End聽If
Si el valor de oValueObject es un objeto, se utiliza la instrucci贸n Set, en caso contrario el valor debe asignarse con "=".
Problemas al utilizar valores de color de tipo OLE_COLOR
El tipo OLE_COLOR es un tipo de datos est谩ndar de OLE para almacenar valores de color RGB. El tipo de datos se declara - en C/C++ - como un valor long sin signo. VBA no admite valores sin signo. Por este motivo, a veces pueden surgir problemas al utilizar OLE_COLOR. El siguiente c贸digo conduce al mensaje de error "La variable utiliza un tipo de automatizaci贸n no admitido en Visual Basic":
If聽ActiveDatabase.ActiveObject.Selection.FillFormat.Color聽<>聽_
聽聽聽聽fpColorRed聽Then
聽聽聽聽...
End聽If
Este mensaje de error puede evitarse de dos maneras. O bien se convierte el valor de color en un valor long antes de la comparaci贸n
If聽CLng(ActiveDatabase.ActiveObject.Selection.FillFormat.Color)聽<>聽_
聽聽聽聽fpColorRed聽Then
聽聽聽聽...
End聽If
o se introduce una variable del tipo OLE_COLOR, se le asigna el valor de color y luego se utiliza la variable reci茅n introducida para la comparaci贸n:
聽 聽Dim clr As OLE_COLOR
聽 聽clr = ActiveDatabase.ActiveObject.Selection.FillFormat.Color
聽 聽If clr <> fpColorRed Then
聽 聽 聽 聽...
聽 聽End If
Eliminaci贸n de objetos FlexPro de una lista dentro de un bucle For...Each
Debe evitarse el borrado de objetos FlexPro de una lista mediante un bucle For...Each, ya que puede dar lugar a resultados no deseados o provocar que no se recorran todos los elementos de la lista.
Si desea eliminar los elementos de cualquier lista de objetos FlexPro, el siguiente c贸digo, por ejemplo, producir谩 el resultado deseado:
While聽oColl.Count聽>聽0
聽聽聽聽oColl.Remove聽1
Wend
o
While聽oColl.Count聽>聽0
聽聽聽聽oColl(1).Delete
Wend
Conversi贸n de n煤meros en cadenas con la funci贸n CStr
Si utiliza la funci贸n CStr para convertir n煤meros en cadenas, tenga en cuenta que esta funci贸n siempre utiliza la regi贸n y las opciones de idioma (Locale) actuales para la conversi贸n. En un sistema espa帽ol, los d铆gitos antes y despu茅s del decimal se separan con una ",", mientras que en un sistema ingl茅s se utiliza ".". Si desea realizar la conversi贸n num茅rica independientemente de la configuraci贸n del sistema, debe utilizar la funci贸n de la API de Windows SetLocaleInfo para cambiar temporalmente la configuraci贸n del sistema. Puede ver c贸mo se utiliza esta funci贸n de la API en el ejemplo Un filtro de importaci贸n personalizado.
Evitar mensajes de error en acciones totalmente automatizadas
En el caso de acciones totalmente automatizadas que deban ejecutarse sin interacci贸n del usuario, debe garantizarse en primer lugar que todos los errores se traten en las propias macros (uso coherente de la instrucci贸n On Error). Adem谩s, en el entorno Visual Basic, en Extras > Opciones en la pesta帽a General, el ajuste de Interrupci贸n en caso de error debe establecerse en En caso de errores no procesados, ya que de lo contrario el flujo del programa puede detenerse en caso de posibles errores permitidos, se muestra el error y se requiere una acci贸n del usuario (v茅ase tambi茅n la propiedad DisplayAlerts del objeto Application).
Evaluaci贸n de expresiones en VBA (nota para desarrolladores de C/C++)
A diferencia de C/C++, donde las expresiones solo se eval煤an de izquierda a derecha el tiempo necesario durante la evaluaci贸n de la condici贸n, VBA siempre eval煤a la expresi贸n completa.
La siguiente expresi贸n C/C++
聽(1)聽if(exp1聽&&聽exp2)
聽聽聽聽聽聽聽聽...
corresponde en VBA a
聽(2)聽If聽exp1聽And聽exp2聽Then
聽聽聽聽聽聽聽聽...
Si en (1) exp1 ya devuelve False en (1), exp2 ya no se eval煤a, sino que el c贸digo de la instrucci贸n If se ejecuta inmediatamente. En (2) exp2 se eval煤a independientemente de si exp1 devuelve False o no. Si se supone que exp1 devuelve True para que exp2 sea v谩lido, la instrucci贸n debe descomponerse en VBA:
If聽exp1聽Then
聽聽聽聽...
聽聽聽聽If聽exp2聽Then
聽聽聽聽聽聽聽聽...
聽聽聽聽End聽If
聽聽聽聽聽聽聽聽...
End聽If