Copiar filas de hoja a otra según dos condiciones en excel

Deseo crear una macro que tome los datos de una tabla igual a la otra pero que copie los datos. Ejemp.

Hoja1

codigo/ codsec/ codref/ nombre/ proveedor/ existensia/ ubicación

0110     25A1       0001      CODO        0051              0                   " "


hoja2

codigo/ codsec/ codref/ nombre/ proveedor/ existensia/ ubicación

0110     25A1       0001      CODO        0051              10                   BOX-01

Tendría que cumplir con la condición de Código = Código y existencia <> '0' entonces se copiaría la fila completa directamente si no No y se continua con la siguiente.

Y así hasta llegar a la ultima fila.

Tengo varios libros por separados con los mismos artículos pero con diferente existencia y ubicación, por lo que lo voy a realizar un par de veces a la copia u son muchos los datos.

1 Respuesta

Respuesta
2

Disculpa, pero no entendí. Qué datos son los que hay que leer, ¿los de la hoja1?

¿Los datos a copiar son de la hoja1 a la hoja2?

Por qué dices que Código = Código.

En tu ejemplo el Código 110, tiene existencia 0, ¿por qué aparece en la hoja2 con existencia = 10?

Podrías explicarlo con un ejemplo completo.

Buenas Dante, son dos tablas casi idénticas solo que tienen existencias distintas y quiero unirlas, porque una tiene algunas y las otra el resto pero mezcladas.

seria copiar a la hoja1 los datos de la hoja2.

Osea tenemos esto.

Hoja1

codigo/ codsec/ codref/ nombre/ proveedor/ existensia/ ubicación

0109      154S      A0018    UNION     0014               2                EST-02    

0110     25A1       0001      CODO       0051              0                   " "

0111     AAD        0157      CAÑO        0068               1               EST-01


Hoja2

codigo/ codsec/ codref/ nombre/ proveedor/ existencia/ ubicación

0109      154S      A0018    UNION     0014               0                " "  

0110     25A1       0001      CODO        0051              10              BOX-01

0111     AAD        0157      CAÑO        0068               0                " "


Y tendría que quedar así EN LA HOJA1

codigo/ codsec/ codref/ nombre/ proveedor/ existencia/ ubicación

0109      154S      A0018    UNIÓN     0014               2                EST-02    

0110     25A1       0001      CODO       0051            10                BOX-01

0111     AAD        0157      CAÑO        0068               1               EST-01

Para que quede una sola hoja definitiva.

No se si me explico.

Pero entonces no es una copia, ¿lo qué quieres es actualizar la existencia?

Y si en al hoja1 tengo en existencias 3 y en la hoja2 tengo en existencias un 2, ¿qué hago?

En teoría no debería pasar, pero en el caso que tengan distinta ubicación se deberían sumar y si tienen la misma ubicación es por que se contó 2 veces lo  mismo y quedaría igual.

Disculpa, ahora ya no entendí, ¿qué es eso de la ubicación?

En tu ejemplo no estás copiando el registro de la hoja2 a la hoja1, de ser así, en la hoja1 tendrías 4 registros y solamente veo 3.

Podrías explicar cuáles serías todas las características que se deben cumplir, me explicas si es una actualización o una copia

Tienes razón es una actualización en realidad, pero yo decía copiar directamente la línea entera sobre la otra. No agregando al final o a continuación siempre y cuando cumpla con la condición que la celda del campo "codigo" de la hoja1 sea igual a la celda del campo "codigo" de la hoja2.

Si en la hoja2 existiera una fila con el campo "codigo" que no este en la hoja1, ahí recién podría agregarse al final.

El campo "Ubicacion" es donde esta alojado físicamente el articulo hay posibilidad de que este en una o más ubicaciones.

En ese caso nosotros en el campo "ubicación" ponemos

existencia/ ubicación

 10                5 BOX-01/5 EST-02 

Pero complicaría más, conque me copie o actualice la existencia y una ubicación me basta.

En pseudo código seria algo así medio simple

Origen = Hoja2

Destino = Hoja1

i=1

 k = 1

Desde Origen.fila[i:2] a Origen.fila.final

         Desde Destinio[k:2] a Destino.fila.final

            Es  Origen.fila[i:2] = Destino.fila[k:2] entonces

                     Destino.fila = Origen.fila

                      I=i+1

                      k=1

            Si no k=k+1

Disculpa seria así porque me falto una condición.

Origen = Hoja2

Destino = Hoja1

i=1

 k = 1

Desde Origen.fila[i:2] a Origen.fila.final

         Desde Destinio[k:2] a Destino.fila.final

            Es  Origen.fila[i:2] = Destino.fila[k:2]  y además Origen.fila[k:”Existencia”] <> “0”

               entonces

                     Destino.fila = Origen.fila

                      I=i+1

                      k=1

            Si no k=k+1

Disculpa me volví a quivocar en los contadores


Disculpa seria así porque me falto una condición.

Origen = Hoja2

Destino = Hoja1

i=2

 k =2

Desde Origen.fila[i:1"Codigo"] a Origen.fila.final

         Desde Destinio[k:1"Codigo"] a Destino.fila.final

            Es  Origen.fila[i:1"Codigo"] = Destino.fila[k:1"Codigo"]  y además Origen.fila[k:”Existencia”] <> “0”

               entonces

                     Destino.fila.completa = Origen.fila.completa 

                      I=i+1

                      k=2

            Si no k=k+1

Te anexo la macro, con lo siguiente:

1. Si el código existe y es igual a 0, actualiza existencia y ubicación

2. Si existe el código y no es igual a 0, y las ubicaciones son diferentes, entonces suma las existencias y agrega la ubicación. (5 BOX-01/5 EST-02)

3. Si el código no existe, agrega un registro al final.


Cambian en la macro, en las siguientes líneas, las columnas correspondientes

col = "A" 'código
exi = "F" 'existencia
ubi = "G" 'ubicación

Sub Actualizar()
'Por.Dante Amor
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    '
    col = "A" 'código
    exi = "F" 'existencia
    ubi = "G" 'ubicación
    '
    For i = 1 To h2.Range(col & Rows.Count).End(xlUp).Row
        If h2.Cells(i, exi) <> 0 Then
            Set b = h1.Columns(col).Find(h2.Cells(i, col), lookat:=xlWhole)
            If Not b Is Nothing Then
                'si lo encontró
                If h1.Cells(b.Row, exi) = 0 Then
                    'si la existencia de la hoja1 es 0, actualiza existencia y ubicación
                    h1.Cells(b.Row, exi) = h2.Cells(i, exi)
                    h1.Cells(b.Row, ubi) = h2.Cells(i, ubi)
                Else
                    'si es diferente de 0
                    If InStr(1, h1.Cells(b.Row, ubi), h2.Cells(i, ubi)) = 0 Then
                        'si las ubicación2 no está en la ubicación de la hoja1
                        'Suma las existencias y agrega la ubicación
                        h1.Cells(b.Row, exi) = h1.Cells(b.Row, exi) + h2.Cells(i, exi)
                        h1.Cells(b.Row, ubi) = h1.Cells(b.Row, ubi) & "/" & h2.Cells(i, ubi)
                    End If
                End If
            Else
                'no lo encuentra y lo agrega al final
                u = h1.Range(col & Rows.Count).End(xlUp).Row + 1
                h2.Rows(i).Copy h1.Rows(u)
            End If
        End If
    Next
    h1.Select
    MsgBox "Actualización terminada", vbInformation
End Sub

Sigue las Instrucciones para un botón y ejecutar la macro

  1. Abre tu libro de Excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la macro
  5. Ahora para crear un botón, puedes hacer lo siguiente:
  6. Inserta una imagen en tu libro, elige del menú Insertar / Imagen / Autoformas
  7. Elige una imagen y con el Mouse, dentro de tu hoja, presiona click y arrastra el Mouse para hacer grande la imagen.
  8. Una vez que insertaste la imagen en tu hoja, dale click derecho dentro de la imagen y selecciona: Tamaño y Propiedades. En la ventana que se abre selecciona la pestaña: Propiedades. Desmarca la opción “Imprimir Objeto”. Presiona “Cerrar”
  9. Vuelve a presionar click derecho dentro de la imagen y ahora selecciona: Asignar macro. Selecciona: pinta
  10. Aceptar
  11. Para ejecutarla dale click a la imagen.

Saludos. Dante Amor

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas