Para expertos en excel, sobre el evento sheetselection.change

Necesito hacer una macro que me devuelva en una celda especifica el numero de columna y fila actuales.

Para ello tengo lo siguiente:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
[miColumna] = Target.Column  
[miFila] = Target.Row                 
End Sub

Hasta ahí todo funciona bien. Con nombres de rango (miColumna, miFila) en ámbito de hoja.

Ahora. Necesito hacer eso mismo en 13 hojas más.

Ya nombre celdas en ámbito de libro, utilice el evento

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

Utilice los módulos de cada hoja para: Worksheet_SelectionChange... (según yo no debería haber error),

Me dice que falta un objeto,. Pero no se cual es. Ya le metí el activesheet. Pero sigue sin funcionar.

2 respuestas

Respuesta
1

Los módulos de las hojas son módulos de clase, es decir, pertenecen solo al objeto respectivo, en este caso: Las hojas. En el módulo de la, por ejemplo, "Hoja1", las referencias del tipo [miColumna], para dicho módulo son casi como decir (para que se me entienda): Sheets("Hoja1"). Range("miColumna").Value y si dicho rango está en la, por ejemplo, "Hoja2", obviamente dará error así dicho rango esté nombrado para todo el libro.

Eso no ocurría, por ejemplo, si usas una rutina en un módulo "standard", pues ahí si la referencia a todo el libro será factible. Lo mismo vale para el módulo del libro (por defecto "ThisWorkBook") ya que es, obviamente, para todo el libro.

Lo correcto cuando se usan los módulos de hojas es (en el supuesto de que el rango está en la "Hoja2"): Sheets("Hoja1"). Range("miColumna").Value  (o  Sheets("Hoja1").[miColumna], aunque hay más formas en realidad).

Si quieres que ese evento ocurra para todas las hojas, y si mal no te he entendido, basta usar un evento del libro. Voy a suponer que tus rangos "miColumna" y "miFila" ya están colocados para el ámbito del libro, entonces algo así te será útil:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
[miColumna] = Target.Column
[miFila] = Target.Row
End Sub

Claro, el resultado solo lo verás cuando estés en la hoja en donde se encuentran esos rangos pero, esa parte no la terminé de entender.

Lo otro es que quieras que ocurra lo mismo en cada hoja, para eso basta direccionar, en el evento del libro a celdas:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Range("A1") = Target.Column
Range("B1") = Target.Row
End Sub

Comentas

Abraham Valencia

¡Excelente, maestro, mil gracias, funciono tal y como yo quería

Un problema más: como hacer para que las celdas que están fuera de rango de datos no sean iluminadas. Explico.

En mi base de datos coloreo (interior.colorindex= 44), la interseccion la address para resaltar. para introducir datos de forma rapida sin errores. hay otras celdas con color aunque sin formato condicional. cuando las selecciono se quedan con el color 44 y necesito que queden fuera del rango de interseccion.

esto es lo que tengo

Range("A1:CE3").Interior.ColorIndex = xlNone

With ActiveCell
.EntireRow.Range("B1").Interior.ColorIndex = 44   '("B1") es la lista
.EntireColumn.Range("A3").Interior.ColorIndex = 44   '' ("A3") Es el encabezado

  Range("A1:CE48") es mi base de datos.

Pero si selecciono una celda fuera de rango, se queda en color 44 y necesito que se actualice a

Interior.ColorIndex = xlNone.

Nuevamente agradezco cualquier respuesta

Cierra esta pregunta y haz una nueva para esta consulta por favor.

Un abrazo

Abraham Valencia

Respuesta
1

Para no tener que colocar la misma macro en cada hoja, la debes colocar en el objeto ThisWorkbook:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
[miColumna] = Target.Column
[miFila] = Target.Row
End Sub

Para esto previamente habrás declarado los nombre 'miColumna' y 'miFila' en el ámbito 'Libro' , donde esos nombres harán referencia a ciertas celdas de cierta hoja:

Y en este caso si quieres omitir alguna hoja (mencionas 13 pero quizás quieras que no se ejecute cuando seleccionas alguna celda de la hoja llamada 'Portada', la macro quedaría así:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'x Elsamatilde
'no se ejecuta en hoja Portada
If ActiveSheet.Name = "PORTADA" Then Exit Sub
[miColumna] = Target.Column
[miFila] = Target.Row
End Sub

En cambio, si necesitas obtener las referencias en cada hoja donde estés seleccionando la celda ya no usarás nombres de rango sino directamente la referencia, por ej:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'no se ejecuta en hoja Portada
If ActiveSheet.Name = "PORTADA" Then Exit Sub
[A1] = Target.Column
[A2] = Target.Row
End Sub

Muchas gracias, estoy agradecidísimo por la pronta respuesta. Saludos y que Dios los bendiga

No olvides valorar las respuestas para dar por finalizada la consulta.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas