Macro para extraer datos de otros libros según la fecha asignada
Tema.
Tengo una macro que me extrae los datos de otro libro pero tengo problemas que ver celdas vacías en la columnas de la fecha me salta un error y no sigue haciendo la actualización, además no he podido enlazar otros datos del otro libro. Si es posible mejorar lo que he hecho seria genial para que haga el trabajo más rápido.
En espera de sus comentarios.
1 Respuesta
Pon aquí tu macro. Utiliza el icono para insertar código.

También pon una imagen y con esa imagen te apoyas para explicar lo que necesitas.

Lo que debe tener una imagen:
Sub CEMENTO()
Set jh = Sheets("CEMENTO")
jh.Activate
Range(jh.Cells(5, "C"), jh.Cells(22, "I")).Select
Selection.ClearContents
Range(jh.Cells(5, "K"), jh.Cells(22, "Q")).Select
Selection.ClearContents
Range(jh.Cells(5, "S"), jh.Cells(22, "Y")).Select
Selection.ClearContents
Workbooks.Open Filename:="\\10.7.10.1\calidad\SEGUIMIENTO HORA-HORA\MOLIENDA DE CEMENTO Y DESPACHOS FISICOS.xlsx", ReadOnly:=True
Set jhc = Sheets("PERDIDA Y FINURA CEMENTO 2021")
jhc.Activate
jhc.Cells(7, "A").Select
jhc.Cells(7, "A").End(xlDown).Select
Fila = ActiveCell.Row
Target = 0
Filam1 = 5
Filam2 = 5
Filam3 = 5
Do While Target = 0
If jhc.Cells(Fila, "A") = jh.Cells(2, "C") Then
If jhc.Cells(Fila, "C") = "M3" Then
jh.Activate
jh.Cells(Filam1, "C") = jhc.Cells(Fila, "B") * 1
If jh.Cells(Filam1, "C") <= 12 Then
jh.Cells(Filam1, "C") = jh.Cells(Filam1, "C") & " AM"
Else
If jh.Cells(Filam1, "C") - 12 = 0 Then
jh.Cells(Filam1, "C") = "0:00 AM"
Else
jh.Cells(Filam1, "C") = (jh.Cells(Filam1, "C") - 12) & " PM"
End If
End If
For i = 4 To 9
jh.Cells(Filam1, i) = jhc.Cells(Fila, i - 1)
Next i
Filam1 = Filam1 + 1
Else
If jhc.Cells(Fila, "C") = "M4" Then
jh.Activate
jh.Cells(Filam2, "K") = jhc.Cells(Fila, "B") * 1
If jh.Cells(Filam2, "K") <= 12 Then
jh.Cells(Filam2, "K") = jh.Cells(Filam2, "K") & " AM"
Else
If jh.Cells(Filam2, "K") - 12 = 0 Then
jh.Cells(Filam2, "K") = "0:00 AM"
Else
jh.Cells(Filam2, "K") = (jh.Cells(Filam2, "K") - 12) & " PM"
End If
End If
For i = 12 To 17
jh.Cells(Filam2, i) = jhc.Cells(Fila, i - 9)
Next i
Filam2 = Filam2 + 1
Else
If jhc.Cells(Fila, "C") = "M5" Then
jh.Activate
jh.Cells(Filam3, "S") = jhc.Cells(Fila, "B") * 1
If jh.Cells(Filam3, "S") <= 12 Then
jh.Cells(Filam3, "S") = jh.Cells(Filam3, "S") & " AM"
Else
If jh.Cells(Filam3, "S") - 12 = 12 Then
jh.Cells(Filam3, "S") = 0 & " AM"
Else
jh.Cells(Filam3, "S") = (jh.Cells(Filam3, "S") - 12) & " PM"
End If
End If
For i = 15 To 20
jh.Cells(Filam3, i) = jhc.Cells(Fila, i - 17)
Next i
Filam3 = Filam3 + 1
End If
End If
End If
End If
jhc.Activate
If Fila < 3 Then
Target = 1
End If
Fila = Fila - 1
Loop
If jh.Cells(5, "C") = Empty And jh.Cells(5, "K") = Empty And jh.Cells(5, "S") = Empty Then
MsgBox ("No hay datos reportados para este día")
End If
jhc.Activate
ActiveWindow.Close savechanges:=False
jh.Activate
jh.Range("C5:I22").Select
ActiveWorkbook.Worksheets("CEMENTO").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("CEMENTO").Sort.SortFields.Add2 Key:=Range("C5"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("CEMENTO").Sort
.SetRange Range("C5:I22")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
jh.Range("K5:Q22").Select
ActiveWorkbook.Worksheets("CEMENTO").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("CEMENTO").Sort.SortFields.Add2 Key:=Range("K5"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("CEMENTO").Sort
.SetRange Range("K5:Q22")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
jh.Range("S5:Y22").Select
ActiveWorkbook.Worksheets("CEMENTO").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("CEMENTO").Sort.SortFields.Add2 Key:=Range("S5"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("CEMENTO").Sort
.SetRange Range("S5:Y22")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
De acuerdo.
En la columnas de la fecha me salta un error
¿En cuál línea de la marco tienes el error?
Y ayúdame con un ejemplo. No tengo idea de tus datos, no tengo idea de cómo están, no tengo idea de valores van en cada celda.
Ayudaría mucho si eres más específico. Pon una imagen con ejemplos, utiliza datos genéricos, y explicas cuál es el problema.
El problema que tengo es cuando especifico una fecha por, y si en la columna fecha encuentra un vacío me lanza error.
Ahora me sale este error.
Como hago para enviarte los archivos.

Ok gracias.
Estos son los enlaces de googledrive:
https://drive.google.com/file/d/1WcpYWtsO64nvdGkAT-Z511CrUJuSCOLC/view?usp=sharing
https://drive.google.com/file/d/1iEKZBrpogzPefHCxuuJjO6UHzAPumd3V/view?usp=sharing
https://drive.google.com/file/d/1s7UzLvnlTlewiy-2hOdVPAG9kD2gXkVC/view?usp=sharing
Lo otro que me hace falta en copiar el datos del archivo químicos la columna SO3 y CL.
De acuerdo, reviso tus archivos, analizo la macro para ver qué hace y te ayudo a simplificarla, claro, además de resolver el problema; y también veo si puedo copiar los datos del archivo "químicos".
Que pena envío nuevamente los enlaces
https://drive.google.com/file/d/1WcpYWtsO64nvdGkAT-Z511CrUJuSCOLC/view?usp=sharing
https://drive.google.com/file/d/1s7UzLvnlTlewiy-2hOdVPAG9kD2gXkVC/view?usp=sharing
https://drive.google.com/file/d/1iEKZBrpogzPefHCxuuJjO6UHzAPumd3V/view?usp=sharing
Ya encontré el problema.
En esta línea tienes de 15 a 20
Tu contador i empieza en 15, pero le restas 17, entonces te queda la columna -2 y esa no existe por eso te envía error.
For i = 15 To 20 jh.Cells(filam3, i) = jhc.Cells(fila, i - 17)
Y debe ser de 20 a 25 (De la columna "T" a "Y")
For i = 20 To 25
Prueba nuevamente.
Que mejoras se le pueden hacer
Cambia todo tu código por lo siguiente:
Sub CEMENTO()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim wb As Workbook
Dim i As Long, fila As Long
Dim col As String, m As Variant
'
Application.ScreenUpdating = False
Set sh1 = Sheets("CEMENTO")
sh1.Range("C5:I22, K5:Q22, S5:y22").ClearContents
'
Set wb = Workbooks.Open("\\10.7.10.1\calidad\SEGUIMIENTO HORA-HORA\MOLIENDA DE CEMENTO Y DESPACHOS FISICOS.xlsx", ReadOnly:=True)
Set sh2 = Sheets("PERDIDA Y FINURA CEMENTO 2021")
'
For i = 7 To sh2.Range("A" & Rows.Count).End(3).Row
If sh2.Range("A" & i).Value = sh1.Range("C2").Value Then
Select Case sh2.Range("C" & i).Value
Case "M3": col = "C"
Case "M4": col = "K"
Case "M5": col = "S"
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, 6).Value = sh2.Range("C" & i).Resize(1, 6).Value
End If
End If
Next
wb.Close False
Application.ScreenUpdating = True
If sh1.Range("C5, K5, S5") = "" Then
MsgBox "No hay datos reportados para este día"
End If
End Sub
- Compartir respuesta