¿Cómo Evaluar el rango seleccionado?

Como podría crear una condición dentro de una macro de forma que si el rango seleccionado es toda una fila es decir la fila completa termine la macro.

1 Respuesta

Respuesta
2

Prueba con:

If (Selection.Address = Selection.EntireRow.Address And Selection.Rows.Count = 1) Then Exit Sub

Saludos_

¡Gracias! 

Me funciona perfecto

Que significa esta parte, para saber. Gracias

And Selection.Rows.Count = 1)

Eso es para comprobar que sólo está seleccionada una fila.

¡Gracias! 

Muchas gracias. Saludos

Hola he encontrado un punto en el que la orden no me funciona y es cuando elimino la fila (teniendo selecciona una celda) dándole al botón derecho del ratón, luego eliminar y selecciono entonces toda la fila. No es necesario hacerlo así, pero si en un momento lo hiciese por despiste la vuelta atras me resultaría complicada. Gracias

Me temo que no entiendo lo último. ¿El código está en un evento? Y si es así, ¿En cuál?

Saludos_

Este es el código:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A1:d15")
If (Selection.Address = Selection.EntireRow.Address And Selection.Rows.Count = 1) Then
Exit Sub
End If
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
Target.Offset(0, 0).Select
If ActiveCell.Value = "5" Then
Call color_azul
End If
If ActiveCell.Value <> "5" Then
Call transparente
End If
If ActiveCell.Value = "4" Then
Call Color_rojo
End If

End If
End Sub

Entonces si elimino la fila seleccionándola completa funciona ok, pero si hago lo que te comenté antes me colorea toda la fila del color que haya utilizado por última vez.

Este el el código que utilizo:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A1:d15")
If (Selection.Address = Selection.EntireRow.Address And Selection.Rows.Count = 1) Then
Exit Sub
End If

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
Target.Offset(0, 0).Select
If ActiveCell.Value = "5" Then
Call color_azul
End If
If ActiveCell.Value <> "5" Then
Call transparente
End If
If ActiveCell.Value = "4" Then
Call Color_rojo
End If

End If
End Sub

Entonces si elimino la fila seleccionándola completa desde el lateral funciona ok, pero si lo hago como te comento antes me colorea toda la fila que sube a la posición de la eliminada con el color que haya usado por última vez.

El motivo de usar a veces esta forma de eliminar es que la hoja de datos que manejo es muy grande y también por eso me resultaría muy complicado deshacer el coloreado incorrecto.

Gracias

Perdón por duplicar

No se si de alguna forma lo que se podría utilizar en el código es que si utilizo "eliminar" termine el código y no haga nada más.

Saludos

Hasta donde yo sé, no hay una forma directa de saber si se está eliminando una fila, pero creo que sí se puede lograr de forma indirecta.

Habría que añadir esta línea al principio del módulo VBA de la hoja (antes de cualquier Sub):

Private lFilasUsadas As Long

También habría que añadir al módulo VBA (suponiendo que no esté ya creado el evento Worksheet_SelectionChange):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    lFilasUsadas = Target.Worksheet.UsedRange.Rows.Count
End Sub

Con el código anterior, al seleccionar cualquier cosa en la hoja se almacena en la variable lFilasUsadas el número de filas usadas en ese momento.
Finalmente, para salir del evento Worksheet_Change sin hacer nada en el caso de que se haya eliminado una o más filas, habría que añadir a dicho evento como primera instrucción:

    If lFilasUsadas < Target.Worksheet.UsedRange.Rows.Count Then Exit Sub

Lo que hace esta instrucción es comparar el número de filas usadas en ese momento (es decir, después de haber borrado una o más filas) con el número de filas que había al seleccionar la celda. Creo que debería funcionar, pero lógicamente tendrás que hacer pruebas.

Saludos_

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas