Necesito una macro (VBA) que duplique filas de acuerdo a criterios de columna.

Tengo actualmente un listado en excel con varias filas y columnas, Este listado yo lo exporto a TXT con una macro hasta no hay problema; Pero antes de exportarlo a TXT tengo que hacer unas revisiones y realizar divisiones manuales esto requiere duplicar datos de algunas filas.

En conclusión lo que se requiere es que revise todas las filas que contenga el archivo o recorra y si la final cumple con la siguiente condición me inserte un duplicado de esa fila; Aparte debe realizar una una resta de valores y quitar datos en ciertas columnas; Entonces adjunto la siguiente foto donde se evidencia una listado con 10 líneas.

Entonces son los criterios de validación;

Primer criterio; Si De la columna E que tiene las siglas IGE hasta columna G que tiene siglas VAC hay una POR en la casilla.

Segundo Criterio; Si los DÍAS RIESGOS de la columna M son distintos son distintos de la columna L DÍAS SALUD.

Si se cumplen esa dos condiciones duplicar la línea y aparte sacar la diferencia de Días y IBC y dejar solo una de las dos líneas con la POR marcada, Si revisamos el ejemplo adjunto hay tres personas que cumplen con la condiciones a anunciadas anteriormente; que son; RESTREPO, CONCHA Y GARCES, a Esas tres líneas se le debe generar un duplicado.

El Archivo Final Quedaría de la siguiente forma con los duplicados.

Si se fijan se duplicaron solo las personas que tenían las condiciones y se deja solo en una línea marcada la POR, Aparte se dejo los días de riesgos iguales para todos la columnas y igual se hizo con los IBC se restaron, Por ejemplo restrepo 10 días en la primera fila y en la segunda 20 la resta de colmuna de salud con la de riesgo, Igual se Hace con las columna O, P y Q.

Necesito saber si se puede realizar este proceso automático.

1 respuesta

Respuesta
2

[Hola

De poder, claro que se puede, y aunque suene medio complicado/enredado, la verdad no es algo difícil y probablemente tome 10 o 15 minutos en hacerlo, tiempo que algunos nos podemos tomar (recordar que la ayuda brindada aquí es ad honorem) pero, justamente para ayudar a ayudarte lo ideal es que al menos envíes un archivo con los datos para hacer pruebas (como los de tu imagen por ejemplo) y así se evita que el que desea/pueda ayudarte tenga que estar reproduciendo los datos que toma un tiempo extra.

Colócalo en algún "Drive" (Google Drive, OneDrive, DropBox...) y comparte por aquí el enlace.

A la espera

Abraham Valencia

Buenas noches Ingeniero, Gracias por responder, Adjunto enlace con el archivo don pestañas. Quedo atento a sus comentarios, Gracias.

https://drive.google.com/file/d/1vFsqrEENchtMaT4cOS9vlUSD7i0zP1vr/view?usp=sharing 

Tus restas, no se entiende, tu explicación dice una cosa y tus resultados otras. Dilo con letra de columnas, no menciones los encabezados.

Mira, por ejemplo, en Concha, tu primera fila de K a N todos son 24 pero en la segunda todos son 6. Igual de O a R, no se ve un sentido lógico y/o restas realmente en las filas.

Abraham Valencia

[Hola

Mira, prueba con esto. No olvides que está adecuado al archivo que has enviado, de ser otras las columnas en tu archivo original, debes adaptarlo:

Sub Cambios()
Dim UltimaFila&, x As Long
Dim vDiferencia(1 To 4) As Double
Let UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For x = UltimaFila To 2 Step -1
    If Range("E" & x) = "X" Or Range("F" & x) = "X" Or Range("G" & x) = "X" Then
        If Range("M" & x) <> Range("L" & x) Then
            Let vDiferencia(1) = Range("L" & x).Value - Range("M" & x).Value
            Let vDiferencia(2) = Range("M" & x).Value
            Let vDiferencia(3) = Range("P" & x).Value - Range("Q" & x).Value
            Let vDiferencia(4) = Range("Q" & x).Value
            Range("A" & x & ":R" & x).Copy
            Range("A" & x + 1).Insert Shift:=xlDown
            Range("E" & x & ":G" & x).ClearContents
            Range("K" & x + 1 & ":N" & x + 1).Value = vDiferencia(1)
            Range("K" & x & ":N" & x).Value = vDiferencia(2)
            Range("O" & x + 1 & ":R" & x + 1).Value = vDiferencia(3)
            Range("O" & x & ":R" & x).Value = vDiferencia(4)
        End If
    End If
Next x
Application.ScreenUpdating = True
End Sub

Abraham Valencia

¡Gracias!  Muchas Gracias

Buenas noches Ingeniero Abraham Valencia;
La Macro ya adapté al formato completo, Así Quedo;

Le agregue una resta individual para columna AX ya que en ocasiones el campo no es igual a la columna AU y AV y la diferencia de resta puede dar un distinto valor.

1-Por favor ayúdame con la siguiente consulta como hago para que los campos que vengas en ceros donde realizan las restas queden en cero mejor dicho; Si el campo esta en cero no debe hacer resta solo dejaría el cero al ambas filas; Tengo este inconveniente con la columna (AO) y con la columna (AY) Pueden variar en cualquier momento y no se puede copiar el mismo valor de las otras columnas.

2-Como Hago para que me re-calcule valores en las FILAS ya que al dividir los valores en las final las cotizaciones cambian, De acuerdo al ejemplo adjunto serian Operaciones entre los IBC y TARIFAS (AU * AZ) y el resultado de esta operación iría en la columna (BA) y replicarlos a la BD) así también (AV * BH) y resultado iría en la columna=(BI) ASÍ sucesivamente los otros campos con esto yo realizaría las otras operaciones(Te pregunto se puede que el resultado de las operación la redondea al 100 más cercano)

Adjunto Link del archivo principal con la macro;

https://drive.google.com/drive/folders/1gKBuCAQLMDtuyaJ_4kTOJOj_s040sadr?usp=sharing

[Hola nuevamente

No he visto su archivo pero me da la impresión que estás pidiendo varias cosas que tomarían un tiempo que va más allá de una ayuda.

Yo sugeriría varias cosas:

- Trata de, sobre todo, de entender qué es lo que hace cada línea de la macro enviada.

- Sobre tu punto 1, basta un If-Then en donde si la celda que se evalúa es distinta a cero, pues hace la operación requerida, sino, nada.

- Sobre tu punto 2, es cuestión de usar lógica y ven en qué momento hacer las operaciones, no es que haya "una forma" de hacerlo. Sobre el número redondeado a la centena más cercana, lee sobre Round.

Abraham Valencia

¡Gracias! Buenas noches, Gracias por responder,

Por favor ayúdame con el primer punto si tu revisaras el archivo adjunto te darás cuenta que pregunta del primer punto ya intente con las variables que me dijiste realizar esa prueba la realice pero me dan valores negativos abajo por eso recurro a tu asesoría,

El segundo punto solo requiero si puedes que me des la guía o explicación de la primera operación en que punto iría de hay en adelante yo me encargo de realizar todo, Quedo atento a sus comentarios. 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas