SpecialCells(xlLastCell)

07/01/2005 - 10:52 por José Ignacio Bella | Informe spam
Hola Grupo. Tengo un pequeño problema, a ver si me podéis ayudar.

Estoy utilizando en una macro la sentencia
'ActiveCell.SpecialCells(xlLastCell).Select' para ir a la última celda de la
hoja de cálculo. El problema es que si esta celda se borró y ya no es
realmente la última, el Excel no se entera y sigue apuntando a ella.
Si guardo la hoja, la cierro y la vuelvo a abrir entonces apunta a la última
celda real.

Sabéis cómo puedo "refrescar" esta información sin tener que cerrar la hoja?
Gracias por adelantado

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
07/01/2005 - 11:05 | Informe spam
hola, José Ignacio !

... la sentencia 'ActiveCell.SpecialCells(xlLastCell).Select' para ir a la ultima celda de la hoja de calculo.
... problema ... si esta celda se borro y ya no es realmente la ultima [...]



lo puedes 'ajustar' si [en la macro] ANTES de 'llamar' a la ultima celda... 're-defines' el rango usado [p.e.]
Sub Ir_a_UltimaCelda()
ActiveSheet.UsedRange
Cells.SpecialCells(xlCellTypeLastCell).Select
End Sub

saludos,
hector.
Respuesta Responder a este mensaje
#2 Héctor Miguel
07/01/2005 - 11:36 | Informe spam
hola de nuevo, José Ignacio !

es probable que si a dicha celda 'solo' se le borra el contenido...
siga siendo 'reportada' como si fuera la ultima celda si ha 'conservado' formatos personalizados
[desde 'simples' negritas/trama/color... hasta reglas de validacion] tambien 'habria que' desaparecerlos
toma nota que al modificar propiedades de celdas o entorno de la aplicacion ->por codigo<-...
SE PIERDE el beneficio del 'des-hacer' [undo... ctrl+z] ->se vacia la pila de niveles del des-hacer<-
la macro 'actualizada' seria...
Sub Ir_a_UltimaCelda()
With Cells.SpecialCells(xlCellTypeLastCell)
If .Value = "" Then .Clear
End With
ActiveSheet.UsedRange
Cells.SpecialCells(xlCellTypeLastCell).Select
End Sub

saludos,
hector.
Respuesta Responder a este mensaje
#3 José Ignacio Bella
07/01/2005 - 12:26 | Informe spam
Gracias, pero al introducir la nueva situación, (borrado pero p.ej. dejando
formatos), tu mismo has abierto nuevos problemas, en los que ni había
pensado.

Lo que apuntas es correcto si yo tenía algo en la LastCell y lo borré, pero
sabrás que a veces la LastCell es resultado de entradas en filas/columnas
externas, y la Last Cell es la punta de la matriz resultante, pero está
vacía (por si no me explico bien, entrando p.ej. algo en I3 y en B21, la
LastCell es I21).

En este caso, el sistema que sugieres no funciona ya que si las entradas I3
y B21 tenían formato y luego borro sólo los contenidos, como en el código
que me has dado el clear lo hago sobre la LastCell no me sirve, y la
LastCell sigue apuntando a I21.


En la pregunta inicial no tenía este problema, por lo que tu solución ya me
sirve, pero me gustaría saber si se puede prever también este problema, ya
que así tendría una rutina más universal.

Gracias de nuevo




"Héctor Miguel" escribió en el mensaje
news:e8NK$
hola de nuevo, José Ignacio !

es probable que si a dicha celda 'solo' se le borra el contenido...
siga siendo 'reportada' como si fuera la ultima celda si ha 'conservado'


formatos personalizados
[desde 'simples' negritas/trama/color... hasta reglas de validacion]


tambien 'habria que' desaparecerlos
toma nota que al modificar propiedades de celdas o entorno de la


aplicacion ->por codigo<-...
SE PIERDE el beneficio del 'des-hacer' [undo... ctrl+z] ->se vacia la pila


de niveles del des-hacer<-
la macro 'actualizada' seria...
Sub Ir_a_UltimaCelda()
With Cells.SpecialCells(xlCellTypeLastCell)
If .Value = "" Then .Clear
End With
ActiveSheet.UsedRange
Cells.SpecialCells(xlCellTypeLastCell).Select
End Sub

saludos,
hector.


Respuesta Responder a este mensaje
#4 KL
07/01/2005 - 14:59 | Informe spam
Una idea loca (el codigo puede necesitar mas pruebas). Las celdas q no
contengan formulas o valores (incl. texto, numeros y valores logicos) no
deberian afectar la funcion

Saludos,
KL

'Inicio Codigo-
Function LastCell(Optional Ws As Worksheet) As Range
Dim consts As Range: Dim frmls As Range
Dim r As Single: Dim c As Integer
Dim rTemp As Single: Dim cTemp As Integer
Dim rng As Range

If Ws Is Nothing Then Set Ws = ActiveSheet
With Ws.Cells
On Error Resume Next
Set consts = .SpecialCells(xlCellTypeConstants)
Set frmls = .SpecialCells(xlCellTypeFormulas)
On Error GoTo 0
If Not frmls Is Nothing Then
If Not consts Is Nothing Then
Set rng = Application.Union(frmls, consts)
Else
Set rng = frmls
End If
ElseIf Not consts Is Nothing Then
Set rng = consts
End If
End With
r = 1: c = 1
For Each a In rng
rTemp = a.Cells(a.Rows.Count, a.Columns.Count).Row
cTemp = a.Cells(a.Rows.Count, a.Columns.Count).Column
If rTemp > r Then r = rTemp
If cTemp > c Then c = cTemp
Next
Set LastCell = Ws.Cells(r, c)
End Function

Sub test()
Dim mysheet As Worksheet
Dim myrng As Range

Set mysheet = Sheets(2)
Set myrng = LastCell(mysheet)
mysheet.Activate
myrng.Select
End Sub
'Fin Codigo-

"José Ignacio Bella" wrote in message
news:
Gracias, pero al introducir la nueva situación, (borrado pero p.ej.
dejando
formatos), tu mismo has abierto nuevos problemas, en los que ni había
pensado.

Lo que apuntas es correcto si yo tenía algo en la LastCell y lo borré,
pero
sabrás que a veces la LastCell es resultado de entradas en filas/columnas
externas, y la Last Cell es la punta de la matriz resultante, pero está
vacía (por si no me explico bien, entrando p.ej. algo en I3 y en B21, la
LastCell es I21).

En este caso, el sistema que sugieres no funciona ya que si las entradas
I3
y B21 tenían formato y luego borro sólo los contenidos, como en el código
que me has dado el clear lo hago sobre la LastCell no me sirve, y la
LastCell sigue apuntando a I21.


En la pregunta inicial no tenía este problema, por lo que tu solución ya
me
sirve, pero me gustaría saber si se puede prever también este problema, ya
que así tendría una rutina más universal.

Gracias de nuevo




"Héctor Miguel" escribió en el mensaje
news:e8NK$
hola de nuevo, José Ignacio !

es probable que si a dicha celda 'solo' se le borra el contenido...
siga siendo 'reportada' como si fuera la ultima celda si ha 'conservado'


formatos personalizados
[desde 'simples' negritas/trama/color... hasta reglas de validacion]


tambien 'habria que' desaparecerlos
toma nota que al modificar propiedades de celdas o entorno de la


aplicacion ->por codigo<-...
SE PIERDE el beneficio del 'des-hacer' [undo... ctrl+z] ->se vacia la
pila


de niveles del des-hacer<-
la macro 'actualizada' seria...
Sub Ir_a_UltimaCelda()
With Cells.SpecialCells(xlCellTypeLastCell)
If .Value = "" Then .Clear
End With
ActiveSheet.UsedRange
Cells.SpecialCells(xlCellTypeLastCell).Select
End Sub

saludos,
hector.






Respuesta Responder a este mensaje
#5 KL
07/01/2005 - 15:05 | Informe spam
perdon, la linea "For Each a In rng" deberia ser "For Each a In rng.Areas"

KL

"KL" wrote in message
news:
Una idea loca (el codigo puede necesitar mas pruebas). Las celdas q no
contengan formulas o valores (incl. texto, numeros y valores logicos) no
deberian afectar la funcion

Saludos,
KL

'Inicio Codigo-
Function LastCell(Optional Ws As Worksheet) As Range
Dim consts As Range: Dim frmls As Range
Dim r As Single: Dim c As Integer
Dim rTemp As Single: Dim cTemp As Integer
Dim rng As Range

If Ws Is Nothing Then Set Ws = ActiveSheet
With Ws.Cells
On Error Resume Next
Set consts = .SpecialCells(xlCellTypeConstants)
Set frmls = .SpecialCells(xlCellTypeFormulas)
On Error GoTo 0
If Not frmls Is Nothing Then
If Not consts Is Nothing Then
Set rng = Application.Union(frmls, consts)
Else
Set rng = frmls
End If
ElseIf Not consts Is Nothing Then
Set rng = consts
End If
End With
r = 1: c = 1
For Each a In rng
rTemp = a.Cells(a.Rows.Count, a.Columns.Count).Row
cTemp = a.Cells(a.Rows.Count, a.Columns.Count).Column
If rTemp > r Then r = rTemp
If cTemp > c Then c = cTemp
Next
Set LastCell = Ws.Cells(r, c)
End Function

Sub test()
Dim mysheet As Worksheet
Dim myrng As Range

Set mysheet = Sheets(2)
Set myrng = LastCell(mysheet)
mysheet.Activate
myrng.Select
End Sub
'Fin Codigo-

"José Ignacio Bella" wrote in message
news:
Gracias, pero al introducir la nueva situación, (borrado pero p.ej.
dejando
formatos), tu mismo has abierto nuevos problemas, en los que ni había
pensado.

Lo que apuntas es correcto si yo tenía algo en la LastCell y lo borré,
pero
sabrás que a veces la LastCell es resultado de entradas en filas/columnas
externas, y la Last Cell es la punta de la matriz resultante, pero está
vacía (por si no me explico bien, entrando p.ej. algo en I3 y en B21, la
LastCell es I21).

En este caso, el sistema que sugieres no funciona ya que si las entradas
I3
y B21 tenían formato y luego borro sólo los contenidos, como en el código
que me has dado el clear lo hago sobre la LastCell no me sirve, y la
LastCell sigue apuntando a I21.


En la pregunta inicial no tenía este problema, por lo que tu solución ya
me
sirve, pero me gustaría saber si se puede prever también este problema,
ya
que así tendría una rutina más universal.

Gracias de nuevo




"Héctor Miguel" escribió en el mensaje
news:e8NK$
hola de nuevo, José Ignacio !

es probable que si a dicha celda 'solo' se le borra el contenido...
siga siendo 'reportada' como si fuera la ultima celda si ha 'conservado'


formatos personalizados
[desde 'simples' negritas/trama/color... hasta reglas de validacion]


tambien 'habria que' desaparecerlos
toma nota que al modificar propiedades de celdas o entorno de la


aplicacion ->por codigo<-...
SE PIERDE el beneficio del 'des-hacer' [undo... ctrl+z] ->se vacia la
pila


de niveles del des-hacer<-
la macro 'actualizada' seria...
Sub Ir_a_UltimaCelda()
With Cells.SpecialCells(xlCellTypeLastCell)
If .Value = "" Then .Clear
End With
ActiveSheet.UsedRange
Cells.SpecialCells(xlCellTypeLastCell).Select
End Sub

saludos,
hector.










Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida