¿Porqué se cambia el valor de un argumento si no se establece ésto por código?

Sucede que tengo una llamada a una subrutina con varios datos como argumentos (llamémosle: Sub A(1, 2, 3).

Esa subrutina (A) ejecuta otras subrutinas (sub B; sub C; sub N).

Antes de terminar de ejecutarse la subrutina (A), los valores que le he pasado como argumento se mantienen intactos con excepción de uno (supongamos el argumento 2), que cambia solito.

Para solucionar el problema he guardado el valor de ese argumento en una variable antes que se modifique sólo, pero mi pregunta es, ¿Por qué se modifica sólo?.

He seguido el código paso a paso, y puedo detectar que éste dato se cambia durante la ejecución del la subrutina (B), pero el problema es que no puedo ver cuándo se modifica ya que el valor (2) no tiene relación alguna con la subrutina (B). Es más, ni siquiera la paso como argumento, sí en cambio paso otros datos y ninguno sufre modificación.

Es raro, pero el problema es que si yo no analizo exaustivamente cada resultado y dato manipulado de manera constante, éste tipo de error no se detecta, y cuando el trabajo es para otras personas, no hay margen de error, sobretodo si manipula información numérica importante.

1 respuesta

Respuesta
1

Si el archivo es muy difícil dar con este tipo de errores. Lo que te puedo recomendar en caso que no lo hayas hecho aún es:

1. En el código incluye la opción 'Option Explicit' (esto ayuda a obligarte a que declares todas las variables)

2. Declara todas las variables de manera local dentro de cada procedimiento (sub/function)

3. En los procedimientos, salvo que tengas que modificar un parámetro, sino decláralo como ByVal (probablemente el error venga acá, ya que por default los parámetros se pasan como ByRef). Esto hace que aunque dentro del código se modifique la variable, cuando salga del mismo la variable mantendrá el valor previo a la llamada.

Salu2

Muchas gracias por el dato, probablemente el problema ronde por estos lares. Pero lo que no se es cómo declarar los parámetros de una función con su pasaje por valor. Yo supuse que siempre se pasaba por valor y no por referencia, ya que por lo general, no suelo modificar los valores que envío a una subrutina, porque son para pegar o manipular etc... No he tenido este inconveniente antes. Te agradecería que me indiques la sintaxis. Muchas gracias!!!

Te paso un mini ejemplo

Sub miProc(miVar1 As Long, ByRef miVar2 As Long, ByVal miVar3 As Long)
'Código
'...
End Sub

en este caso tanto miVar1, como miVar2 son pasadas por referencia (y se pueden modificar) y miVar3 es pasada por valor

Salu2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas