Condicional en excel con vb

A B C D
PAG 30,00 -5,00
EOK 117,00 -3,00
PAG 500,00 37,00
EOK 80,00 20,00
SVL 400,00 0,00
EL 50,00 0,00
PAG 324,00 0,00
EOK 89,66 0,00
Se trata de un condicional que debe escribir un texto en la columna DE, celda por celda.
El número de filas es indeterminado.
Son cuatro casos:
1º Caso
Si en la celda A1 aparece el texto "EOK" o aparece el texto "PAG" y el valor de la celda C es menor que cero entonces debe poner el texto "De menos" en la celda D.
2º Caso
Si en la celda A1 aparece el texto "EOK" o aparece el texto "PAG" y el valor de la celda C es mayor que cero entonces debe poner el texto "De más" en la celda D.
3º Caso
Si en la celda A1 aparece el texto "EOK" o aparece el texto "PAG" y el valor de la celda C es igual que cero entonces debe poner el texto "Enviado" en la celda D.
4º Caso
Si en la celda A1 aparece el texto "ELM" o "SVL" entonces ocurren dos cosas:
1ª En la celda C aparece el mismo valor que en la celda B, simplemente lo copia.
2ª En la celda D debe poner el texto "Sin Enviar"
Yo lo he hecho tal y como te lo pongo a continuación y no me termina de funcionar del todo bien, parece que no reconoce la partícula "or", porque a veces donde debe poner "De más" pone "De menos", si reconoce el texto "EOK" no reconoce el texto "PAG".
Además, he escrito este mismo código para diez líneas lo cual es una salvajada porque no se qué número de líneas me van a aparecer, pueden ser seis como pueden ser once.
If Range("A1").Value = "EOK" Or Range("A1").Value = "PAG" And Range("C1").Value < 0 Then
Range("D1").Value = "De menos"
    Else
If Range("A1").Value = "EOK" Or Range("A1").Value = "PAG" And Range("C1").Value > 0 Then
Range("D1").Value = "De más"
    Else
If Range("A1").Value = "EOK" Or Range("A1").Value = "PAG" And Range("C1").Value = 0 Then
Range("D1").Value = "Enviado"
     Else        
If Range("A1").Value = "ELM" Or Range("A1").Value = "SVL" Then
Range("C1").Value = Range("B1").Value
Range("D1").Value = "Sin Enviar"
End If
End If
End If
End If
Me gustaría:
- Que comprobaras mi código, para saber que es lo que estoy poniendo mal y
- Que me explicaras como debo hacer para que con un solo código me sirva para un número indefinido de líneas.
Muchísimas gracias de antemano. Espero haber sido claro en mi exposición del problema.

1 respuesta

Respuesta
1
El tema está en el uso de los paréntesis y sería mejor usar ElseIf; además, hay que cambiar el uso de Rango para poder hacerlo en n filas. Éxitos, no olvides calificar y cerrar la pregunta.
...
Sub CiclosCondicionales()
Range("D1").Select
While Not IsEmpty(ActiveCell.Offset(0, -3).Value)
If (ActiveCell.Offset(0, -3).Value = "EOK" Or ActiveCell.Offset(0, -3).Value = "PAG") And _
    (ActiveCell.Offset(0, -1).Value < 0) Then
    ActiveCell.Value = "De menos"
ElseIf (ActiveCell.Offset(0, -3).Value = "EOK" Or ActiveCell.Offset(0, -3).Value = "PAG") And _
    (ActiveCell.Offset(0, -1).Value > 0) Then
    ActiveCell.Value = "De más"
ElseIf (ActiveCell.Offset(0, -3).Value = "EOK" Or ActiveCell.Offset(0, -3).Value = "PAG") And _
    (ActiveCell.Offset(0, -1).Value = 0) Then
    ActiveCell.Value = "Enviado"
ElseIf (ActiveCell.Offset(0, -3).Value = "ELM" Or ActiveCell.Offset(0, -3).Value = "SVL") And _
    (ActiveCell.Offset(0, -2).Value = ActiveCell.Offset(0, -1).Value) Then
    ActiveCell.Value = ActiveCell.Offset(0, -1).Value
Else
    ActiveCell.Value = "Sin Enviar"
End If
ActiveCell.Offset(1, 0).Select
Wend
End Sub
Sub CiclosCondicionales()Range("D1").Select
While Not IsEmpty(ActiveCell.Offset(0, -3).Value)If (ActiveCell.Offset(0, -3).Value = "EOK" Or ActiveCell.Offset(0, -3).Value = "PAG") And _    (ActiveCell.Offset(0, -1).Value < 0) Then    ActiveCell.Value = "De menos"ElseIf (ActiveCell.Offset(0, -3).Value = "EOK" Or ActiveCell.Offset(0, -3).Value = "PAG") And _    (ActiveCell.Offset(0, -1).Value > 0) Then    ActiveCell.Value = "De más"ElseIf (ActiveCell.Offset(0, -3).Value = "EOK" Or ActiveCell.Offset(0, -3).Value = "PAG") And _    (ActiveCell.Offset(0, -1).Value = 0) Then    ActiveCell.Value = "Enviado"ElseIf (ActiveCell.Offset(0, -3).Value = "ELM" Or ActiveCell.Offset(0, -3).Value = "SVL") And _    (ActiveCell.Offset(0, -2).Value = ActiveCell.Offset(0, -1).Value) Then    ActiveCell.Value = ActiveCell.Offset(0, -1).ValueElse    ActiveCell.Value = "Sin Enviar"End IfActiveCell.Offset(1, 0).SelectWendEnd Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas