Macro que valide valores en dos libros y copie datos de uno a otro

7 envíos / 0 nuevos
Último envío
kafov
Imagen de kafov
Offline
última acción: Hace 3 años 10 meses
alta: 30/04/2020 - 16:53
Puntos: 55
Macro que valide valores en dos libros y copie datos de uno a otro

Hola Buenos dias,

Un saludo a todos los miembros de este foro. Es mi primera vez aca. No soy muy buena con las macro, hasta ahora estoy aprendiendo, pero necesito resolver esto con urgencia y por eso necesito pedir su ayuda ya que no se como hacer las validaciones pertinentes.

Esta es la situacion: Tengo dos libros de Excel.

Libro A llamado (Master), Nombre de la hoja donde esta la información (Datos)

Libro B llamado (Base), nombre de la hoja donde esta la información (DB)

Necesito que la macro se ejecute en Master.

 La ubicación de Master será el libro activo, ya que se ejecutara desde este la macro, pero la ubicación de DB si es fija, la este caso estará ubicado en el escritorio.

 Modelo Base

 

 

A

B

C

D

E

F

1

 

Fecha

From Spec

To Spec

SAM / Case

BOL Name

2

 

 

ABCDE123

FGHI 456

14.1

FGHI 456_1

3

 

 

ABCDE124

FGHI 457

15.2

FGHI 457_2

4

 

 

ABCDE125

FGHI 458

16.3

FGHI 458_3

5

 

 

ABCDE126

FGHI 459

17.4

FGHI 459_4

6

 

 

ABCDE127

FGHI 460

18.5

FGHI 460_5

7

 

 

ABCDE128

FGHI 461

19.6

FGHI 461_6

8

 

 

ABCDE129

FGHI 462

20.7

FGHI 462_7

9

 

 

ABCDE130

FGHI 463

21.8

FGHI 463_8

10

 

 

7349P6

7349K0

36.479

7349K0

11

 

 

 

 

 

 

12

 

 

 

 

 

 

13

 

 

 

 

 

 

14

 

 

 

 

 

 

15

 

 

 

 

 

 

16

 

 

 

 

 

 

17

 

 

 

 

 

 

18

 

 

 

 

 

 

19

 

 

 

 

 

 

  

 

 

 

 

 

  

Modelo Master

 

U

V

W

X

Y

Z

AA

AB

AC

AD

AE

AF

AG

AH

AI

AJ

AK

AL

AM

AN

AO

1

                     

2

 From Spec

Method A

 Method B

Cant 1

Cant 2

Cant 3

ON

Finish

Pack

Method A

 Method B

Cant 1

Cant 2

Cant 3

ON

Finish

Pack

Package Type

SAM / Case

Exist BOL

BOL Name

3

ABC123

aws

x

4

20

1

1

4.5

Bag

FGHI 450

asw

asg

10

18

2

4.5 x 9.5

5

Bag

64.694

 

 

4

ABC124

aws

x

4

20

1

2

4.75

Bag

FGHI 457

ghj

x

10

18

2

4.5 x 9.5

5

Box

64.694

 

 

5

ABC125

asd

hju

4

28

1

3

4.5

Bag

FGHI 450

tre

x

10

18

2

4.5 x 9.5

5

Box

64.057

 

 

6

ABC126

asd

x

4

28

1

4

4.5

Bag

FGHI 450

ghy

x

10

18

2

4.5 x 9.5

5

Bag

64.057

 

 

7

ABC127

awq

x

4

30

1

6

4.5

Bag

FGHI 460

rfc

x

10

18

2

4.5 x 9.5

5

Bag

63.951

 

 

8

ABC128

atrg

ade

5

21

1

5

4.75

Bag

FGHI 460

rfc

x

10

18

2

4.5 x 9.5

5

Bag

56.804

 

 

9

ABC129

sde

asd

3

24

2

4

5

Bag

FGHI 462

ert

x

10

18

2

4.5 x 9.5

5

Bag

55.509

 

 

10

ABC130

sde

x

6

18

2

4

5

Bag

FGHI 463

ert

ghy

10

18

2

4.5 x 9.5

5

Box

36.479

 

 

11

7349P6

qwe

x

6

18

2

4

5

Bag

7349K0

sde

tyg

10

18

2

4.5 x 9.5

5

Bag

36.479

 

 

12

7349T8

lok

x

8

18

2

4

5

Bag

7349K0

sde

gyt

10

18

2

4.5 x 9.5

5

Bag

31.608

 

 

13

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

                     

16

                     

 Necesito que la macro evalúe cada fila de Masterrespecto a cada fila de Base, debe validar si hay algún registro donde Las celdas from Spec "U" de mastersean igual a from Spec "C" de Basey a la vez to Spec "AD" de Mastersea igual que To Spec "D" de Base. Si esto es así, es decir si existe un registro en el libro Baseque cumpla estas condiciones, necesito que copie las celdas SAM / Case "E" y BOL Name"F" de Basey las copie en las celdas SAM / Case "AM" y  BOL Name"AO" respectivamente de Master. SI no existe un registro que cumpla las condiciones, entonces llenar la celda Exist BOL"AN" de Mastercon la palabra Nuevo. 

De antemano agradezco mucho su ayuda.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Yo lo que haría es:Leer en el

Yo lo que haría es:

Leer en el libro B

Validar con la regla que necesites

Escribir en el libro A

 

¿Dónde en concreto te estás atascando?

kafov
Imagen de kafov
Offline
última acción: Hace 3 años 10 meses
alta: 30/04/2020 - 16:53
Puntos: 55
Hola Cron gracias por tu

Hola Cron gracias por tu respuesta. En teoria entiendo que eso es lo que debo hacer. Pero como dice inicialmente, soy nueva en esto de las macros y no se escribir código. Por eso pregunté por acá. Vergüenza

Kafov

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Entonces ¿Estás pidiendo una

Entonces ¿Estás pidiendo una valoración del trabajo?

kafov
Imagen de kafov
Offline
última acción: Hace 3 años 10 meses
alta: 30/04/2020 - 16:53
Puntos: 55
Hola Cron, has sido muy

Hola Cron, has sido muy amable con tu respuesta. he investigado varias formas de lograr mi objetivo. Inicialmente lo solucione sin macro, usando la función BuscarV. Lo que me dio el resultado esperado. Sin embargo, no me gusta que la formula este en la celda, ya que puede ser borrada por error y tampoco me gusta que el abrir el libro me pida actualizar los vínculos externos. Ya se como ejecutar la misma idea de BuscarV pero desde una macro.

Esta fue mi formula inicial.

=IF(F3="","",IFERROR(VLOOKUP(A3,'C:\Users\karero\Desktop\Tool\[DB BOLs.xlsm]Base Size'!$A:$M,8,FALSE),""))

Esta buscar los valores en la Columna A del libro en uso contra los valores de la Columna A del libro "DB BOLs", si encuentra el valor me entrega el valor correspondiente de la Columna H (8) y lo copia en la celda correspondiente de la Columna B del libro en uso, si no encuentra el valor (error) simplemente deja la celda en blanco.

Ya sé cómo hacer el código para la macro. Pero para el caso que los valores estén en el mismo libro, no sé cómo nombrar o llamar una ubicación diferente para que me funcione.

 

Sub busquedaMinutos()

    Dim cont As Long

    Dim ultLinea As Long

    Dim minutos As Variant

    Dim codigo As Variant

    Dim rango As Variant

   

    ultLinea = Sheets("SKU").Range("E" & Rows.Count).End(xlUp).Row

    Set rango = Sheets("BD").Range("B2:H1000")

   

    For cont = 3 To ultLinea

        codigo = Sheets("SKU").Cells(cont, 3)

        minutos = Application.VLookup(codigo, rango, 8, False)

       

        If IsError(minutos) Then

            minutos = “”

        End If

       

         Sheets("SKU").Cells(cont, 2) = minutos

 

    Next cont   

End Sub

 

Tambien queria preguntarte si para definir la variable rango, no quiero usar un rango fijo, ya que deberia escoger practicamente toda la hoja ("B2:H1000"), sino que quiero que tambien busque la ultima fila y escoja asi el rango (Variable dependiendo de la ultima fila donde haya valores en la columna B).

Agradezco de antemano tu ayuda. 

Kafov

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Si la variable rango va a ser

Si la variable rango va a ser siempre un rango, yo la declararía así:

Dim rango as range

Un rango, como sabes, es un conjunto de celdas (puede ser un objeto range o cells). Depende de un objeto Sheet o worksheet. Y este depende de un objeto workbook.

Para hacer referencia a otro libro, tienes que definirlo como workbook.

Normalmente lo que hago es abrir el archivo desde la macro, y al abrirlo lo asigno a una variable. De esa forma es fácil hacer referencia a las hojas del libro. Algo así como:

Dim wb as workbook

Dim rng as range

set wb = workbooks.open(ruta & archivo)

set rng = wb.sheets("Hoja 1").range(cells(1,1),cells(10,8))

 

Con esto estoy asignando a rng las celdas A1:H10 de la Hoja 1 del archivo que hemos abierto, que está en la ruta 'ruta' y que se llama 'archivo'

 

En cuanto a lo de seleccionar el rango hasta la última fila, lo haces bien con la variable ultLinea. Puedes hacer lo mismo con la hoja BD.

 

Un saludo

kafov
Imagen de kafov
Offline
última acción: Hace 3 años 10 meses
alta: 30/04/2020 - 16:53
Puntos: 55
Hola Cron,No habia podido

Hola Cron,

No habia podido retomar este tema, agradezco tu ayuda.

Ya tengo mi codigo y funciona. Solo que me parece que tarda mucho tiempo procesando. Tienes alguna sugerencia para hacerlo mas ligero? Abr algo que este haciendo mal y por eso se demore tanto al ejecutar?

 

Asi quedo mi codigo:

 

Sub busquedaSams()

 

    Dim cont As Long

    Dim ultLinea As Long

    Dim Sam As Variant

    Dim Bname As Variant

    Dim concat As Variant

    Dim bol As Workbook

    Dim master As Workbook

    Dim rangobol As Variant

   

    Set master = Application.ActiveWorkbook

    Set bol = Workbooks.Open("C:\Users\kaforero\Desktop\Tool\DB BOLs")

  

    ultLinea = master.Sheets("SKU Detail").Range("A" & Rows.Count).End(xlUp).Row

   

    Set rangobol = bol.Sheets("DB").Range("A1:H3000")

  

   For cont = 3 To ultLinea

        concat = master.Sheets("SKU Detail").Cells(cont, 1)

        Sam = Application.VLookup(concat, rangobol, 8, False)

        Bname = Application.VLookup(concat, rangobol, 7, False)

      

        If IsError(Sam) Then

            Sam = ""

            Bname = ""

        End If

            master.Sheets("SKU Detail").Cells(cont, 4) = Sam

            master.Sheets("SKU Detail").Cells(cont, 3) = Bname

 

    Next cont

 

Workbooks("DB BOLs.xlsm").Close SaveChanges:=False

 

   

End Sub

 

Lo unico que no logre hacer fue poner el rango vaiable para bol


Kafov