lunes, 23 de julio de 2018

Variable lógica de control

Puede descargar el archivo booleanoPorDefecto.xlsm


Generamos siete números aleatorios entre 1 y 10 en las celdas del rango B4:H4. En la celda amarilla (B6) generamos otro número en el mismo rango y deseamos conocer si este valor se encuentra entre los siete números generados de la fila 4.

Veamos varias formas de abordar el caso práctico con macros de VBA para Excel.

Caso 1

El primer caso  imprime en la celda C6 la frase 'Se ha encontrado' cuando el valor de la celda B6 coincide con alguno de los siete números de la fila 4. En la fila 4 pueden darse valores repetidos como se puede ver en la imagen siguiente.



El inconveniente de este método reside en que cuando la celda amarilla no coincide con ninguno de los números de la fila 4, en la celda C6 no se imprime nada, ya que no se entra dentro del condicional if en ningún momento. Nos gustaría que si no encuentra coincidencia pusiera una frase indicando que así ha sido. Pero no podemos incluir en el condicional if un else ya que al analizar los siete números cada vez que uno de ellos no coincida con la celda amarilla escribiría la frase indicando que no coinciden. Esto supondría un funcionamiento incorrecto del código. Veamos el segundo caso donde esto se soluciona con la ayuda de una variable booleana.

Sub rastrea()
For i = 1 To 7
  Cells(4, i + 1) = Int(Rnd() * 10) + 1
Next i
n = WorksheetFunction.RandBetween(1, 10)
Range("B6") = n
Range("C6").ClearContents
For i = 1 To 7
  If Cells(4, i + 1) = n Then
    Range("C6") = "Se ha encontrado"
  End If
Next i
End Sub


Caso 2

El código de este caso parte del anterior si bien añade una variable lógica denominada distintos que se inicializa como True. Esto supone que de entrada supondremos que los valores son distintos. Por tanto, supondremos inicialmente que no existe coincidencia de valor entre la celda amarilla y las siete previas de la fila cuatro. Nos metemos en un bucle for que recorre las siete posiciones comprobando con un condicional if si existe coincidencia. Si se detecta alguna coincidencia la variable lógica distintos se torna en False. Finalmente, fuera del bucle, añadimos un nuevo condicional if que analizará si la variable booleana distintos es verdadera y en caso afirmativo imprimirá en la celda B6 la frase 'NO se ha encontrado'.
Observe que en el último condicional if no es necesario poner como condición distintos=True, ya que la variable lógica ya es en si misma True o False.




Sub analiza()
Dim distintos As Boolean
distintos = True
For i = 1 To 7
  Cells(4, i + 1) = Int(Rnd() * 10) + 1
Next i
n = WorksheetFunction.RandBetween(1, 10)
Range("B6") = n
Range("C6").ClearContents
For i = 1 To 7
  If Cells(4, i + 1) = n Then
    distintos = False
    Range("C6") = "Se ha encontrado"
  End If
Next i
If distintos Then
  Range("C6") = "NO se ha encontrado"
End If
End Sub

Caso 3

Este caso es una variante del anterior donde no usamos variable lógica. Lo que hacemos es escribir en la celda C6 de entrada, y como valor por defecto, la frase  'NO se ha encontrado'. Luego, si al analizar la coincidencia de valores se verifica que existe alguna coincidencia lo que se hace es reescribir esa celda con la frase 'Se ha encontrado'. Con este método lo que conseguimos es que si no se encuentra coincidencia de valores la frase inicialmente escrita es válida y se muestra en pantalla sin necesidad de añadirla porque ya existía desde un principio.

Sub noEncontradoPorDefecto()
For i = 1 To 7
  Cells(4, i + 1) = Int(Rnd() * 10) + 1
Next i
n = WorksheetFunction.RandBetween(1, 10)
Range("B6") = n
Range("C6") = "NO se ha encontrado"
For i = 1 To 7
  If Cells(4, i + 1) = n Then
    Range("C6") = "Se ha encontrado"
  End If
Next i
End Sub

No hay comentarios:

Publicar un comentario