VBA mejorar código de ingreso de datos

buenas tardes doña Elsa, abro este nuevo tema como me solicitaste en el dia de hoy para mejorar el código con tus sugerencias, envío por correo el archivo muchas gracias

saludos cordiales

1 Respuesta

Respuesta
1

Recibido. Ni bien lo tenga revisado te lo devuelvo a tu correo.

Estas sugerencias se me ocurrieron al ver tu código en consulta anterior, donde comentabas que tu proceso tenía cierta demora. Así que lo comento aquí por si otros deciden leerlo, y sin entrar en la revisión de tu libro.

Lo que te produce demoras en el proceso es que formateas celda x celda y línea x línea.

1 - Si tenés un bucle del tipo:

For i = 1 To ReCantidad '(Step 1 no hace falta indicarlo, se predetermina un sto de 1)

Dá idea de que el mismo proceso se repetirá en varias filas.

Entonces guardá la fila inicial en una variable, antes del For. Al finalizar el proceso tendrás la fila final.

Luego a continuación recién agregá las instrucciones de formateo.

Por ej:

Range("B" & ini & ":B" & fini).Select

Call PintaBerde 'Borde verde

Range("C" & ini & ":H" & fini).Select

Call Rellena

.... y así con cada formato

2 - Si en cambio tenés un proceso donde solo se llena una fila pero algunas celdas comparten el mismo formato, por ej. negrita, también lo podes hacer al final con una sola instrucción:

Por ej:

filx = ActiveCell.Row
Range("B" & filx & ", H" & filx & ", P" & filx).Select
Selection.Font.Bold = True

PD) En la sección Macros de mi sitio encontrarás otros ejemplos de selección de rangos.

Un detalle al margen: no hace falta que desprotejas la hoja permanentemente, con 1 vez al ingreso del UF es suficiente porque no veo que la vuelvas a proteger en otro momento.

Introducí estas mejoras y verás que el proceso se agiliza bastante.

buenos días doña Elsa, muchas gracias por su paciencia

la desprotección tengo que realizarlo dentro del proceso porque en la hoja de base de datos el código lo protege con solo cambiar de celda

se puede guardar la fila inicial y final?? como se hace eso??

si el proceso depende de n cantidad de activo que se ponga en la factura

por ejemplo en mi caso seria asi?

formato fila: fuente, 10; letra, tahoma; ancho fila, 13
Range("B" & ini).Select -> duda cuando es fila?
    Font.Size = 10
    Font.Name = "Tahoma"
    RowHeight = 13
rango con lineas verdes de B a N
Range("B" & ini & ":N" & fini).Select
    call pintaberde
rango con lineas anaranjado de O a V
Range("O" & ini & ":V" & fini).Select
    call pintabanja
rango de rellenos M a n y de U a V
Range("M" & ini & ":N" & fini & "U" & ini & ":V" & fini).Select
    call relleno
negritas columnas B, M-N y U-V
Range("B" & ini & ":B" & fini & "M" & ini & ":N" & fini & "U" & ini & ":V" & fini).Select
    Font.Bold = True

lo de la fila inicial y final no se como

saludos cordiales

quería avisar que me robaron la cuenta de gmail no se como paso, creo que la deje abierta en un netcafe y no me di cuenta

ya lo pude solucionar perdón

saludos cordiales

ya pude solucionar lo de mi correo

Con respecto a cómo utilizar las variables ini y fini.

Por ej, luego del Do... Loop ya tenés la primer fila, entonces ahí la guardamos:

Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop

ini = activecell.Row


Después del Next i, es decir cuando termina el bucle For, tendrás la fila final.

fini = activecell.row


Y a partir de aquí recién le darás el formato a todo.

Nota: Me parece que en las 2 últimas te falta algún coma:

Range("M" & ini & ":N" & fini & ", U" & ini & ":V" & fini).Select

Sdos

Elsa

el código del formato debe ir después del next i cierto? la cosa es que puse asi el código

For i = 1 To ReCantidad
Range("B7").Select
Do While Not IsEmpty(ActiveCell)
    ActiveCell.Offset(1, 0).Select
Loop
pf = ActiveCell.Row 'PRIMERA FILA
ActiveSheet.Unprotect "entrar"
TODO EL CODIGO
Next i
uf = ActiveCell.Row 'SEGUNDA FILA
'rango con lineas verdes de B a N
Range("B" & pf & ":N" & uf).Select
Call PintaBerde

el problema que encuentro es que me pone el borde solamente en la ultima fila, no desde la primera fila...

saludos cordiales

intente antes del loop y tampoco no esta guardando la primera fila solo la ultima

creo que encontré como solucionarlo a ver que te parece?

pf = Range("B" & Rows.Count).End(xlUp).Row
For i = 1 To ReCantidad
Range("B7").Select
Do While Not IsEmpty(ActiveCell)
    ActiveCell.Offset(1, 0).Select
Loop
TODO EL CODIGO DE INGRESO DE DATOS
uf = ActiveCell.Row
'formato fila: fuente, 10; letra, tahoma; ancho fila, 13
Range("B" & pf & ":B" & uf).Select
    Call FormaFila
'negritas columnas B, M-N y U-V
Range("B" & pf & ":B" & uf & ",M" & pf & ":N" & uf & ",U" & pf & ":V" & uf).Select
    Selection.Font.Bold = True
'rango con lineas verdes de B a N
Range("B" & pf & ":N" & uf).Select
    Call PintaBerde
'rango con lineas anaranjado de O a V
Range("O" & pf & ":V" & uf).Select
    Call PintaBanja
'rango de rellenos M a n y de U a V
Range("M" & pf & ":N" & uf & ",U" & pf & ":V" & uf).Select
    Call PintaRellTotal

pero el código de FORMAFILA no me esta funcionando con esto, no esta realizando el formato de la fila

With Rows(ActiveCell.Row)
    .Font.Size = 10
    .Font.Name = "Tahoma"
    .RowHeight = 13
End With

los bordes, el relleno y la negrita si lo realiza, que se puede hacer?

saludos cordiales

Envié aclaraciones a tu correo. Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas