Saltar al contenido

Macro que no se detenga si falta información.


Recommended Posts

publicado

Buenas tardes, me gustaría saber si me pueden ayudar con la siguiente macro, todos los días recibo un archivo con los datos de unos ACTIVOS que son colocados en diferentes hojas dependiendo del activo (ACTIVO1, ACTIVO2,…ACTIVOn), es decir, hay una hoja para cada activo. Hice una macro en el archivo "DATOS DEL SIAR PARA ESTIMACION DEL C-VaR y EVT.xls" con la intención de extraer solo el rango que me interesa el cual es fijo para cada activo ("B4:B23"). La macro me funciona bien pero tengo el problema que no siempre hay información para algún activo en particular, y yo hice la macro considerándolos todos. Por ejemplo, si el día de mañana no hay información para el ACTIVO3 esa hoja no va a estar en el archivo que recibo, por lo que, me genera un error de depuración y se detiene sin completar la rutina, no me pega nada.

Mi pregunta es: existe alguna forma de decir en la macro, que si una hoja determinada no está continúe el proceso, que no se detenga y pegue el resto de las hojas que si tienen información, es decir que completa la rutina con los activos que si aparecen en el archivo y que no se detenga porque falta alguno en particular.


Windows("SALIDAS SIMULACIONES DEL VaR.xls").Activate
Sheets("ACTIVO1").Select
Range("B4:B23").Select
Selection.Copy
Windows("DATOS DEL SIAR PARA ESTIMACION DEL C-VaR y EVT.xls").Activate
Range("B2").Select
ActiveSheet.Paste
Windows("SALIDAS SIMULACIONES DEL VaR.xls").Activate
Sheets("ACTIVO2").Select
Range("B4:B23").Select
Application.CutCopyMode = False
Selection.Copy
Windows("DATOS DEL SIAR PARA ESTIMACION DEL C-VaR y EVT.xls").Activate
Range("C2").Select
ActiveSheet.Paste
Windows("SALIDAS SIMULACIONES DEL VaR.xls").Activate
Sheets("ACTIVO3").Select
Range("B4:B23").Select
Application.CutCopyMode = False
Selection.Copy
Windows("DATOS DEL SIAR PARA ESTIMACION DEL C-VaR y EVT.xls").Activate
Range("D2").Select
ActiveSheet.Paste
Windows("SALIDAS SIMULACIONES DEL VaR.xls").Activate
ActiveWindow.ScrollWorkbookTabs Sheets:=-3
Sheets("ACTIVO4").Select
Range("B4:B23").Select
Application.CutCopyMode = False
Selection.Copy
Windows("DATOS DEL SIAR PARA ESTIMACION DEL C-VaR y EVT.xls").Activate
Range("E2").Select
ActiveSheet.Paste[/CODE]

Agradeciéndoles de antemano su ayuda quedo a la espera de su siempre oportuna respuesta,

Saludos cordiales.

publicado

hola sadeliano

lo ideal es que modificaras tu macro para que se ajustara a tus requerimientos, pero si lo que deseas es controlar el error puedes hacer lo siguiente

On Error GoTo Error
'<==================== código
'<==================== código
'<==================== código
'<==================== código aqui te marca error
'<==================== código
'<==================== código
continua: ' <=========aqui le dices que continue
'<==================== código
Exit Sub
Error:
Resume continua
End Sub[/CODE]

saludos

publicado

Disculpa pero detecte una falla en lo que me recomendaste, ya que funciona bien pero si llegase a faltar otro activo en el archivo origen, esta macro solo funciona para el activo que definí con la sentencia continua:, cómo hago si en vez de un activo son dos o más, la idea es que la rutina continúe independientemente si hay o no información para un activo determinado, y si al día siguiente vuelve a salir información para ese activo tome el rango y lo pegue en el archivo destino siempre en la misma columna que he destinada para ese activo.

Me explico mejor, yo recibo un archivo un libro origen:

SALIDAS SIMULACIONES DEL VaR.xls

con varias posibles hojas ACTIVO1, ACTIVO2, ACTIVO3, ACTIVO4 ... ACTIVOn pudiendo faltar uno o varios de ellos.

En el código paso una por una por esas hojas copiando la columna B3:B24 de cada hoja para pegarla en otro libro destino

DATOS DEL SIAR PARA ESTIMACION DEL C-VaR y EVT.xls donde voy pegando de manera continúa en las celdas B2, C2, D2 y E2 que ha sido identificada con el nombre de cada activo del archivo origen si faltara una de las hojas ACTIVOx se detendría el proceso,

Si algún activo no muestra información para un día en particular esa hoja no estará en el archivo origen y la rutina se detiene, hice lo que me recomendaste y puse la sentencia en donde estaba el activo que faltaba y el corre bien pero si faltara otro activo no lo hace. Qué hace falta para que no se detenga y copie los datos independientemente si falta información para más de un activo, la idea es que si no hay salte al siguiente activo que si tiene y asi hasta completar todos los activos que muestren información.

Disculpa las molestias y espero me puedan ayudar.

Saludos cordiales

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      29

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    2    1

  • Crear macros Excel

  • Mensajes

    • Buenos días,  espero se encuentren bien de salud compañeros, Favor me podrían ayuda con lo siguientes como se podría hacer cuando tengo una tabla dinámica que  amedida que se aumente las columnas fechas con data un formula que se coloco al final busque o analice siempre la ultima fila y columna de la fecha. Coloco un ejemplo
    • @JSDJSD Excelentes, GRACIAS POR TU SOPORTE , me ayudo demasiado es exactamente lo que quería. 5 ESTRELLAS
    • 'Opción 1 Sub FiltrarSKUPorFecha(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim diccionarioSKU As Object Dim listaEliminar As Object Dim fechaActual As String, fechaSiguiente As String Dim f As Variant With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Crear diccionarios para comparar SKU y almacenar filas a eliminar Set diccionarioSKU = CreateObject("Scripting.Dictionary") Set listaEliminar = CreateObject("Scripting.Dictionary") ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then diccionarioSKU.RemoveAll ' Limpiar el diccionario antes de llenarlo ' Guardar los SKU de la fecha siguiente (solo de la siguiente) For f = fila + 1 To ultimaFila If .Cells(f, 1).Value <> fechaSiguiente Then Exit For diccionarioSKU(.Cells(f, 2).Value) = 1 Next f ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Solo eliminar si el SKU no está en la fecha siguiente If Not diccionarioSKU.exists(.Cells(f, 2).Value) Then listaEliminar(f) = 1 ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar.keys .Rows(f).Delete Next End With MsgBox "Completado correctamente.", vbInformation End Sub 'Opción 2 Sub FiltrarSKUPorFecha1(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim listaEliminar As Collection Dim fechaActual As String, fechaSiguiente As String Dim f As Variant, i As Long Dim SKUExiste As Boolean With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Inicializar la colección para marcar las filas a eliminar Set listaEliminar = New Collection ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Comprobar si el SKU está en la fecha siguiente SKUExiste = False For i = fila + 1 To ultimaFila If .Cells(i, 1).Value <> fechaSiguiente Then Exit For If .Cells(i, 2).Value = .Cells(f, 2).Value Then SKUExiste = True Exit For End If Next i ' Si el SKU no se encuentra en la fecha siguiente, marcar para eliminar If Not SKUExiste Then listaEliminar.Add f ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar .Rows(f).Delete Next f End With MsgBox "Completado correctamente.", vbInformation End Sub   TABLA ELIMINAR.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.