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