martes, 14 de junio de 2011

VBA: El método INTERSECT

Hace bastante que no escribo ningún post en el blog, pero por fin puedo empezar a dedicarle, de nuevo, algo de tiempo... el trabajo hace imposible a veces que nos empleemos en lo que nos gusta.
Intentaré ir poniéndome al día contestando correos antiguos.
Uno de ellos preguntaba por la manera de automatizar el bloqueo de celdas concretas:

...¿Existe alguna posibilidad o alguna macro?, que te permita introducir datos en algunas celdas y una vez introducidas las bloquee automáticamente, por ejemplo al guardar la hoja, de forma que no puedas eliminarlos o modificarlos sin desbloquear la hoja...


Aprenderemos hoy a emplear el método INTERSECT para obtener el cruce de dos o más rangos en un objeto tipo Range; en nuestro caso lo emplearemos para determinar si nuestra celda activa se encuentra dentro de un rango determinado.
La idea consiste en contrastar si nuestra celda activa se halla dentro de un rango previamente determinado, y si es cierta esta premisa forzar el desbloqueo, para tras una posterior protección de la hoja de cálculo, dejarla bloqueada e impedir su modificación o eliminación, tal como pedía el usuario.

Empecemos entonces definiendo cuáles son las celdas que desearemos impedir se modifiquen en el futuro, por ejemplo, el rango de celdas A1:A3, B2 y C3. Con la aplicación del método INTERSECT conseguiremos que cuando se seleccione alguna de dichas celdas de nuestro rango, éstas queden desbloqueadas.

Nuestro código VBA a incluir en una Hoja del Explorador del proyecto dentro del Editor de VBA es:

Sub worksheet_selectionchange(ByVal target As Range)
If Intersect(ActiveCell, Range("A1:A3,B2,C3")) Is Nothing Then
'La celda activa NO cruza con las celdas del rango
ActiveCell.Locked = True
Else
'La celda activa SI cruza con las celdas del rango
ActiveCell.Locked = False
End If
End Sub


Sólo nos quedaría forzar la protección de nuestra Hoja de cálculo, lo que conseguiremos con un procedimiento Workbook_BeforeClose que ejecute dicha protección.

7 comentarios:

  1. Hola, quiero introducir datos en un rango A1:C3 (p.e.), que lo compare con los datos existentes y si está repetido pinte la celda digitada y la celda de comparación. Gracias anticipadas.

    ResponderEliminar
    Respuestas
    1. Hola,
      por que no aplicas un Formato Condicional con duplicado de valores ??

      Slds

      Eliminar
  2. Hola, un saludo a todos los miembros y visitantes de foro.
    Se que es solo para Excel, pero aun con riesgo que me llamen necio, quiero preguntar como se aplicaría este método o un equivalente en Word, especificamente para buscar un valor dentro de una tabla y cambiar color de fondo donde coincidan.
    Gracias anticipadas.

    ResponderEliminar
    Respuestas
    1. Hola,
      mejor plantea la pregunta en algún blog o foro específico de Word...
      Piensa que las propiedades y métodos son distintas en una y otra aplicación (Word vs Excel)..
      Saludos y suerte

      Eliminar
  3. Hola! es posible hacer que la macro se ejecute automaticamente por un cambio en una celda que se encuentre en una hoja diferente? es decir algo como if intersect(Target, worksheets("A").range("C1") . Cómo debería formular esta parte? Gracias

    ResponderEliminar