Sobre la celda activa

20/01/2004 - 21:23 por Henry Sanchez | Informe spam
Hola grupo

Quisiera poder conocer un metodo para obtener la celda
activa de cada una de las hojas de trabajo, me explico:
Si en la hoja1 selecciono la celda B5, si luego me cambio
a otra hoja de trabajo, la celda B5 volvera a ser la celda
activa cuando retorne a esta hoja de trabajo.
Quiero obtener este valor, estando ubicado en cualquier
hoja de trabajo.

No se si me explique bien

Saludos,

Henry

Preguntas similare

Leer las respuestas

#1 Beto
20/01/2004 - 22:52 | Informe spam
Henry Sanchez wrote:
Quisiera poder conocer un metodo para obtener la celda
activa de cada una de las hojas de trabajo, me explico:
Si en la hoja1 selecciono la celda B5, si luego me cambio
a otra hoja de trabajo, la celda B5 volvera a ser la celda
activa cuando retorne a esta hoja de trabajo.
Quiero obtener este valor, estando ubicado en cualquier
hoja de trabajo.



A lo mejor esta solución ya la tienes, pero es una forma de lograrlo:

Sub CeldaActivaOtraHoja()
Dim HojaActual As Worksheet
Dim CeldaActiva As Range

Application.ScreenUpdating = False
Set HojaActual = ActiveSheet
Sheets("Hoja1").Select
Set CeldaActiva = ActiveCell
HojaActual.Select
Application.ScreenUpdating = True
MsgBox "Celda activa en Hoja1 es " & CeldaActiva.Address(0, 0)
End Sub

Modifícalo para lograr lo que necesitas.

Saludos,
Beto
Reply: Erase between the dot (inclusive) and the @.
Responder: Borra la frase obvia y el punto previo.
Respuesta Responder a este mensaje
#2 Héctor Miguel
22/01/2004 - 07:54 | Informe spam
hola, Henry !

... metodo para obtener la celda activa de cada una de las hojas de trabajo [...]
... en la hoja1 selecciono ... B5 ... me cambio a otra hoja ... B5 volvera a ser la celda activa cuando retorne [...]
... obtener este valor, estando ubicado en cualquier hoja de trabajo.
No se si me explique bien



te explicaste bastante bien ;) 'a menos que...' [yo] hubiera 'interpretado' mal :( [solo que...] hay un 'problemilla' :\
- la propiedad 'ActiveCell' [solamente] es 'aplicable' a la ventana 'activa' [en 'otras palabras'... la hoja =>seleccionada<=]
FALLA... si la hoja seleccionada NO es una hoja de calculo o si la 'seleccion activa' NO es del tipo 'Range' :((

para estar 'en condiciones de saber' [en todo momento] el rango seleccionado y celda activa de una hoja 'desde cualquiera'...
se puede 'truquear' [por codigo] con los eventos del libro [relativos a las hojas], algunas matrices publicas y... 'algo mas' :))
1.- [al abrir el libro] 'recorrer' TODAS las hojas [de calculo] y 'registrar' [matrices] nombres, rango seleccionado y celda
'activa'
2.- [al 'activar' cada hoja] 'actualizar' su 'posicion' [en la matriz]
o... 'repetir' el punto anterior [por si se agregan hojas o se les cambia el nombre]
3.- [al cambiar la seleccion EN 'la hoja'] 'actualizar' rango seleccionado y celda activa [SI 'procede']
4.- [finalmente...] funciones personalizadas para 'traer' rango y/o celda [segun la hoja 'solicitada' a la/s funcion/es]

del codigo que te propongo al final, las funciones 'que necesitas' [y su 'uso'] son:
a) para saber la celda activa de 'X' hoja: CeldaActiva("Nombre de la hoja")
uso [p.e.] => MsgBox CeldaActiva(Worksheets(2).Name) o... MsgBox CeldaActiva("Hoja15")
b) para saber el rango seleccionado de 'X' hoja: RangoActual("Nombre de la hoja")
uso... igual a la anterior :))
AMBAS 'devuelven' una cadena de texto que 'indica' el rango y/o celda...
o... N/A [No Aplica] si la [ultima] seleccion EN 'esa' hoja NO es del tipo 'Range'
o... N/D [No Disponible] si la hoja 'solicitada' NO esta 'registrada' [o NO 'existe'] :))

nota: la funcion 'CeldaActiva' MIENTE si... el rango seleccionado es de varias celdas y 'haz navegado' =>{Tab} o {Enter}< => 'se queda' con la celda activa 'original' al momento de la seleccion del rango :(( < para 'corregirlo'... es necesario 'atrapar' las teclas de navegacion y asignarles un 'comportamiento personalizado' ;)
[si lo necesitas... ¿avisas?]

saludos,
hector.

en un modulo 'normal' ==Option Private Module
Public LaHoja() As String, ElRango() As String, LaCelda() As String
Sub RegistrarSelecciones(): Dim VolverA As String, Sig As Integer
VolverA = ActiveSheet.Name: Erase LaHoja: Erase ElRango: Erase LaCelda
With Worksheets
ReDim LaHoja(.Count - 1): ReDim ElRango(.Count - 1): ReDim LaCelda(.Count - 1)
End With
With Application: .ScreenUpdating = False: .EnableEvents = False
For Sig = 0 To Worksheets.Count - 1: Worksheets(Sig + 1).Select
LaHoja(Sig) = ActiveSheet.Name
If TypeName(Selection) = "Range" Then
ElRango(Sig) = Selection.Address: LaCelda(Sig) = ActiveCell.Address
Else: ElRango(Sig) = "N/A": LaCelda(Sig) = "N/A"
End If: Next: Sheets(VolverA).Activate: .EnableEvents = True: End With
End Sub
Function EnMatriz(ByVal DeEstaHoja As String) As Integer: Dim Sig As Integer
For Sig = 0 To Worksheets.Count - 1
If StrConv(LaHoja(Sig), vbLowerCase) = StrConv(DeEstaHoja, vbLowerCase) Then
EnMatriz = Sig: Exit Function
End If: Next: EnMatriz = -1
End Function
Function CeldaActiva(ByVal DeEstaHoja As String) As String
If EnMatriz(DeEstaHoja) = -1 _
Then CeldaActiva = "N/D" _
Else CeldaActiva = LaCelda(EnMatriz(DeEstaHoja))
End Function
Function RangoActual(ByVal DeEstaHoja As String) As String
If EnMatriz(DeEstaHoja) = -1 _
Then RangoActual = "N/D" _
Else RangoActual = ElRango(EnMatriz(DeEstaHoja))
End Function

en el modulo del libro ==Dim Pos As Integer
Private Sub Workbook_Open()
RegistrarSelecciones
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If TypeName(Sh) <> "Worksheet" Then Exit Sub
If EnMatriz(Sh.Name) = -1 Then RegistrarSelecciones
Pos = EnMatriz(Sh.Name): LaHoja(Pos) = Sh.Name
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If TypeName(Selection) = "Range" Then
ElRango(Pos) = Selection.Address: LaCelda(Pos) = ActiveCell.Address
Else: ElRango(Pos) = "N/A": LaCelda(Pos) = "N/A"
End If
End Sub
Respuesta Responder a este mensaje
#3 Henry Sanchez
22/01/2004 - 23:25 | Informe spam
Gracias Hector,
Tus conocimientos de excel parecen no tener limites,

saludos,

Henry
hola, Henry !

... metodo para obtener la celda activa de cada una de




las hojas de trabajo [...]
... en la hoja1 selecciono ... B5 ... me cambio a otra




hoja ... B5 volvera a ser la celda activa cuando retorne
[...]
... obtener este valor, estando ubicado en cualquier




hoja de trabajo.
No se si me explique bien



te explicaste bastante bien ;) 'a menos que...' [yo]


hubiera 'interpretado' mal :( [solo que...] hay
un 'problemilla' :\
- la propiedad 'ActiveCell' [solamente] es 'aplicable' a


la ventana 'activa' [en 'otras palabras'... la hoja
=>seleccionada<=]
FALLA... si la hoja seleccionada NO es una hoja de


calculo o si la 'seleccion activa' NO es del
tipo 'Range' :((

para estar 'en condiciones de saber' [en todo momento] el


rango seleccionado y celda activa de una hoja 'desde
cualquiera'...
se puede 'truquear' [por codigo] con los eventos del


libro [relativos a las hojas], algunas matrices publicas
y... 'algo mas' :))
1.- [al abrir el libro] 'recorrer' TODAS las hojas [de


calculo] y 'registrar' [matrices] nombres, rango
seleccionado y celda
'activa'
2.- [al 'activar' cada hoja] 'actualizar' su 'posicion'


[en la matriz]
o... 'repetir' el punto anterior [por si se agregan


hojas o se les cambia el nombre]
3.- [al cambiar la seleccion EN 'la hoja'] 'actualizar'


rango seleccionado y celda activa [SI 'procede']
4.- [finalmente...] funciones personalizadas para 'traer'


rango y/o celda [segun la hoja 'solicitada' a la/s
funcion/es]

del codigo que te propongo al final, las funciones 'que


necesitas' [y su 'uso'] son:
a) para saber la celda activa de 'X' hoja:


CeldaActiva("Nombre de la hoja")
uso [p.e.] => MsgBox CeldaActiva(Worksheets


(2).Name) o... MsgBox CeldaActiva("Hoja15")
b) para saber el rango seleccionado de 'X' hoja:


RangoActual("Nombre de la hoja")
uso... igual a la anterior :))
AMBAS 'devuelven' una cadena de texto que 'indica' el


rango y/o celda...
o... N/A [No Aplica] si la


[ultima] seleccion EN 'esa' hoja NO es del tipo 'Range'
o... N/D [No Disponible] si la


hoja 'solicitada' NO esta 'registrada' [o
NO 'existe'] :))

nota: la funcion 'CeldaActiva' MIENTE si... el rango


seleccionado es de varias celdas y 'haz navegado' =>{Tab}
o {Enter}<> => 'se queda' con la celda activa 'original' al
momento de la seleccion del rango :(( <> para 'corregirlo'... es necesario 'atrapar' las
teclas de navegacion y asignarles un 'comportamiento
personalizado' ;)
[si lo necesitas... ¿avisas?]

saludos,
hector.

en un modulo 'normal' ==>Option Private Module
Public LaHoja() As String, ElRango() As String, LaCelda()


As String
Sub RegistrarSelecciones(): Dim VolverA As String, Sig As


Integer
VolverA = ActiveSheet.Name: Erase LaHoja: Erase


ElRango: Erase LaCelda
With Worksheets
ReDim LaHoja(.Count - 1): ReDim ElRango(.Count - 1):


ReDim LaCelda(.Count - 1)
End With
With Application: .ScreenUpdating =


False: .EnableEvents = False
For Sig = 0 To Worksheets.Count - 1: Worksheets(Sig +


1).Select
LaHoja(Sig) = ActiveSheet.Name
If TypeName(Selection) = "Range" Then
ElRango(Sig) = Selection.Address: LaCelda(Sig) =


ActiveCell.Address
Else: ElRango(Sig) = "N/A": LaCelda(Sig) = "N/A"
End If: Next: Sheets


(VolverA).Activate: .EnableEvents = True: End With
End Sub
Function EnMatriz(ByVal DeEstaHoja As String) As Integer:


Dim Sig As Integer
For Sig = 0 To Worksheets.Count - 1
If StrConv(LaHoja(Sig), vbLowerCase) = StrConv


(DeEstaHoja, vbLowerCase) Then
EnMatriz = Sig: Exit Function
End If: Next: EnMatriz = -1
End Function
Function CeldaActiva(ByVal DeEstaHoja As String) As String
If EnMatriz(DeEstaHoja) = -1 _
Then CeldaActiva = "N/D" _
Else CeldaActiva = LaCelda(EnMatriz(DeEstaHoja))
End Function
Function RangoActual(ByVal DeEstaHoja As String) As String
If EnMatriz(DeEstaHoja) = -1 _
Then RangoActual = "N/D" _
Else RangoActual = ElRango(EnMatriz(DeEstaHoja))
End Function

en el modulo del libro ==>Dim Pos As Integer
Private Sub Workbook_Open()
RegistrarSelecciones
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If TypeName(Sh) <> "Worksheet" Then Exit Sub
If EnMatriz(Sh.Name) = -1 Then RegistrarSelecciones
Pos = EnMatriz(Sh.Name): LaHoja(Pos) = Sh.Name
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As


Object, ByVal Target As Range)
If TypeName(Selection) = "Range" Then
ElRango(Pos) = Selection.Address: LaCelda(Pos) =


ActiveCell.Address
Else: ElRango(Pos) = "N/A": LaCelda(Pos) = "N/A"
End If
End Sub


.

Respuesta Responder a este mensaje
#4 Héctor Miguel
23/01/2004 - 02:40 | Informe spam
hola, Henry !

Tus conocimientos de excel [...]



==> se deben [solamente] a que soy...
... terco ???
... picado ??? [y 'anexas y similares'] :))

gracias por el 'feed-back'

saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida