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.
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?
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á.
Kafov
Entonces ¿Estás pidiendo una valoración del trabajo?
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
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
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