Excel se bloquea al ejecutar este simple programa

Soy totalmente newbie con VBA. He escrito este programa, y cada vez que lo ejecuto Excel se bloquea. Lo he analizado por todos lados y no sé qué está mal. Agradecería enormemente cualquier ayuda que podáis darme.

Básicamente quiero hacer lo siguiente. Quiero que el programa recorra una columna comprobando el valor de cada celda. Si el valor de la celda coincide con uno determinado, quiero que coja el valor de otra celda de la misma fila, y lo almacene en un sumatorio.

Una vez que termina de recorrer la columna, el programa devuelve el valor del sumatorio.

Aquí está el código:

Sub Mondays()
Sheets("Hoja1").Select
Dim m As Integer
Dim fila As Byte

fila = 1
m = 0

Do
If (Cells(fila, 2).Value = "Monday") Then
m = m + Cells(fila, 8).Value
fila = fila + 1
End If
Loop Until Cells(fila, 1).Value = Range("A24")
Range("J3").Value = m
End Sub

Respuesta
3

En principio hay 2 cosas que no me gustan, aunque eso no signifique que ese sea el problema:

1. Definiste fila como Byte: ¿Estás seguro que fila no 'crece'? Porque estás asignando fila = fila + 1, por lo que a priori podría hacer que el Byte se quede corto. Yo por las dudas lo definiría como Integer (y mejor aún, como Long)

2. La instrucción que cierra el ciclo Loop Until Cells(fila, 1).Value = Range("A24"), estás seguro que alguna vez se va a cumplir?

Podrías ejecutar el programa 'paso a paso' para ver si efectivamente el problema no es alguno de estos dos casos.

Salu2

Hola Gustavo,

Muchas gracias!

1. La variable fila sí crece. He cambiado este elemento tal y como recomiendas, pero aún así excel se bloquea y no obtengo resultado.

2. Debería cumplirse, sí. En la columna 1 (o A) hay fechas. Por lo que el ciclo debería parar al llegar a la fila 24.

Con ejecutar el programa paso a paso, ¿te refieres a depurar paso a paso?

Muchas gracias!

Respecto a depurar el programa es correcto, cuando llamás a la instrucción hay una forma de hacer que se ejecute 'paso a paso' y luego con la tecla F8 vas ejecutando de a un paso a la vez... ahí puedes ver si efectivamente se cumple la condición del Loop, porque estoy casi seguro que eso no ocurre y por eso se queda en un "ciclo eterno"

Efectivamente Gustavo. Ese es el motivo. ¿Alguna sugerencia de cómo podría escribir la condición de salida de forma que efectivamente se salga del bucle?

Muchas gracias!

Es que no sé que es lo que quisieras que suceda para que salga, porque en tu condición estás comparando contra la celda A24, ¿qué hay en esa celda (o que debería haber) para que salga?

Una solución, pero no sé si te servirá es que salga cuando se cumpla tu condición o la fila llegue a algún valor determinado (digamos 100).

Loop Until (Cells(fila, 1).Value = Range("A24")) OR (fila > 100)

Así parará cuando alguna de las 2 condiciones sea verdadera (si no se cumple la condición que tenías vos, entonces va a parar cuando fila sea mayor que 100)

Muchas gracias Gustavo.

En la columna 1 hay fechas. Y la condición de salida es una fecha determinada.

¿Y siempre va a existir esa fecha? Digo por la condición del =, sino lo que podrías hacer es reemplazarla por <= o >=, igualmente también tenés que cambiar la instrucción fila = fila + 1 como bien dice Andy, ya que esa deberías asegurar que se ejecuta siempre y así como está esto no es seguro

1 respuesta más de otro experto

Respuesta
1

A parte de que has elegido mal el tipo de Bucle, el problema esta en lo siguiente:

Para que tu bucle avance, debes aumentar el valor de fila, ¿correcto? Pero, hay un detalle, el valor de fila solo aumenta si la condición del IF es verdadera, si en tu primera iteración, el valor de la celda no es "Monday", fila nunca aumentará, y entrarás en un bucle infinito.

El operador de los bucles Do debe aumentar SIEMPRE si o si, sin ninguna condición, tu problema se solucionaría fácilmente sacando la instrucción fila = fila + 1 del condicional IF.


Ahora como dato extra, como lo tienes planteado, tu bucle NUNCA superará las 24 iteraciones, por lo tanto, al tu saber exactamente cuantas veces se va a ejecutar tu bucle, deberías usar un FOR en lugar de un DO.

En todos los lenguajes de programación hay básicamente 4 bucles y se dividen en dos grupos:

Do <- indefinido

Do While <- indefinido

For <- definido

For Each <- definido

Los bucles indefinidos son aquellos que en realidad no sabes cuando van a parar, por otro lado los definidos son los que tu mandas a ejecutar X cantidad de veces. En tu caso, tu sabes que solo serán posibles 24 iteraciones, así que deberías decir For fila = 1 to 24

¿Cómo se que son 24 iteraciones?

Porque Cells(fila, 1) siempre y absolutamente siempre será igual a Range("A24") cuando fila sea igual a 24.

Fila aumenta, en algún momento será 24 por lo que Cells(24, 1) es lo mismo que Range("A24")

Hola Andy,

Muchas gracias por tu respuesta detallada, y sobre todo por darte cuenta del problema del contador de la variable fila.

Creo que el tipo de bucle está bien elegido. La condición de salida es una fecha determinada, que puedo o no saber en qué fila está.

Para este programa he elegido la fila 24 para poder comprobar de manera manual que el resultado que proporciona el programa es correcto y que, por lo tanto, funciona.

Muchas gracias de nuevo!

Que raro, ya que esta "hardcoded", pero bueno... Es una buena practica y costumbre valorar las respuestas en este foro. Se te agradeceria mucho si cierras la pregunta valorando la respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas