Macro para buscar por fila y no se repitan datos

Buenas tardes, estoy programando en excel y VB y necesito un código que al actualizar una celda osea en el evento Worksheet_SelectionChange en las columnas DE, F, H, J, L a partir de la fila 10 esas columnas albergan solo 2 datos sea SI o NO, el problema es que en la misma fila solo debe haber un solo si y las demás columnas mencionadas anteriormente deben quedar deshabilitadas osea que no le ingresen datos pero si llega a ser no en las otras se pueda ingresar el dato de si o no, ej:
Columnas
D F H J L M
SI         blanco las demas y bloqueadas                             20/sep/2010
            SI blanco las demás y bloqueadas 19/sep/2010
                         SI blanco las demás y bloqueadas 18/sep/2010
Así no me ingresan 2 SI en la misma fila, esto con el fin de saber si un marrano(cerda) al inseminarla son 5 intentos, y manda una fecha probable de parto a la columna M fila 10 y de hay hacia abajo sucesivamente.

1 respuesta

Respuesta
1
Pega este código en la hoja que contiene los datos. Afecta siempre queescribas si en mayúsculas en las celdas de las columnas de f h j
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
    If Target.Value = "SI" Then
        If ActiveSheet.Cells(Target.Row, 6).Value = "SI" Or ActiveSheet.Cells(Target.Row, 8).Value = "SI" Or ActiveSheet.Cells(Target.Row, 10).Value = "SI" Then
            Target.Value = ""
            MsgBox "No es posible duplicar datos"
        End If
    End If
Else
    If Target.Column = 6 Then
        If Target.Value = "SI" Then
            If ActiveSheet.Cells(Target.Row, 4).Value = "SI" Or ActiveSheet.Cells(Target.Row, 8).Value = "SI" Or ActiveSheet.Cells(Target.Row, 10).Value = "SI" Then
                Target.Value = ""
                MsgBox "No es posible duplicar datos"
            End If
        End If
    Else
        If Target.Column = 8 Then
            If Target.Value = "SI" Then
                If ActiveSheet.Cells(Target.Row, 4).Value = "SI" Or ActiveSheet.Cells(Target.Row, 6).Value = "SI" Or ActiveSheet.Cells(Target.Row, 10).Value = "SI" Then
                    Target.Value = ""
                    MsgBox "No es posible duplicar datos"
                End If
            End If
        Else
            If Target.Column = 10 Then
                If Target.Value = "SI" Then
                    If ActiveSheet.Cells(Target.Row, 4).Value = "SI" Or ActiveSheet.Cells(Target.Row, 6).Value = "SI" Or ActiveSheet.Cells(Target.Row, 8).Value = "SI" Then
                        Target.Value = ""
                        MsgBox "No es posible duplicar datos"
                    End If
                End If
            End If
        End If
    End If
End If
End Sub
Muchas gracias Experto por tomarte tu tiempo conmigo, mira coloque el código como me recomiendas y solo sale el mensaje cuando vuelvo y me paro en la columna que escribí SI, osea mira estas columnas DE, F, H, J, L las tengo con validación de datos -> permitir lista se puede seleccionar entre SI y NO, eso hace un efecto en estas columnas de cuadros combinados pero no lo son. Entonces escojo en una misma fila todos los SI y me los deja colocar con este código pero cuando devuelvo el curso ya sea con el mouse o las teclaas de fecha y me paro en dichas columnas hay si sale el mensaje de Duplicados. Lo que necesito es que cuando en alguna de estas columnas seleccione un SI, automáticamente las otras queden en Blanco. Como te dije antes requiero saber en cual SI fue inseminada una cerda y al lado de esa columna SI hay una fecha que es la que le sumo 114 días para que en la columna M aparezca la fecha probable de parto.
C                    D            E                F           G            H     I          J     K         L             M
1/9/2010       NO      19/9/2010    NO   9/10/2010    SI                                           31/1/2011
Como vez en la misma fila no se puede repetir el SI y donde este el SI hay que colocar en la columna M la fecha más 114 días más para la fecha probable de parto, no se si soy claro. Muchas gracias por colaborarme, quedo en espera.
Aquí dejo enlace de una foto del programa para que más o menos sepa como es el programa de excel que necesito
http://s3.subirimagenes.com:81/imagen/previo/thump_5219199dibujo.png
Has probado con los datos ya metidos sin validar o con la tabla en blanco o con todos NO menos un SI
Si y nada, necesito algo para que cuando ingrese el SI los otros 4 columnas queden en blanco o en NO, para poder hacer la operación, ya que si dice NO debo añadir a la fecha ultima de inseminación una cantidad de días para la próxima inseminación.
A mi me funciona que si tienes SI en otra columna de la misma fila no te deja poner SI y te borra el SI metido... ¿aun con la lista de valores
como tienes creado esa lista de valores?
Esas listas no están por código, están por el menu de datos y validador de datos, y por allá casi en la ultima fila y ultima columna tengo el SI y NO para tomar el rango de la lista desde allá. Por favor hazme el favor y me arreglas el código que me diste con este
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim fil, colum
For fil = 10 To 30
 For colum = 4 To 12 Step 2
    If Cells(fil, colum).Value = "SI" Or Cells(fil, colum).Value = "SI" Or Cells(fil, colum).Value = "SI" Or Cells(fil, colum).Value = "SI" Or Cells(fil, colum).Value = "SI" Then
        Cells(fil, 13).Value = Cells(fil, colum - 1).Value + 114
    Else
        Range("N11").Value = "feo"
                    End If
Next
Next
End Sub
En donde las columnas que le resto un -1 hay una fecha puesta, para que el la columna 13 y cualquier fila del 10 al 30 me coloque la fecha probable de parto.
Gracias
EL ERROR LO TIENES EN TU BUCLE FOR
Te en cuenta que estas comprobando 4 veces la misma celda con If Cells(fil, column). Value = "SI" porque el for no avanza hasta no hacer esa comprobación, el valor de fil y colum es el mismo en esa secuencia de if unidos con el or.
Ademas de que verficas todas las filas cuando cambias una sólo. Utiliza este código
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fil, COL, colum
fil = Target.Row
COL = Target.Column
If COL = 4 Then
    colum = 4
   If Cells(fil, colum).Value = "SI" Then
        Cells(fil, 13).Value = Cells(fil, colum - 1).Value + 114
        Cells(fil, colum + 2).Value = "NO"
        Cells(fil, colum + 4).Value = "NO"
        Cells(fil, colum + 6).Value = "NO"
    End If
End If
If COL = 6 Then
colum = 6
    If Cells(fil, colum).Value = "SI" Then
        Cells(fil, 13).Value = Cells(fil, colum - 1).Value + 114
        Cells(fil, colum - 2).Value = "NO"
        Cells(fil, colum + 2).Value = "NO"
        Cells(fil, colum + 4).Value = "NO"
    End If
End If
If COL = 8 Then
    colum = 8
    If Cells(fil, colum).Value = "SI" Then
        Cells(fil, 13).Value = Cells(fil, colum - 1).Value + 114
        Cells(fil, colum - 4).Value = "NO"
        Cells(fil, colum - 2).Value = "NO"
        Cells(fil, colum + 2).Value = "NO"
    End If
End If
If COL = 10 Then
    colum = 10
    If Cells(fil, colum).Value = "SI" Then
        Cells(fil, 13).Value = Cells(fil, colum - 1).Value + 114
        Cells(fil, colum - 6).Value = "NO"
        Cells(fil, colum - 4).Value = "NO"
        Cells(fil, colum - 2).Value = "NO"
    End If
End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas