Optimizar proceso Comprobación datos vba excel
Tengo macro que copia datos de una hoja Origen a otra Destino siempre y cuando el dato que intenta copiar no esté en la hoja destino.
Mi problema viene cuando son muchos los registros que debe comprobar, se ralentiza muchisimo y no veo la forma de agilizarlo.
Os adjunto un ejemplo, el archivo original es mucho más amplio.
En este ejemplo se puede ver perfectamente donde está el problema, hay unos 1800 registros.
Sub Ejecuta()
'---------------------------comenzamos a depurar.
'
Set WsOrigen = Sheets("Mes en Curso")
Set wsfinal = Sheets("Simulador")
wsfinal.Select
Dim finalwsorigen As Integer
Dim FinalWsDestino As Integer
Dim CuentaObrasActu As Integer
Dim RangoFormula As Range
'
finalwsorigen = WsOrigen.Range("A" & Rows.Count).End(xlUp).Row
FinalWsDestino = wsfinal.Range("A" & Rows.Count).End(xlUp).Row
'
' Se utilizan para actualizar un formulario que no hay en este ejemplo
CuentaObrasActu = 0
'
For I = 3 To finalwsorigen
'
CuentaObrasActu = CuentaObrasActu + 1
' Comenzamos a comprobar y poner obras.
For j = 2 To FinalWsDestino
If WsOrigen.Cells(I, "A") = wsfinal.Cells(j, "A") Then encontrado = 1
DoEvents
Application.StatusBar = " Registros actualizados: " & CuentaObrasActu
Next
If encontrado = 0 Then
Set wsorigen2 = Sheets("Simulador Base")
wsfinal.Select
'copia formula de A4 Simulador Base
FinalWsDestino = wsfinal.Range("A" & Rows.Count).End(xlUp).Row
wsorigen2.Range("A4:DB4").Copy Destination:=wsfinal.Range("A" & FinalWsDestino + 1)
Application.CutCopyMode = False
'Copia datos de mes en curso en simulador
WsOrigen.Cells(I, "A").Copy
wsfinal.Range("A" & FinalWsDestino + 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
' Si es una obra nueva, copiamos los datos de valores de pedido, aplicamos formatos y copiamos todas las formulas.
WsOrigen.Cells(I, "G").Copy
wsfinal.Range("BY" & FinalWsDestino + 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
encontrado = 0
Else
encontrado = 0
End If
Next
'
wsfinal.Select
'Copiamos la fila 1 de los subtotales de la plantilla Base Simulador en el Simulador, por si ha perdido la configuracion.
Wsorigen2.Range("B1:DA1").Copy Destination:=wsfinal.Range("B1")
'
'liberamos las variables de la memoria, liberamos memoria y recursos.
Application.StatusBar = "Proceso Terminado"
End Sub
1 respuesta
Respuesta de James Bond
