Saber cuando ocupa un rango

30/03/2005 - 13:41 por Julio Ríos | Informe spam
Buenos días a todos, tengo una hoja y he programado una macro. Esta
macro actua sobre los registros de una hoja. En las pruebas que hice los
registros eran 4, pero la idea es que los datos sobre los cuales voy a
pasar la macros no las se de antemano, unas veces son 100, otras son
2000, otras 345, etc., estos registros los copio y pego de otra hoja que
se me proporciona.

Mi pregunta es ¿cómo puedo saber cuando acabo de copiar a una hoja en
blanco los registros que hay en la hoja para que se me pase la hoja en
todos los registros?

Al hacer la macro en el código aparece esto

Selection.End(xlDown).Select
Range("C4").Select

Y aquí es donde tengo el problema porque la macro selecciona C4 como
último registro, pero al copiar y pegar de otra hoja la macro sólo
actuará sobre los 4 primeros registros y no los datos que he copiado
desde otra hoja excel.


Un saludo, Julio.

Preguntas similare

Leer las respuestas

#1 KL
30/03/2005 - 14:20 | Informe spam
Hola Julio,

Para poder darte una solucion ajustada a tus necesidades lo mejor seria que
expongas el codigo completo. Ahora, como observaciones generales:

1) Por lo que leo en la descripcion del problema y el trozo de codigo que
expones, estas usando el metodo Select donde puedes prescindir de el
perfectamente.

2) Para encontrar la celda por debajo del ultimo valor en una columna
(suponiendo que la columna en cuestion es 'C') puedes usar la siguiente
instruccion:

ActiveSheet.Cells(65536,"C").End(xlUp).Offset(1,0)

3) Muchas veces las instrucciones mas eficientes para copiar rangos pueden
ser las siguientes:

a. si lo quieres copiar todo (incluidos los formatos):

Worksheets("Hoja1").Range("C5:K5").Copy _
Worksheets("Hoja2").Cells(65536,"C").End(xlUp).Offset(1,0)

b. si solo quieres copiar valores:

With Worksheets("Hoja1").Range("C5:K5")
Worksheets("Hoja2").Cells(65536, "C"). _
End(xlUp).Offset(1, 0).Resize(.Rows.Count, _
.Columns.Count).Value = .Value
End With

Saludos,
KL


"Julio Ríos" wrote in message
news:
Buenos días a todos, tengo una hoja y he programado una macro. Esta macro
actua sobre los registros de una hoja. En las pruebas que hice los
registros eran 4, pero la idea es que los datos sobre los cuales voy a
pasar la macros no las se de antemano, unas veces son 100, otras son 2000,
otras 345, etc., estos registros los copio y pego de otra hoja que se me
proporciona.

Mi pregunta es ¿cómo puedo saber cuando acabo de copiar a una hoja en
blanco los registros que hay en la hoja para que se me pase la hoja en
todos los registros?

Al hacer la macro en el código aparece esto

Selection.End(xlDown).Select
Range("C4").Select

Y aquí es donde tengo el problema porque la macro selecciona C4 como
último registro, pero al copiar y pegar de otra hoja la macro sólo actuará
sobre los 4 primeros registros y no los datos que he copiado desde otra
hoja excel.


Un saludo, Julio.


Respuesta Responder a este mensaje
#2 Manuel Romero
30/03/2005 - 19:51 | Informe spam
Creo que lo que quieres es

Selection.End(xlDown).Select
ActiveCell.Offset(1,0).Select

"Julio Ríos" escribió en el mensaje
news:
Buenos días a todos, tengo una hoja y he programado una macro. Esta
macro actua sobre los registros de una hoja. En las pruebas que hice los
registros eran 4, pero la idea es que los datos sobre los cuales voy a
pasar la macros no las se de antemano, unas veces son 100, otras son
2000, otras 345, etc., estos registros los copio y pego de otra hoja que
se me proporciona.

Mi pregunta es ¿cómo puedo saber cuando acabo de copiar a una hoja en
blanco los registros que hay en la hoja para que se me pase la hoja en
todos los registros?

Al hacer la macro en el código aparece esto

Selection.End(xlDown).Select
Range("C4").Select

Y aquí es donde tengo el problema porque la macro selecciona C4 como
último registro, pero al copiar y pegar de otra hoja la macro sólo
actuará sobre los 4 primeros registros y no los datos que he copiado
desde otra hoja excel.


Un saludo, Julio.


Respuesta Responder a este mensaje
#3 Julio Ríos
06/04/2005 - 15:12 | Informe spam
Básicamente tengo una hoja excel con los siguientes datos:
Nombre, CIF, Fecha de Nacimiento.
Tengo que tratar los datos CIF y fecha de nacimiento.
Ddepende de la hoja a veces tengo 150 registros y otros días tengo 247,
por ejemplo. no sé apriori el número exacto de registros a tratar.

El cif en principio viene con la letra y yo necesito separala del
número. Ejemplo 123456789X, y debo dejarlo en dos columnas una con el
dato numércio 123465789 y en otra columna la letra, en este caso X.

La fecha de nacimiento debo de separarla en año, mes día.
Ejemplo: 01-05-1995 debo crear tres columnas con los datos 1, 5 y 1995.

Para hacer esto lo que intento automatizar es lo siguiente.
1.- Tratar el CIF
Paso 1. Crear una columna al lado de la columna del cif (Almacenaré la
parte numérica del CIF)
Paso 2. Crear una columna al lado de esta última para almacenar la letra.

El codigo que hace esto es el siguiente

Columns("C:C").Select
Application.CutCopyMode = False
Selection.Insert Shift:=xlToRight
Selection.Insert Shift:=xlToRight

Paso 3. Separar la letra del número. Para esto utilizo una fórmula de
excel según el formato que me llega (IF(LEN(RC[-1])=9, LEFT(RC[-1],
LEN(RC[-1])-1), ""ERROR""))

Con este codigo ActiveCell.FormulaR1C1 = "=IF(LEN(RC[-1])=9,
LEFT(RC[-1], LEN(RC[-1])-1), ""ERROR"")" lo que obtengo es la parte
númerica del cif.

Paso 4. Copiar esta fórmula en todos los registros que tengan datos.
Es lo que no funciona

Range("C1").Select
ActiveCell.FormulaR1C1 = "=IF(LEN(RC[-1])=9, LEFT(RC[-1],
LEN(RC[-1])-1), ""ERROR"")"
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste

Porque lo hace hasta el final y no se para hasta el registro 100.

El código completo es este:

Columns("C:C").Select
Application.CutCopyMode = False
Selection.Insert Shift:=xlToRight
Selection.Insert Shift:=xlToRight

ActiveCell.FormulaR1C1 = "=IF(LEN(RC[-1])=9, LEFT(RC[-1],
LEN(RC[-1])-1), ""ERROR"")"

Range("C1").Select
ActiveCell.FormulaR1C1 = "=IF(LEN(RC[-1])=9, LEFT(RC[-1],
LEN(RC[-1])-1), ""ERROR"")"
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste


Un saludo, Julio.





KL escribió:
Hola Julio,

Para poder darte una solucion ajustada a tus necesidades lo mejor seria que
expongas el codigo completo. Ahora, como observaciones generales:

1) Por lo que leo en la descripcion del problema y el trozo de codigo que
expones, estas usando el metodo Select donde puedes prescindir de el
perfectamente.

2) Para encontrar la celda por debajo del ultimo valor en una columna
(suponiendo que la columna en cuestion es 'C') puedes usar la siguiente
instruccion:

ActiveSheet.Cells(65536,"C").End(xlUp).Offset(1,0)

3) Muchas veces las instrucciones mas eficientes para copiar rangos pueden
ser las siguientes:

a. si lo quieres copiar todo (incluidos los formatos):

Worksheets("Hoja1").Range("C5:K5").Copy _
Worksheets("Hoja2").Cells(65536,"C").End(xlUp).Offset(1,0)

b. si solo quieres copiar valores:

With Worksheets("Hoja1").Range("C5:K5")
Worksheets("Hoja2").Cells(65536, "C"). _
End(xlUp).Offset(1, 0).Resize(.Rows.Count, _
.Columns.Count).Value = .Value
End With

Saludos,
KL


"Julio Ríos" wrote in message
news:

Buenos días a todos, tengo una hoja y he programado una macro. Esta macro
actua sobre los registros de una hoja. En las pruebas que hice los
registros eran 4, pero la idea es que los datos sobre los cuales voy a
pasar la macros no las se de antemano, unas veces son 100, otras son 2000,
otras 345, etc., estos registros los copio y pego de otra hoja que se me
proporciona.

Mi pregunta es ¿cómo puedo saber cuando acabo de copiar a una hoja en
blanco los registros que hay en la hoja para que se me pase la hoja en
todos los registros?

Al hacer la macro en el código aparece esto

Selection.End(xlDown).Select
Range("C4").Select

Y aquí es donde tengo el problema porque la macro selecciona C4 como
último registro, pero al copiar y pegar de otra hoja la macro sólo actuará
sobre los 4 primeros registros y no los datos que he copiado desde otra
hoja excel.


Un saludo, Julio.







Respuesta Responder a este mensaje
#4 KL
06/04/2005 - 16:29 | Informe spam
Hola Julio,

Prueba el siguiente codigo.

Saludos,
KL

'Inicio Codigo-
Sub test()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
.CutCopyMode = False
F = "=IF(LEN(RC[-1])=9, LEFT(RC[-1],LEN(RC[-1])-1), ""ERROR"")"
With ActiveSheet
.Columns("C:C").Insert (xlToRight)
.Columns("C:C").Insert (xlToRight)
.Range(.Cells(1, "E"), .Cells(65536, "E").End(xlUp)) _
.Offset(0, -2).FormulaR1C1 _
= F
End With
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
'Fin Codigo-
Respuesta Responder a este mensaje
#5 Julio Ríos
19/04/2005 - 09:59 | Informe spam
KL escribió:
Hola Julio,

Prueba el siguiente codigo.

Saludos,
KL

'Inicio Codigo-
Sub test()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
.CutCopyMode = False
F = "=IF(LEN(RC[-1])=9, LEFT(RC[-1],LEN(RC[-1])-1), ""ERROR"")"
With ActiveSheet
.Columns("C:C").Insert (xlToRight)
.Columns("C:C").Insert (xlToRight)
.Range(.Cells(1, "E"), .Cells(65536, "E").End(xlUp)) _
.Offset(0, -2).FormulaR1C1 _
= F
End With
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
'Fin Codigo-




Muchas gracias por tu ayuda una vez entendido el código ha servido
perfectamente.

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