Excel - Sub Worksheet_Change me da bucle infinito

 
Vista:
Imágen de perfil de Juan Manuel
Val: 3
Ha aumentado su posición en 10 puestos en Excel (en relación al último mes)
Gráfica de Excel

Sub Worksheet_Change me da bucle infinito

Publicado por Juan Manuel (2 intervenciones) el 03/11/2019 13:24:58
Saludos, el siguiente change me da bucle infinito de mensajes al ingresar un dato erroneo ¿Que puedo hacer?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Sub Worksheet_Change(ByVal Target As Range)
Dim BandCeldaMOD As Boolean
If Application.Intersect(Target, Range("$C$6,$B$10")) Is Nothing Then
   Exit Sub
Else
    If BandCeldaMOD = False Then
     Select Case Target.Address
            Case "$C$6"
                If Not IsNumeric(Target.Value) Or Target.Value < 1 Then
                    MsgBox "El codigo del producto debe ser un valor numerico mayor que 0"
                    Target = Empty
                    BandCeldaMOD = True
                    Target.Select
                End If
            Case "$B$10"
                If Not WorksheetFunction.IsText(Target.Value) Then
                    MsgBox "El nombre del producto debe ser un valor alfanumerico"
                    Target = Empty
                    BandCeldaMOD = True
                    Target.Select
                End If
     End Select
     Else
     BandCeldaMOD = False
    End If
End If
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Sub Worksheet_Change me da bucle infinito

Publicado por Antoni Masana (2477 intervenciones) el 04/11/2019 15:57:20
Para entender el problema primero hay que saber y entender que estamos haciendo y que queremos hacer porque si no lo sabemos no sabremos que estamos haciendo mal.

Otra cosa que también es conveniente saber es comó depurar una macro.

Primero que estamos haciendo:

Esta macro se activa cada vez que se modifica una celda.

¿Que pasa si se modifica la celda dentro de la macro?

Que se vuelve a llamar a la macro.

¿Como puedo ver que esto que dices es verdad?

Te colocas en la primera linea ejecutable del código, en este caso el IF, los Dim no son ejecutables, y pulsas F9. Vuelves al libro y modificas la celda, se ejecuta la macro y separa en la línea marcada y pulsando la tecla F8 puedes seguir paso a paso lo que hace y ves que cuando llega a la instrucción Target = Empty vuelve al principio, en realdad lo que hace es como si hiciese una llamada a si misma o un CALL.

Vale lo entiendo pero ¿como se arregla?

Podrías hacerlo con la variable BandCeldaMOD si estuviese bien puesta y bien definida, porque debería estar definida como estática pero en este caso no es la mejor solución.

La mejor solución es esta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim BandCeldaMOD As Boolean
 
    If Application.Intersect(Target, Range("$C$6,$B$10")) Is Nothing Then
        Exit Sub
    Else
        Select Case Target.Address
            Case "$C$6"
                If Not IsNumeric(Target.Value) Or Target.Value < 1 Then
                    MsgBox "El codigo del producto debe ser un valor numerico mayor que 0"
                    Application.EnableEvents = False: Target = Empty
                    Application.EnableEvents = True:  Target.Select
                End If
 
            Case "$B$10"
                If Not WorksheetFunction.IsText(Target.Value) Then
                    MsgBox "El nombre del producto debe ser un valor alfanumerico"
                    Application.EnableEvents = False: Target = Empty
                    Application.EnableEvents = True:  Target.Select
                End If
        End Select
    End If
End Sub

o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim BandCeldaMOD As Boolean
 
    If Application.Intersect(Target, Range("$C$6,$B$10")) Is Nothing Then  Exit Sub
 
    Select Case Target.Address
        Case "$C$6"
            If Not IsNumeric(Target.Value) Or Target.Value < 1 Then
                MsgBox "El codigo del producto debe ser un valor numerico mayor que 0"
                Application.EnableEvents = False: Target = Empty
                Application.EnableEvents = True:  Target.Select
            End If
 
        Case "$B$10"
            If Not WorksheetFunction.IsText(Target.Value) Then
                MsgBox "El nombre del producto debe ser un valor alfanumerico"
                Application.EnableEvents = False: Target = Empty
                Application.EnableEvents = True:  Target.Select
            End If
    End Select
End Sub

¿Que hace?

Desactivar los eventos cuando se ejecuta una instrucción que puede evocar un eventos. Es como desactivar la macros mientras ejecutas una macro, bueno no es como, es exactamente eso.


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar