CAMBIAR CÓDIGO PARA ACELERAR MACRO.

19/12/2006 - 10:43 por MarianoB | Informe spam
Hola grupo,

Tengo unos datos que importo desde un query de AS400, todas las
columnas tienen igual
longitud. Algunas filas estan "repetidas" excepto una columna (la
última).
Lo que he hecho es trasponer (con codigo porque son unos 13000
registros) esos datos ,que varían, a la primera fila repetida de cada
"repetición" (hay filas que no se repiten y otras que si lo hacen en
algunos casos hasta 8 veces). Posteriormente he marcado en una nueva
columna en el lado derecho cuantas celdas he traspuesto y finalmente en
función de ese numero (número de filas por debajo de la actual que
sobran y, por lo tanto, borro) borro las filas siguientes (si pone un 2
borro las 2 siguientes, si pone un 5 borro las 5 siguientes, si pone un
0 no borro la siguiente).
La parte de una pequeña formula matricial que varía solo un poco
(está aplicada en 10 columnas) y que he copiado luego a unas 13000
filas y tarda aproximadamente un minuto en ejecutarse es la parte del
codigo que me gustaría "acelerar" (el tiempo dependerá del equipo de
cada uno) ya que es como indico es muy
lento.

Sub a()
'
'a Macro
' Macro grabada el 19/12/2006 por MarianoB
'
' Acceso directo: CTRL+a
'LA PARTE LENTA EMPIEZA AQUÍ Y LLEGA HASTA LOS ASTERISCOS

Range("Y2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-23]=R[1]C[-23],R[1]C[-1]<>RC[-1]:RC[-1],R[-1]C[-23]<>""""),R[1]C[-1],"""")"
Range("Z2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-24]=R[2]C[-24],R[2]C[-2]<>RC[-2]:RC[-1],R[-1]C[-24]<>""""),R[2]C[-2],"""")"
Range("AA2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-25]=R[3]C[-25],R[3]C[-3]<>RC[-3]:RC[-1],R[-1]C[-25]<>""""),R[3]C[-3],"""")"
Range("AB2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-26]=R[4]C[-26],R[4]C[-4]<>RC[-4]:RC[-1],R[-1]C[-26]<>""""),R[4]C[-4],"""")"
Range("AC2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-27]=R[5]C[-27],R[5]C[-5]<>RC[-5]:RC[-1],R[-1]C[-27]<>""""),R[5]C[-5],"""")"
Range("AD2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-28]=R[6]C[-28],R[6]C[-6]<>RC[-6]:RC[-1],R[-1]C[-28]<>""""),R[6]C[-6],"""")"
Range("AE2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-29]=R[7]C[-29],R[7]C[-7]<>RC[-7]:RC[-1],R[-1]C[-29]<>""""),R[7]C[-7],"""")"
Range("AF2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-30]=R[8]C[-30],R[8]C[-8]<>RC[-8]:RC[-1],R[-1]C[-30]<>""""),R[8]C[-8],"""")"
Range("AG2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-31]=R[9]C[-31],R[9]C[-9]<>RC[-9]:RC[-1],R[-1]C[-31]<>""""),R[9]C[-9],"""")"
Range("AH2").Select
Selection.FormulaArray = _

"=IF(AND(RC[-32]=R[10]C[-32],R[10]C[-10]<>RC[-10]:RC[-1],R[-1]C[-32]<>""""),R[10]C[-10],"""")"
' CUENTA LAS VECES QUE SE REPITE Y COPIA TODO HACIA ABAJO
Range("ai2").Select
ActiveCell.FormulaR1C1 = "-COUNTBLANK(RC[-10]:RC[-1])"
Range("AI2").Select
Range("Y2:ai2").Select
Selection.Copy
Range("Y3:ai13000").Select
ActiveSheet.Paste
'*********************
Columns("Y:AI").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
'ESTÁ PARTE ES UNA APORTACIÓN DE IVAN DE
groups.google.com/group/microsoft.public.es.excel
Dim f As Long
For f = 2 To [ai65536].End(xlUp).Row
With Range("ai" & f)
If .Value > 0 Then
Select Case .Value
Case 1: .Offset(1, 0).EntireRow.Delete
Case Else
Range("ai" & f + 1 & ":ai" & f +
.Value).EntireRow.Delete
End Select
' .Value = 0
.Value = 0
End If
End With
Next
End Sub


SALU2 a tod@s.

MarianoB

Preguntas similare

Leer las respuestas

#6 Juan M
21/12/2006 - 08:21 | Informe spam
Hola Mariano

Despues de ver lo que hace la formula, te he preparado un proceso que
'reproduce' (al menos eso espero) los resultados de las formulas
matriciales.

Otra cuestion es que trabajando en el codigo se me ocurrio una posible
formula no matricial, algo asi
[Y2]=si(y(b2³;eserror(coincidir(x3;x2:x2;0));b1<>"");x3;"")
[Y3]=si(y(b2´;eserror(coincidir(x4;x2:Y2;0));b1<>"");x4;"")
...
dime si funciona

El procedimiento hace una cosa similar con un añadido mas, no hara nada si
la columna x de esa fila esta vacia.
Si no hace lo que esperas o tienes dudas sobre lo que hace ya nos cuentas.

Un saludo
Juan

Inicio Codigo
Sub test()
Dim i As Long, j As Long
Dim c As Range, d As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
i = 2
Do While Range("B" & i) <> ""
If Range("X" & i) <> "" Then
Set c = Range("X" & i)
For j = 1 To 10
'se ha quitado la tabulacion intencionadamente
Set d = c.Resize(1, j).Find(Range("X" & i + j), LookIn:=xlValues)
If Range("B" & i) = Range("B" & i + j) And d Is Nothing Then
Range("X" & i).Offset(, j) = Range("X" & i + j).Value
Else
Exit For
End If
Next j
End If
i = i + 1
Loop
Set c = Nothing
Set d = Nothing
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = True
End Sub
Fin Codigo
Respuesta Responder a este mensaje
#7 MarianoB
21/12/2006 - 22:04 | Informe spam
Hola Juan M,

Ante todo, el proceso funciona perfectamente y como es de bien nacidos
ser agradecidosgracias.

Me preguntas si tengo dudas sobre lo que hace: dudas no, pero reconozco
que, al menos por código que es donde ando mas flojo, no se me habría
ocurrido.
Por otro lado estoy probando ahora las formulas no matriciales que
expones y variandolas para otras posibles aplicaciones. Te diré algo
cuando lo pruebe mas a fondo.


Gracias y SALU2.

MarianoB
Respuesta Responder a este mensaje
#8 Juan M
22/12/2006 - 10:08 | Informe spam
Hola Mariano

Gracias a ti por el feedback.
Cuando pruebes le formula ya me contaras como van los rendimientos.

Un saludo
Juan


Ante todo, el proceso funciona perfectamente y como es de bien nacidos
ser agradecidosgracias.

Me preguntas si tengo dudas sobre lo que hace: dudas no, pero reconozco
que, al menos por código que es donde ando mas flojo, no se me habría
ocurrido.
Por otro lado estoy probando ahora las formulas no matriciales que
expones y variandolas para otras posibles aplicaciones. Te diré algo
cuando lo pruebe mas a fondo.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida