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

#6 KL
07/01/2005 - 16:33 | Informe spam
Como ya habia dicho era una idea loca. Parece q a partir de cierto tamano de
rango o numero de areas la funcion deja de funcionar. Aqui esta una funcion
q encontre en Google (ligeramente modificada) q si parece funcionar:

Function LastCell(Optional ws As Worksheet) As Range
If ws Is Nothing Then Set ws = ActiveSheet
Set rng = ws.Cells
Set LastCell = rng(1)
On Error Resume Next
Set LastCell = Intersect( _
rng.Find("*", rng(1), xlValues, xlWhole, xlByRows, _
xlPrevious).EntireRow, _
rng.Find("*", rng(1), xlValues, xlWhole, xlByColumns, _
xlPrevious).EntireColumn)
End Function


"KL" wrote in message
news:OECM%
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
#7 KL
07/01/2005 - 17:33 | Informe spam
Por si a alguien le interesa el porque mi "funcion no funciona", aqui esta
la explicacion:

"La funcion .SpecialCells(xlCellTypeBlanks) de VBA no funciona como se
espera en Excel": http://support.microsoft.com/kb/832293/es

KL

"KL" wrote in message
news:u7$
Como ya habia dicho era una idea loca. Parece q a partir de cierto tamano
de rango o numero de areas la funcion deja de funcionar. Aqui esta una
funcion q encontre en Google (ligeramente modificada) q si parece
funcionar:

Function LastCell(Optional ws As Worksheet) As Range
If ws Is Nothing Then Set ws = ActiveSheet
Set rng = ws.Cells
Set LastCell = rng(1)
On Error Resume Next
Set LastCell = Intersect( _
rng.Find("*", rng(1), xlValues, xlWhole, xlByRows, _
xlPrevious).EntireRow, _
rng.Find("*", rng(1), xlValues, xlWhole, xlByColumns, _
xlPrevious).EntireColumn)
End Function


"KL" wrote in message
news:OECM%
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
#8 Héctor Miguel
08/01/2005 - 06:41 | Informe spam
hola, José Ignacio y KL !

José Ignacio escribio en el mensaje...
... has abierto nuevos problemas, en los que ni habia pensado.
... a veces la LastCell ... es la punta de ... p.ej. algo en I3 y en B21 ... es I21
... como en el codigo ... el clear lo hago sobre la LastCell no me sirve, y ... sigue apuntando a I21.
... no tenia este problema ... tu solucion ya me sirve
... me gustaria ... prever tambien este problema ... asi tendria una rutina mas universal.



1° ciertamente que 'manejar/conocer' la [verdaderamente] 'ultima celda' de una hoja de calculo...
tiene [sus] consideraciones muy especiales [solo para no 'entrar en detalles' en este mensaje]
encontraras [mas que] 'suficiente' informacion en... http://www.mvps.org/dmcritchie/excel/lastcell.htm
2° la funcion que sugiere KL [la que encontro en 'San Google']...
es [mas que] 'funcional' para NO 'tener que' detectar/eliminar los formatos personalizados ;)
3° sin embargo [y como bien mencionas en tu ejemplo]...
si SOLAMENTE existen datos en $i$3 y $b$21 y la [verdadera] ultima celda NO ES $I$21...
-> ¿a cual de las celdas [realmente con datos] quisieras que 'apuntara' el codigo como 'LastCell'?
a) al numero de fila 'mas grande' =>cualquiera que sea la columna<= ???
b) al numero de columna 'mas grande' =>cualquiera que sea la fila<= ???
c) a alguna fila/columna 'intermedia' =>cualquiera que sea su columna/fila<= ??? [o viceversa]
d) [a alguna celda 'particularmente especial'???...]
4° [como podras apreciar] 'conseguir' una rutina de busqueda de la ultima celda mas... 'universal'...
[creo que mas bien...] debiera 'atender' a algun otro tipo de prioridades/necesidades/eventualidades/...

si despues de 'dar un paseo' por la pagina que te apunto [y analizar sus muchos enlaces y ejemplos]...
necesitaras resolver alguna situacion 'mas en concreto'... ¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#9 José Ignacio Bella
09/01/2005 - 19:48 | Informe spam
hola de nuevo. no pensaba que la cosa fuera tan trascendente cuando envié la
primera pregunta...:-)

hector, quizás me expresé mal en mi respuesta anterior, pero para lo que yo
quiero, la lastcell correspondiente a entradas en I3 y B21 es I21; necesito
determinar la matriz definida por la ultima fila/columna con datos.
la ultima rutina de KL creo que es ok. la he estado probando y no le he
encontrado fallos.

gracias de nuevo




"Héctor Miguel" escribió en el mensaje
news:
hola, José Ignacio y KL !

> José Ignacio escribio en el mensaje...
> ... has abierto nuevos problemas, en los que ni habia pensado.
> ... a veces la LastCell ... es la punta de ... p.ej. algo en I3 y en B21


... es I21
> ... como en el codigo ... el clear lo hago sobre la LastCell no me


sirve, y ... sigue apuntando a I21.
> ... no tenia este problema ... tu solucion ya me sirve
> ... me gustaria ... prever tambien este problema ... asi tendria una


rutina mas universal.

1° ciertamente que 'manejar/conocer' la [verdaderamente] 'ultima celda' de


una hoja de calculo...
tiene [sus] consideraciones muy especiales [solo para no 'entrar en


detalles' en este mensaje]
encontraras [mas que] 'suficiente' informacion en...


http://www.mvps.org/dmcritchie/excel/lastcell.htm
2° la funcion que sugiere KL [la que encontro en 'San Google']...
es [mas que] 'funcional' para NO 'tener que' detectar/eliminar los


formatos personalizados ;)
3° sin embargo [y como bien mencionas en tu ejemplo]...
si SOLAMENTE existen datos en $i$3 y $b$21 y la [verdadera] ultima


celda NO ES $I$21...
-> ¿a cual de las celdas [realmente con datos] quisieras que


'apuntara' el codigo como 'LastCell'?
a) al numero de fila 'mas grande' =>cualquiera que sea la columna<???
b) al numero de columna 'mas grande' =>cualquiera que sea la fila<???
c) a alguna fila/columna 'intermedia' =>cualquiera que sea su


columna/fila<= ??? [o viceversa]
d) [a alguna celda 'particularmente especial'???...]
4° [como podras apreciar] 'conseguir' una rutina de busqueda de la ultima


celda mas... 'universal'...
[creo que mas bien...] debiera 'atender' a algun otro tipo de


prioridades/necesidades/eventualidades/...

si despues de 'dar un paseo' por la pagina que te apunto [y analizar sus


muchos enlaces y ejemplos]...
necesitaras resolver alguna situacion 'mas en concreto'... ¿comentas?
saludos,
hector.


Respuesta Responder a este mensaje
#10 José Ignacio Bella
09/01/2005 - 19:51 | Informe spam
hola, kl.
he estado probando la última función que apuntas, y creo que me sirve.
como le he comentado a hector, no pensaba que este tema fuera tan complejo
(ni tan ambiguo, ya que tampoco parece estar claro qué es en realidad la
lastcell).
gracias de nuevo

"KL" escribió en el mensaje
news:u7$
Como ya habia dicho era una idea loca. Parece q a partir de cierto tamano


de
rango o numero de areas la funcion deja de funcionar. Aqui esta una


funcion
q encontre en Google (ligeramente modificada) q si parece funcionar:

Function LastCell(Optional ws As Worksheet) As Range
If ws Is Nothing Then Set ws = ActiveSheet
Set rng = ws.Cells
Set LastCell = rng(1)
On Error Resume Next
Set LastCell = Intersect( _
rng.Find("*", rng(1), xlValues, xlWhole, xlByRows, _
xlPrevious).EntireRow, _
rng.Find("*", rng(1), xlValues, xlWhole, xlByColumns, _
xlPrevious).EntireColumn)
End Function


"KL" wrote in message
news:OECM%
> 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.
>>>>
>>>>
>>>
>>>
>>
>>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida