cual es la mejor foma para copiar una formula

17/02/2005 - 16:53 por fredy | Informe spam
tengo una hoja con 20000 registros y quiero en una columna realizar un
calculo por medio de macros , la formula es un buscarv para determinar los
valores repetidos asi:

Selection.FormulaR1C1 = "=VLOOKUP(RC[-1],R1C[-1]:R[-1]C[-1],1,FALSE)"

mi pregunta es he pensado en dos opciones para ejecutar esta formula una es
seleccionando el rango completo desde la celda 2 hasta la 20000 y copiar la
formula y luego con un pegado especial dejar solo los valores y la otra es
con un bucle for next ir ejecutando la formula celda a celda y convirtiendo
el resultado en valor para no cargar con formulas el archivo

que me aconsejan o sera que hay otra forma mas facil y rapida de hacerlo lo
que pasa es que este es 1 archivo de 12 es decir son casi 240000 registros y
pues la verdad ... es largo

muchas gracias

Preguntas similare

Leer las respuestas

#6 KL
19/02/2005 - 21:50 | Informe spam
Hola Fredy,

Si te funciona tu formula pues no hay problema. No se cuan rapido te lo
hace, pero podrias probar la siguiente tambien y luego haces el bucle para
eliminar las q llevan el valor False.

La notacion normal de la formula seria:
=SI(NO(FILA(INDICE($A$1:$A$20;COINCIDIR(A1;$A$1:$A$20;0)))=FILA());FALSO;"")

Dependiendo de cuantas filas podrian repetirse y tambien de caun repartidas
esten las repeticiones creo q podrias intentar usar la siguiente instruccion
para eliminar filas repetidas:

Range("B1:B20000").SpecialCells(xlCellTypeConstants,
xlLogical).EntireRow.Delete

Esta instruccion no funcionaria si hay mas de aproximadamente 8000 (no
recuerdo el numero exacto) filas no contiguas (cosa q con 20000 filas puede
pasar facilmente p.ej. si hay 8001 celdas con valores unicos y cada una esta
seguida o precedida por una celda q tiene el mismo valor). Y por supuesto tu
tabla no debe contener otras columnas q contengan valores logicos.

Saludos,
KL

Sub Macro8()
Dim rango As String
Application.ScreenUpdating = False
With Range("B1")
.FormulaR1C1 = _
"=IF(NOT(ROW(INDEX(R1C1:R20000C1," & _
"MATCH(RC[-1],R1C1:R20000C1,0)))=ROW())," & _
"FALSE,"""")"
.Copy Range("B2:B20000")
End With
With Range("B1:B20000")
.Copy
.PasteSpecial xlPasteValues
Application.CutCopyMode = False
End With
Application.ScreenUpdating = True
End Sub





"fredy" wrote in message
news:
hola KL
a mi me funciona si quiero saber es cuales estan repetidas. por eso al
utilizar la formula buscarv devolviendo el valor de la columna 1 el me
identifica con el codigo la repetida y con un #n/a (error) las que no
estan
repetidas, luego las que no son error las elimino ya que estas son
repetidas

no entiendo por que dices que tengo el riezgo de eliminarlas todas si
cuando
la formula da error simplemente esa fila no se elimina

la busqueda la realizo sin tener en cuenta en el rango de busqueda la
celda
que busco es decir que para evaluar la celda a1 tomo el rango desde a2
hasta
el final

lo que pasa es que aplicando esta formula a las 20000 celdas se relentiza
el
computador por eso en ocasiones realizo bucles donde aplico la formula y
pego
le respuesta como valor.

queria saber cual de las dos alternativas me deja funcionar mejor el pc o
si
existe otra forma de realizar esta eliminacion de filas

muchas gracias
:D
"KL" wrote:

Fredy,

El problema es q la funcion VLOOKUP no te dira si hay repetidos sino q si
hay al menos una ocurrencia del valor buscado en el rango, por lo cual
corres el riesgo de eliminar todos.

Para detectar repeticiones yo usaria COUNTIF

Saludos,
KL

"fredy" wrote in message
news:
> gracias KL
> tengo una columna (a) donde esta el codigo del registro este se puede
> repetir el alguno de los 20000 registros, debo eliminar los registros
> repetidos de abajo hacia arriba , mi formula (en una columna paralela a
> la
> de
> los codigos) lo que hace es verificar que registro se encuentra
> repetido,
> luego si esta repetido lo elimino...
>
> por eso mi pregunta de cual era la forma mas conveniente que realizara
> la
> formula para todo el rango o con el bucle ir ejecutando la formula
> celda a
> celda
> "KL" wrote:
>
>> Fredy,
>>
>> No estoy seguro de q entienda q es lo q quieres conseguir con tu
>> formula
>> pero quizas te valga esto:
>>
>> Sub testFredy()
>> With Application.WorksheetFunction
>> Range("B1:B20000") = .VLookup(Range("A1:A20000"), _
>> Range("$A$1:$A$20000"), 1, False)
>> End With
>> End Sub
>>
>> Saludos,
>> KL
>>
>> "fredy" wrote in message
>> news:
>> > tengo una hoja con 20000 registros y quiero en una columna realizar
>> > un
>> > calculo por medio de macros , la formula es un buscarv para
>> > determinar
>> > los
>> > valores repetidos asi:
>> >
>> > Selection.FormulaR1C1 =
>> > "=VLOOKUP(RC[-1],R1C[-1]:R[-1]C[-1],1,FALSE)"
>> >
>> > mi pregunta es he pensado en dos opciones para ejecutar esta formula
>> > una
>> > es
>> > seleccionando el rango completo desde la celda 2 hasta la 20000 y
>> > copiar
>> > la
>> > formula y luego con un pegado especial dejar solo los valores y la
>> > otra
>> > es
>> > con un bucle for next ir ejecutando la formula celda a celda y
>> > convirtiendo
>> > el resultado en valor para no cargar con formulas el archivo
>> >
>> > que me aconsejan o sera que hay otra forma mas facil y rapida de
>> > hacerlo
>> > lo
>> > que pasa es que este es 1 archivo de 12 es decir son casi 240000
>> > registros
>> > y
>> > pues la verdad ... es largo
>> >
>> > muchas gracias
>>
>>
>>



Respuesta Responder a este mensaje
#7 KL
20/02/2005 - 00:59 | Informe spam
Hola Fredy,

He probado un monton de diferentes instrucciones para eliminar las filas
duplicadas en hojas con 20,000 filas y te pongo las q han demostrado los
tres mejores tiempos. La conclusion q saco de mis pruebas (a no ser q haya
hecho algo mal) es q es mas eficiente introducir las formulas en la hoja y
luego copiar y pegar valores que usar el bucle sobre las formulas aun cuando
se desactive el recalculo automatico.

Saludos,
KL

1) El mas rapido - 38 segundos en P4 1.8Mhz SDRAM 512. El problema
importante q tiene es q fallara si hay mas de 8000 filas repetidas no
contiguas (si son contiguas - no hay problema - puede haber hasta 65536
siempre y cuando formen menos de 8000 rangos aislados)

'Inicio Codigo 1--
Sub Macro14()
Dim tiempo As Double
tiempo = Time
With Application
.ScreenUpdating = False
.EnableEvents = False
With ActiveSheet
.Range("B1").FormulaR1C1 = _
"=IF(NOT(ROW(INDEX(R1C1:R20000C1," & _
"MATCH(RC[-1],R1C1:R20000C1,0)))=ROW())," & _
"FALSE,"""")"
.Range("B1").Copy .Range("B2:B20000")
With .Range("B1:B20000")
.Copy
.PasteSpecial xlPasteValues
End With
End With
.CutCopyMode = False
.Calculation = xlCalculationManual
ActiveSheet.Range("B1:B20000").SpecialCells _
(xlCellTypeConstants, xlLogical).EntireRow.Delete
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
tiempo = Time - tiempo
MsgBox Format(tiempo, "hh:mm:ss")
End Sub
'Fin Codigo 1--

2) El segundo mas rapido - 1 min 05 segundos en P4 1.8Mhz SDRAM 512.

'Inicio Codigo 2--
Sub Macro10()
Dim tiempo As Double
tiempo = Time
With Application
.ScreenUpdating = False
.EnableEvents = False
With ActiveSheet
.Range("B1").FormulaR1C1 = _
"=ROW(INDEX(R1C1:R20000C1," & _
"MATCH(RC[-1],R1C1:R20000C1,0)))=ROW()"
.Range("B1").Copy .Range("B2:B20000")
With .Range("B1:B20000")
.Copy
.PasteSpecial xlPasteValues
End With
End With
.CutCopyMode = False
.Calculation = xlCalculationManual
For fila = 20000 To 1 Step -1
With ActiveSheet
If .Cells(fila, 2) = False Then
.Rows(fila).Delete
End If
End With
Next fila
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
tiempo = Time - tiempo
MsgBox Format(tiempo, "hh:mm:ss")
End Sub
'Fin Codigo 2--

3) El tercero mas rapido - 4 min 18 segundos en P4 1.8Mhz SDRAM 512.

'Inicio Codigo 3--
Sub Macro9()
Dim fila As Long
Dim prueba As Long
Dim tiempo As Double
tiempo = Time
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
For fila = 20000 To 1 Step -1
With ActiveSheet
prueba = WorksheetFunction.CountIf _
(.Range("A1:A20000"), .Cells(fila, 1).Value)
If prueba > 1 Then
.Rows(fila).Delete
End If
End With
Next fila
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
tiempo = Time - tiempo
MsgBox Format(tiempo, "hh:mm:ss")
End Sub
'Fin Codigo 3--
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida