Jump to content

Duda al cambiar el valor de una celda con Worksheet_Change


Maria_80

Recommended Posts

Hola,

Tengo una macro dentro del código de la Hoja1 donde con worksheet_change cada vez que una celda de la columna B cambia de KO a OK aparece un msgbox diciendo que la celda ha sido modificada. Hasta ahí todo bien. Pero lo que quiero es que si eso sucede en vez de que aparezca un msgbox con ese aviso (es algo que he puesto de forma provisional) el valor de la celda de al lado (columna C) sea igual a  “SI”. El caso es que no sé cómo referirme a la celda de al lado dentro del bucle que comprueba si la celda ha sido modificada de KO a OK. ¿Alguna idea?

Muchas gracias de antemano.

EJ_modificarcelda.xlsm

Link to comment
Share on other sites

Hola,

esta mi solución:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)


    Application.EnableEvents = False

    If Intersect(Target, Range("B:B")) Is Nothing Then
        GoTo handler
    End If
    
        
    Dim c As Range
    For Each c In Target
        If c = "OK" Then
           c.Offset(0, 1) = "SI"
        Else
           c.Offset(0, 1) = ""
        End If
    Next
        
handler:

    Application.EnableEvents = True

End Sub

 

Link to comment
Share on other sites

5 minutes ago, Frank2021 said:

Hola,

esta mi solución:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)


    Application.EnableEvents = False

    If Intersect(Target, Range("B:B")) Is Nothing Then
        GoTo handler
    End If
    
        
    Dim c As Range
    For Each c In Target
        If c = "OK" Then
           c.Offset(0, 1) = "SI"
        Else
           c.Offset(0, 1) = ""
        End If
    Next
        
handler:

    Application.EnableEvents = True

End Sub

 

Gracias, Fran. Voy a ver si consigo adaptarlo dentro del código que envío solo con el Offset(0,1). Necesito comprobar que ese OK es siempre después de un KO. Si el campo está en blanco y alguien escribe OK o, si ya existe un OK y alguien reescribe el OK de nuevo, al lado va a figurar "SI". Y ando buscando que ese SI se haga siempre cuando al OK precede un KO. Intento adaptar al código que envío y os cuento. gracias!

Link to comment
Share on other sites

Hola,

quizas te  vale esto:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    If Intersect(Target, Range("B:B")) Is Nothing Then
        GoTo handler
    End If
    
    Application.Undo
    
    Dim OldValue As Variant
    OldValue = Target.Value
    
    Application.Undo
 
    If OldValue = "KO" And Target.Value = "OK" Then
       Target.Offset(0, 1) = "SI"
    Else
       Target.Offset(0, 1) = ""
    End If
        
handler:

    Application.EnableEvents = True

End Sub

 

Edited by Frank2021
Link to comment
Share on other sites

1 minute ago, Frank2021 said:

Hola,

quizas te  vale esto:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    If Intersect(Target, Range("B:B")) Is Nothing Then
        GoTo handler
    End If
    
    Application.Undo
    
    Dim OldValue As Variant
    OldValue = Target.Value
    
    Application.Undo
 
    If OldValue = "KO" And Target.Value = "OK" Then
       Target.Offset(0, 1) = "SI"
    Else
       Target.Offset(0, 1) = ""
    End If
        
handler:

    Application.EnableEvents = True

End Sub

 

mil gracias! va fenomenal!

Lo acabo de conseguir resolver también así, incluyendo lo tuyo dentro de lo mío, por si os sirve:

 

For col = LBound(ValorAnterior, 2) To UBound(ValorAnterior, 2)

        valor1 = RangoTrabajo(contador)         'acual valor de la celda(después cambio)

        valor2 = ValorAnterior(fila, col)       'anterior valor de la celda (antes cambio)

        'si difieren entonces lanzamos mensaje
        
        If valor2 = "KO" And valor1 <> valor2 Then
        
        Dim c As Range
                 For Each c In Target
                     If c = "OK" Then
                        c.Offset(0, 1) = "SI"
                    Else
                        c.Offset(0, 1) = ""
                    End If
                Next
        
            MsgBox "celda modificada"
            
            'Columna C, celda de al lado = "SI"

        End If

        contador = contador + 1

    Next col

Next fila

 

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

Privacy Policy