Solicitud de Sugerencia de como resolver situación de datos repetidos en archivo de excel

S a l u d o s   Dam

Tengo la siguiente situación, una hoja llamada "Visitas" en la cual registro los datos que deseo almacenar en otra hoja llamada "Cartera" mediante una macro llamada "Registros".

La macro es esta:

Sub REGISTROS()
'Act.Por.Dante Amor
    Application.Visible = False
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Set h1 = Sheets("VISITAS")
    Set h2 = Sheets("CARTERA")
    Set h4 = Sheets("CLIENTES")
    '
    u = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    h1.Range("C5:C14").Copy: h2.Range("A" & u).PasteSpecial Paste:=xlPasteValues, Transpose:=True
    h1.Range("F5:F14").Copy: h2.Range("K" & u).PasteSpecial Paste:=xlPasteValues, Transpose:=True
    h1.Range("F2").Copy: h2.Range("U" & u).PasteSpecial Paste:=xlPasteValues, Transpose:=False
    h2.Range("V3:Y3").Copy h2.Range("V" & u)
    h2.Range("F" & u).TextToColumns Destination:=h2.Range("Z" & u), DataType:=xlFixedWidth, _
        FieldInfo:=Array(Array(0, 2), Array(1, 1), Array(4, 1)), TrailingMinusNumbers:=True
    h2.Range("AC3").Copy h2.Range("AC" & u)
    h2.Range("H" & u).TextToColumns Destination:=h2.Range("AD" & u), _
        DataType:=xlDelimited, TextQualifier:=xlNone, ConsecutiveDelimiter:=True, Space:=True, _
        FieldInfo:=Array(Array(1, 2), Array(2, 2)), TrailingMinusNumbers:=True
    h2.Range("AF" & u) = "=TEXT(RC[-31],""yyyy"")"
    h2.Range("AG" & u) = "=TEXT(RC[-32],""mmmm"")"
    h2.Range("AH" & u) = "=IF(RC[-4]="""","""",IF(RC[-4]=""plan"",""Particulares"",RC[-3]))"
    Set b = h4.Columns("C").Find(h1.[C7], lookat:=xlWhole)
    If Not b Is Nothing Then
    h2.Range("AW" & u) = h4.Cells(b.Row, "F")
    End If
    '
    h1.Unprotect Password:="0976342842"
    H1. Range("F5:F7"). ClearContents
    H1. Range("F10:F12"). ClearContents
    H1. Range("F14"). ClearContents
    H1. Range("C6:C7"). ClearContents
    H1. Range("C9:C12"). ClearContents
    H1. Range("C14"). ClearContents
    h1.Range("F2") = h1.Range("F2") + 1
    h1.Protect Password:="0976342842"
    Application.ScreenUpdating = True
    Application.Visible = True
    ActiveWorkbook.Save
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
End Sub

No estoy muy satisfecho actualmente al ejecutar la macro por que tarda demasiado, pero creo que es por la siguiente situación:

Resulta que cuando la macro se ejecuta, ella traslada al rededor de 20 datos a la hoja "Cartera" y en dicha hoja en unas columnas adicionales hay formulas que toman información de los datos ingresados y hacen sus operaciones.

Hasta ahí bien, lo que pasa es que tengo 2 hojas más, una llamada "Analisis" y otra llamada "CopiaDatos" que toman los datos de la hoja "Cartera" con formulas sencillas como estas:

=SI(CARTERA!A10241="";"";CARTERA! A10241)

Y no se mucho de excel pero creo, tu me diras si estoy en lo correcto, que esto es lo que hace que la macro "Registros" se demore tanto pues hasta que no se actualicen las hojas "CopiaDatos" y "Analisis" no termina la macro.

¿Es correcto?

Y de ser asi, ¿Qué solución se le podría dar?

Yo uso la hoja "Cartera" como forma de seguridad oculta que nadie pueda acceder fácilmente a dichos datos para evitar que los borren.

La hoja CopiaDatos la utilizo únicamente para visualización de los datos.

La hoja Analisis en ella hago filtrosavanzados cuando deseo encontrar datos de un cliente especifico.

¿Qué me sugieres?

1 respuesta

Respuesta
1

Me habías comentado que es un archivo muy grande, entonces después de ejecutas la macro guardas el libro con

ActiveWorkbook. Save

Te sugiero que quites esa línea y me digas si el tiempo todavía es demasiado.

Si es demasiado, entonces habría que cambiar cada una de las instrucciones copy por una igualación. Por ejemplo, para este caso:

    u = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    h1.Range("C5:C14").Copy: h2.Range("A" & u).PasteSpecial Paste:=xlPasteValues, Transpose:=True

Habría que poner algo así:

    u = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    h2.Range("A" & u) = h1.[C5]
    h2.Range("B" & u) = h1.[C6]
    h2.Range("C" & u) = h1.[C7]
    h2.Range("D" & u) = h1.[C8]
    h2.Range("E" & u) = h1.[C9]
    h2.Range("F" & u) = h1.[C10]
    h2.Range("G" & u) = h1.[C11]
    h2.Range("H" & u) = h1.[C12]
    h2.Range("I" & u) = h1.[C13]
    h2.Range("J" & u) = h1.[C14]

Otra sugerencias es que quites las fórmulas y pongas los valores, por ejemplo en esta instrucción de la macro estás poniendo el año de la columna A

h2.Range("AF" & u) = "=TEXT(RC[-31],""yyyy"")"

Pero si siempre vas a poner el año, qué caso tiene poner una fórmula, mejor pon el resultado:

h2.Range("AF" & u) = Format(h2.Range("A" & u), "yyyy")

Y con eso evitas poner más fórmulas en tu archivo.


s a l u d o s

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas