Extraer datos de dos libros y datos no continuos
En un anterior post modificaste mi archivo, pero quedo pendiente otras columnas de las cuales una es la columna color proviene del MOLIENDA DE CEMENTO Y DESPACHOS FÍSICOS hoja PERDIDA Y FINURA CEMENTO 2021 pero este dato es discontinuo ya que los datos anteriores era hasta la columna G y este dato de color esta en la columna J, además debo extraer datos SO3 y Cl también no continuos de otro libro que se llama MOLIENDA DE CEMENTO Y DESPACHO hoja CEMENTO.
Además sera posible enlazar la hoja MIX PUZOLANICO del primer libro o debo hacer otra macro aparte.
Te adjunto imágenes y los archivos.
Molienda de cemento y despachos físicos
https://drive.google.com/file/d/1gH4CLfot7dMVgrUlV7aUNcLiTRCKlzYW/view?usp=sharing
MOLIENDA DE CEMENTO Y DESPACHO
https://drive.google.com/file/d/1U__Z81ANbN4zBQIEFoqu4Heg9L9uPGxt/view?usp=sharing
CONSULTAS CALIDAD
https://drive.google.com/file/d/15ZVjjL8SYgxP42Sb-rY4o2pvCtfLOF6z/view?usp=sharing
En espera de sus valiosos conocimientos.
Listo.
Prueba con los 3 archivos abiertos.
Sub CEMENTO() 'Por Dante Amor ' Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet Dim wb2 As Workbook, wb3 As Workbook Dim i As Long, fila As Long Dim col As String, llave As String Dim m As Variant, a As Variant Dim dic As Object ' Application.ScreenUpdating = False Application.DisplayAlerts = False ' Set sh1 = ThisWorkbook.Sheets("CEMENTO") sh1.Range("C5:J22, L5:S22, U5:AB22").ClearContents ' 'Set wb = Workbooks.Open("\\10.7.10.1\calidad\SEGUIMIENTO HORA-HORA\MOLIENDA DE CEMENTO Y DESPACHOS FISICOS.xlsx", ReadOnly:=True) Set wb2 = Workbooks("MOLIENDA DE CEMENTO Y DESPACHOS FISICOS") Set sh2 = wb2.Sheets("PERDIDA Y FINURA CEMENTO 2021") Set wb3 = Workbooks("MOLIENDA DE CEMENTO Y DESPACHO") Set sh3 = wb3.Sheets("CEMENTO") Set dic = CreateObject("Scripting.Dictionary") ' 'Carga en una matriz y en un índice los Datos del libro 3 a = sh3.Range("A2", sh3.Range("Q" & sh3.Range("A" & Rows.Count).End(3).Row)).Value2 For i = 1 To UBound(a, 1) If Not IsError(a(i, 1)) Then dic(a(i, 1) & "|" & Val(a(i, 2)) & "|" & Right(a(i, 3), 1)) = a(i, 13) & "|" & a(i, 16) End If Next 'Datos del libro2 For i = 7 To sh2.Range("A" & Rows.Count).End(3).Row If Not IsError(sh2.Range("A" & i)) Then If sh2.Range("A" & i).Value = sh1.Range("C2").Value Then col = IIf(Left(sh2.Range("C" & i).Value, 1) = "M", Choose(Val(Right(sh2.Range("C" & i).Value, 1)), "", "", "C", "L", "U"), "") If col <> "" Then fila = 5 Do While sh1.Cells(fila, col).Value <> "" fila = fila + 1 Loop m = sh2.Cells(i, "B").Value * 1 sh1.Cells(fila, col) = IIf(m < 12 Or m = 24, m Mod 24 & ":00 AM", m Mod 12 & ":00 PM") sh1.Cells(fila, Columns(col).Column + 1).Resize(1, 4).Value = sh2.Range("D" & i).Resize(1, 4).Value sh1.Cells(fila, Columns(col).Column + 5).Value = sh2.Range("J" & i).Value ' llave = sh1.Range("C2").Value & "|" & m & "|" & Right(sh2.Range("C" & i).Value, 1) If dic.exists(llave) Then sh1.Cells(fila, Columns(col).Column + 6).Resize(1, 2).Value = Split(dic(llave), "|") End If End If End If End If Next ' Application.ScreenUpdating = True Application.DisplayAlerts = True ' If sh1.Range("C5, L5, U5") = "" Then MsgBox "No hay datos reportados para este día" End If End Sub
Muy buenos días, Dante
Gracias por ayudarme a que mi informe sea más eficiente.
Te comento inicie la macro enviada con los dos libros abiertos y me genera el sigueimte error.
Saludos,
Entonces cambia esta línea:
col = IIf(Left(sh2.Range("C" & i).Value, 1) = "M", Choose(Val(Right(sh2.Range("C" & i).Value, 1)), "", "", "C", "L", "U"), "")
Por estas:
Select Case sh2.Range("C" & i).Value Case "M3": col = "C" Case "M4": col = "L" Case "M5": col = "U" Case Else: col = "" End Select
Como comenté, solamente para las pruebas abre los 3 libros.
Después de que hagas las pruebas. Ya puedes cambiar las instrucciones para abrir y cerrar los libros.
Va la macro para abrir y cerrar. Recuerda valorar la respuesta.
Sub CEMENTO() 'Por Dante Amor ' Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet Dim wb2 As Workbook, wb3 As Workbook Dim i As Long, fila As Long Dim col As String, llave As String Dim m As Variant, a As Variant Dim dic As Object ' Application.ScreenUpdating = False Application.DisplayAlerts = False ' Set sh1 = ThisWorkbook.Sheets("CEMENTO") sh1.Range("C5:J22, L5:S22, U5:AB22").ClearContents ' 'Set wb2 = Workbooks.Open("\\10.7.10.1\calidad\SEGUIMIENTO HORA-HORA\MOLIENDA DE CEMENTO Y DESPACHOS FISICOS.xlsx", ReadOnly:=True) Set wb2 = Workbooks("MOLIENDA DE CEMENTO Y DESPACHOS FISICOS") Set sh2 = wb2.Sheets("PERDIDA Y FINURA CEMENTO 2021") 'Set wb3 = Workbooks.Open("\\10.7.10.1\calidad\SEGUIMIENTO HORA-HORA\MOLIENDA DE CEMENTO Y DESPACHO.xlsx", ReadOnly:=True) Set wb3 = Workbooks("MOLIENDA DE CEMENTO Y DESPACHO") Set sh3 = wb3.Sheets("CEMENTO") Set dic = CreateObject("Scripting.Dictionary") ' 'Carga en una matriz y en un índice los Datos del libro 3 a = sh3.Range("A2", sh3.Range("Q" & sh3.Range("A" & Rows.Count).End(3).Row)).Value2 For i = 1 To UBound(a, 1) If Not IsError(a(i, 1)) Then dic(a(i, 1) & "|" & Val(a(i, 2)) & "|" & Right(a(i, 3), 1)) = a(i, 13) & "|" & a(i, 16) End If Next 'Datos del libro2 For i = 7 To sh2.Range("A" & Rows.Count).End(3).Row If Not IsError(sh2.Range("A" & i)) Then If sh2.Range("A" & i).Value = sh1.Range("C2").Value Then 'col = IIf(Left(sh2.Range("C" & i).Value, 1) = "M", WorksheetFunction.Choose(Val(Right(sh2.Range("C" & i).Value, 1)), "", "", "C", "L", "U"), "") Select Case sh2.Range("C" & i).Value Case "M3": col = "C" Case "M4": col = "L" Case "M5": col = "U" Case Else: col = "" End Select If col <> "" Then fila = 5 Do While sh1.Cells(fila, col).Value <> "" fila = fila + 1 Loop m = sh2.Cells(i, "B").Value * 1 sh1.Cells(fila, col) = IIf(m < 12 Or m = 24, m Mod 24 & ":00 AM", m Mod 12 & ":00 PM") sh1.Cells(fila, Columns(col).Column + 1).Resize(1, 4).Value = sh2.Range("D" & i).Resize(1, 4).Value sh1.Cells(fila, Columns(col).Column + 5).Value = sh2.Range("J" & i).Value ' llave = sh1.Range("C2").Value & "|" & m & "|" & Right(sh2.Range("C" & i).Value, 1) If dic.exists(llave) Then sh1.Cells(fila, Columns(col).Column + 6).Resize(1, 2).Value = Split(dic(llave), "|") End If End If End If End If Next ' wb2.Close False wb3.Close False Application.ScreenUpdating = True Application.DisplayAlerts = True ' If sh1.Range("C5, L5, U5") = "" Then MsgBox "No hay datos reportados para este día" End If End Sub
Cambia esta línea:
sh1.Cells(fila, Columns(col).Column + 6).Resize(1, 2).Value = Split(dic(llave), "|")
Por estas:
sh1.Cells(fila, Columns(col).Column + 6).Value = Val(Split(dic(llave), "|")(0)) sh1.Cells(fila, Columns(col).Column + 7).Value = Val(Split(dic(llave), "|")(1))
¿Probaste con los archivos que me compartiste?
De acuerdo a los archivos que compartiste, explícame SOLAMENTE uno de los problemas, para ir avanzando.
La columna de SO3 y J del libro consulta hija Cemento ahí es donde tengo el problema se pegan como texto. Al cambie la línea línea me copia otros valores
Yo tengo este ejemplo para el 17/01/2021, en la hoja Cemento de Molienda:
En la hoja Cemento de Consultas, después de la macro:
Eso es lo que yo supuse que debería poner. Y digo "supuse" porque no explicaste un ejemplo.
Si pudieras explicar un ejemplo de lo que debe poner.
Que pena no haberme dado a entender. La macro corre bien solo que hay datos que se pegan como texto por ende no me toma la fórmula de promedio.
Adjunto imagen
Mmm, funciona bien para mí. El problema, supongo, es que tú utilizas la coma (, ) como separador de millares. Reviso para ver cómo lo resuelvo.
Los otros datos pasan directo de la hoja a la hoja.
Pero estos datos los almaceno como un item de un índice. Pero al hacerlo, se almacenan como texto:
dic(a(i, 1) & "|" & Val(a(i, 2)) & "|" & Right(a(i, 3), 1)) = a(i, 13) & "|" & a(i, 16)
No lo he probado, porque tengo que cambiar mi configuración regional y de excel a ( ; )
Prueba con esto:
sh1.Cells(fila, Columns(col).Column + 6).Value = Val(Split(dic(llave), "|")(0)) * 1 sh1.Cells(fila, Columns(col).Column + 7).Value = Val(Split(dic(llave), "|")(1)) * 1
No me dado a entender, soy mejor explicando integrales y ecuaciones diferenciales je je.
Me pase a otro computador de la compañía y con la primera lines original me da el error de texto y con las nuevas líneas me queda como numero pero valores no correspondientes a los solicitado.
Cuando intento cambiar el formato con la primera opción no me cambia a ningún formato, solo si escibo el dato si lo hace.
Ya te entendí. A mí me funciona correctamente la macro.
Dicho sea de paso me gustaría que pusieras un ejemplo de lo que debe poner. Solamente pones un pedazo de hoja. Yo te mostré un ejemplo completo y no son mis datos, ni mi proyecto.
Yo tengo este ejemplo para el 17/01/2021, en la hoja Cemento de Molienda:
En la hoja Cemento de Consultas, después de la macro:
Buenas noches, Dante
Acabo de llegar a mi casa y he probado la macro y me presenta el mismo problema de texto.
Te adjunto las imágenes.
Ejemplo para el 17/01/2021, en la hoja Cemento de Molienda:
En la hoja Cemento de Consultas, después de la macro:
Si te das cuenta todo corre perfecto pero las columnas en mención tiene el problema de texto
Listo, prueba la siguiente:
Sub CEMENTO() 'Por Dante Amor ' Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet Dim wb2 As Workbook, wb3 As Workbook Dim i As Long, fila As Long Dim col As String, llave As String Dim m As Variant, a As Variant Dim dic As Object Dim pri As Double, seg As Double ' Application.ScreenUpdating = False Application.DisplayAlerts = False ' Set sh1 = ThisWorkbook.Sheets("CEMENTO") sh1.Range("C5:J22, L5:S22, U5:AB22").ClearContents ' Set wb2 = Workbooks.Open("\\10.7.10.1\calidad\SEGUIMIENTO HORA-HORA\MOLIENDA DE CEMENTO Y DESPACHOS FISICOS.xlsx", ReadOnly:=True) 'Set wb2 = Workbooks("MOLIENDA DE CEMENTO Y DESPACHOS FISICOS") Set sh2 = wb2.Sheets("PERDIDA Y FINURA CEMENTO 2021") Set wb3 = Workbooks.Open("\\10.7.10.1\calidad\SEGUIMIENTO HORA-HORA\MOLIENDA DE CEMENTO Y DESPACHO.xlsx", ReadOnly:=True) 'Set wb3 = Workbooks("MOLIENDA DE CEMENTO Y DESPACHO") Set sh3 = wb3.Sheets("CEMENTO") Set dic = CreateObject("Scripting.Dictionary") ' 'Carga en una matriz y en un índice los Datos del libro 3 a = sh3.Range("A2", sh3.Range("Q" & sh3.Range("A" & Rows.Count).End(3).Row)).Value2 For i = 1 To UBound(a, 1) If Not IsError(a(i, 1)) Then dic(a(i, 1) & "|" & Val(a(i, 2)) & "|" & Right(a(i, 3), 1)) = a(i, 13) & "|" & a(i, 16) End If Next 'Datos del libro2 For i = 7 To sh2.Range("A" & Rows.Count).End(3).Row If Not IsError(sh2.Range("A" & i)) Then If sh2.Range("A" & i).Value = sh1.Range("C2").Value Then 'col = IIf(Left(sh2.Range("C" & i).Value, 1) = "M", WorksheetFunction.Choose(Val(Right(sh2.Range("C" & i).Value, 1)), "", "", "C", "L", "U"), "") Select Case sh2.Range("C" & i).Value Case "M3": col = "C" Case "M4": col = "L" Case "M5": col = "U" Case Else: col = "" End Select If col <> "" Then fila = 5 Do While sh1.Cells(fila, col).Value <> "" fila = fila + 1 Loop m = sh2.Cells(i, "B").Value * 1 sh1.Cells(fila, col) = IIf(m < 12 Or m = 24, m Mod 24 & ":00 AM", m Mod 12 & ":00 PM") sh1.Cells(fila, Columns(col).Column + 1).Resize(1, 4).Value = sh2.Range("D" & i).Resize(1, 4).Value sh1.Cells(fila, Columns(col).Column + 5).Value = sh2.Range("J" & i).Value ' llave = sh1.Range("C2").Value & "|" & m & "|" & Right(sh2.Range("C" & i).Value, 1) If dic.exists(llave) Then pri = Split(dic(llave), "|")(0) seg = Split(dic(llave), "|")(1) sh1.Cells(fila, Columns(col).Column + 6).Value = pri sh1.Cells(fila, Columns(col).Column + 7).Value = seg End If End If End If End If Next ' wb2.Close False wb3.Close False Application.ScreenUpdating = True Application.DisplayAlerts = True ' If sh1.Range("C5, L5, U5") = "" Then MsgBox "No hay datos reportados para este día" End If End Sub
Buenas noches, Dante.
Perfecto, eso va más allá de mis pequeños conocimientos en vía.
Inquietud cuando colocas End(3).Row que significa.
Muchas gracias por tu apoyo.
Bue dia, Dante
Todo quedo ok. imagínate que se me quedo por fuera una hoja de cemento que se llama Mix Puzolanico y los datos deben ir en el cuadro de Z4 que es donde solo se produce este cemento. Opte por copiar una de las macros y llamarla para que se ejecute.
Se podria ingresar en la misma macro de cemento?
- Compartir respuesta