Como armo un código vsb para que al poner un valor en un rango de columnas me tire un estado con descripción en otra columna...

Estimado Dante buenos días, este es el código fuente de mi macro,

Private Sub Worksheet_Change(ByVal Target As Range)
Chau_Eventos
Dim col As Integer
Dim i As Integer
Dim caso As Integer
For i = 33 To 64
'Analiza las opciones de las condiciones y les atribuye un numero de caso
If Range("C" & i).Value = "" Then
caso = 1
Else
If Range("C" & i).Value >= 13.2 And Range("C" & i).Value <= 33 Then
caso = 2
Else
If Range("C" & i).Value > 33 And Range("C" & i).Value <= 66 Then
caso = 3
Else
If Range("C" & i).Value > 66 And Range("C" & i).Value <= 500 Then
caso = 4
End If
End If
End If
End If

Select Case caso
Case 1 'celda vacia
Range("H" & i).Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Chau_Eventos
Range("H" & i).Value = ""
'Hola_Eventos
Case 2 'entre 13.2 y 33
'evaluo si la distancia de seguridad sea mayor o igual a 0.8
If Range("G" & i).Value >= 0.8 Then
Range("H" & i).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Chau_Eventos
Range("H" & i).Value = "Distancia de ley cumplimentada en MT"
'Hola_Eventos
'sino se cumple lo anterior, será menor que 0.8
Else
Range("H" & i).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Chau_Eventos
Range("H" & i).Value = "Verificar distancia en MT"
'Hola_Eventos
End If
Case 3 'entre 33 y 66
'evaluo si la distancia de seguridad sea menor a 0.9
If Range("G" & i).Value < 0.9 Then
Range("H" & i).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Chau_Eventos
Range("H" & i).Value = "Verificar distancia en MT"
'Hola_Eventos
'sino se cumple lo anterior, será mayor o igual que 0.9
Else
Range("H" & i).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Chau_Eventos
Range("H" & i).Value = "Distancia de ley cumplimentada en AT"
'Hola_Eventos
End If
Case 4 'entre 66 y 500
'evaluo si la distancia de seguridad es mayor o igual a 1.5
If Range("G" & i).Value >= 1.5 Then
Range("H" & i).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Chau_Eventos
Range("H" & i).Value = "Distancia de ley cumplimentada en EAT"
'Hola_Eventos
'sino se cumple lo anterior, será menor que 1.5
Else
Range("H" & i).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'Chau_Eventos
Range("H" & i).Value = "Verificar Distancia en EAT"
'Hola_Eventos
End If
End Select
Next
Range(Target.Address).Select
col = Target.Column
Cells(ActiveCell.Row + 1, col).Select
Hola_Eventos
End Sub

Sub Chau_Eventos()
Application.EnableEvents = False
End Sub

Sub Hola_Eventos()
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change1(ByVal Target As Range)
Chau_Eventos
Dim col As Integer
Dim i As Integer
Dim caso As Integer
For i = 33 To 64
'Analiza las opciones de las condiciones y les atribuye un numero de caso
If Range("C" & i).Value = "" Then
caso = 1
Else
If Range("C" & i).Value >= 13.2 And Range("C" & i).Value <= 33 Then
Else
If Range("C" & i).Value > 33 And Range("C" & i).Value <= 66 Then
caso = 3
Else
If Range("C" & i).Value > 66 And Range("C" & i).Value <= 500 Then
caso = 4
End If
End If
End If
End If

Select Case caso
Range("D" & i).Select
Case 1 'celda vacia
Range("D" & i).Value = ""
'Hola_Eventos
Case 2 'entre 13.2 y 33
'evaluo la categoría de la linea
Range("D" & i).Value = "Linea de MT"
'Hola_Eventos

Case 3 'entre 33 y 66

'evaluó categoría de la línea
Range("D" & i).Value = " Linea de AT "
'Hola_Eventos
Case 4 'entre 66 y 500
'evaluó categoría de la línea
Range("D" & i).Value = " Linea de EAT "
'Hola_Eventos
End Select

End Sub

Lo que quiero es que al poner un valor de tensión en cualquiera de las celdas de la columna C33:64 me arroje una categoría asignada en la celda contigua de la columna D33:D64:

Ejemplo, si pongo un valor de 13,2 o de 33 en la celda C33 en la misma fila D33 debe decir "Linea de MT", si pongo 66, 132 o 500 en C33 en la misma fila D33 debe indicar "Linea de AT"

Esto debe siempre ocurrir contemplando que la macro se autoejecute solo cuando cambia de valor alguna de las celdas de la columna C33:C64

Disculpa mi ignorancia pero estoy iniciando en esto de la programación prácticamente me he olvidado mucho de todo...

Agradecido por la ayuda.

Saludos;

1 Respuesta

Respuesta
1

Pero ya te había enviado la macro simplificada.

No entiendo tu código. Pero puedes probar nuevamente con mi macro. Ya puse las líneas para poner el texto en la columna "D"

Private Sub Worksheet_Change(ByVal Target As Range)
'Act.Por.Dante Amor
    Dim fila As Integer
    fila = Target.Row
    'verifico que el cambio sea en la columna C, G o N7
    If Not Intersect(Target, Range("C33:C64, G33:G64, N7")) Is Nothing Then
        'Analiza las opciones de las condiciones
        valor = Range("C" & fila)
        If valor = "" Then                                  'celda vacia
            Cells(fila, "D") = ""
            Call PonColor(fila, xlNone, "")
        ElseIf valor >= 13.2 And valor <= 33 Then                       'entre 13.2 y 33
            Cells(fila, "D") = "Línea de MT"
            If Range("G" & fila).Value >= 0.8 Then                      'si distancia es mayor o igual a 0.8
                Call PonColor(fila, 5296274, "Distancia de ley cumplimentada en MT")
            Else
                Call PonColor(fila, 255, "Verificar distancia en MT")   'si es menor a 0.8
            End If
        ElseIf valor > 33 And valor <= 66 Then                          'entre 33 y 66
            Cells(fila, "D") = "Línea de AT"
            If Range("G" & fila).Value >= 0.9 Then                      'si es mayor o igual a 0.9
                Call PonColor(fila, 5296274, "Distancia de ley cumplimentada en AT")
            Else
                Call PonColor(fila, 255, "Verificar distancia en AT")   'si es menor a 0.9
            End If
        ElseIf valor > 66 And valor <= 500 Then                         'entre 66 y 500
            Cells(fila, "D") = "Línea de EAT"
            If Range("G" & fila).Value >= 1.5 Then                      'si es mayor o igual a 1.5
                Call PonColor(fila, 5296274, "Distancia de ley cumplimentada en EAT")
            Else
                Call PonColor(fila, 255, "Verificar distancia en EAT")  'si es menor a 1.5
            End If
        End If
        Range("C" & fila + 1).Select
    End If
End Sub

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Faltó esta parte del código:

'
Sub PonColor(fila, wcolor, texto)
'Por.Dante Amor
    With Range("H" & fila).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = wcolor
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Range("H" & fila).Value = texto
End Sub

sal u dos

Muchas gracias Dante lo voy a probar excelente la ayuda que me diste!

Gracias!

Saludos!

Dante el código anda perfecto ahora bien, como hago para que el estado de las celdas de la columna "H33:H64" cambien si se alteran cualquiera de los valores en las celdas "C33:C64" o bien si se modifica el valor en la celda N7?

Es decir que el cambio de las celdas de la columna "H33:H64" debe modificarse si se altera cualquier celda de la columna "G33:G64" que depende del valor de la diferencia entre las celdas de la columna "F33:F64"  y la celda $N$7..............esto me esta quemando la cabezaaaaaaa

Pero eso ya hace la macro, si modificas la C o la G o la N7, la macro actualiza la columna H

Te puedo enviar por acá la macro???

¿Cuál macro?

La macro que te puse verifica la C, G y N7.

No entiendo qué necesitas.

Dante el código esta puesto en una macro de excel, pero lo estoy probando y no se modifica cuando cambio el valor en N7, tengo que volver a entrar la tensión es decir un valor en C:33 para que salga el estado correcto en H33. El código anda perfecto pero no se cambia cuando toco el valor de la celda N7. Puede ser porque el valor en G33 sale de la diferencia entre F:33 y $N$7???????

Pero si cambias N7, entonces tendría que revisar todas las filas desde la 33 hasta la 64, ¿para verificar qué estados son los que deben cambiar?

Si lo anterior es correcto entonces prueba con esta:

Private Sub Worksheet_Change(ByVal Target As Range)
'Act.Por.Dante Amor
    Dim fila As Integer
    'fila = Target.Row
    'verifico que el cambio sea en la columna C, G o N7
    If Not Intersect(Target, Range("C33:C64, G33:G64, N7")) Is Nothing Then
        'Analiza las opciones de las condiciones
        If Target.Address(False, False) = "N7" Then
            fini = 33
            ffin = 64
        Else
            fini = Target.Row
            ffin = Target.Row
        End If
        For fila = fini To ffin
            valor = Range("C" & fila)
            If valor = "" Then                                  'celda vacia
                Cells(fila, "D") = ""
                Call PonColor(fila, xlNone, "")
            ElseIf valor >= 13.2 And valor <= 33 Then                       'entre 13.2 y 33
                Cells(fila, "D") = "Línea de MT"
                If Range("G" & fila).Value >= 0.8 Then                      'si distancia es mayor o igual a 0.8
                    Call PonColor(fila, 5296274, "Distancia de ley cumplimentada en MT")
                Else
                    Call PonColor(fila, 255, "Verificar distancia en MT")   'si es menor a 0.8
                End If
            ElseIf valor > 33 And valor <= 66 Then                          'entre 33 y 66
                Cells(fila, "D") = "Línea de AT"
                If Range("G" & fila).Value >= 0.9 Then                      'si es mayor o igual a 0.9
                    Call PonColor(fila, 5296274, "Distancia de ley cumplimentada en AT")
                Else
                    Call PonColor(fila, 255, "Verificar distancia en AT")   'si es menor a 0.9
                End If
            ElseIf valor > 66 And valor <= 500 Then                         'entre 66 y 500
                Cells(fila, "D") = "Línea de EAT"
                If Range("G" & fila).Value >= 1.5 Then                      'si es mayor o igual a 1.5
                    Call PonColor(fila, 5296274, "Distancia de ley cumplimentada en EAT")
                Else
                    Call PonColor(fila, 255, "Verificar distancia en EAT")  'si es menor a 1.5
                End If
            End If
        Next
        Range("C" & Target.Row + 1).Select
    End If
End Sub
'
Sub PonColor(fila, wcolor, texto)
'Por.Dante Amor
    With Range("H" & fila).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = wcolor
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Range("H" & fila).Value = texto
End Sub

sal u dos

Excelente Dante FUNCIONO! Sos un genio muchas gracias y vamos MÉXICO que un simple "don NADIE" como trump no nos puede quitar el sueño!

Gracias y bendiciones desde argentina

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas