Saltar al contenido

Ordenar automáticamente Rango o Tabla al calcular fórmula.


tonibcn

Recommended Posts

publicado

Buenas tardes,

Primero de todo desear que, este desastre que estamos viviendo a nivel mundial, este os haya afectado lo menos posible, pediros precaución y responsabilidad.

Hasta hoy, no he necesitado de vuestra ayuda para mis peleas con Excel, por lo que, desde este preciso instante, os doy las gracias de forma anticipada por vuestra comprensión y ayuda al respecto de mis inquietudes. Os explico el problema, os pido disculpas por la extensión del tema, pero considero que cuanta más información mejor para que me podáis echar un cable:

Tengo un dashboard, no estándar, pero sí "armonizado" con el que mido una serie de indicadores sobre varias instalaciones en diferentes plantas productivas. La base de datos es bastante pesada por lo que estoy empezando a utilizar consultas para poder aligerarla un poco, estoy empezando, y seguro que podría optimizarla mucho más, pero bueno, paso a paso. Por el momento parece que no tiene mala pinta y no trabajo el tema consultas desde que utilizaba Access hace más de 20 años y he me he perdido completamente las evoluciones.

En el libro, tengo una serie de macros que me llaman a un archivo (base de datos) en un servidor determinado, me configura y descarga la nueva información en las tablas definidas en el dashboard, recalcula y ordena los rangos para los gráficos según unos criterios de ordenación (en algunos libros hasta 40 gráficos) y vuelve a recalcular nuevamente todo. Como he comentado anteriormente, esta base de datos es muy pesada (estamos hablando que, por semana y para una sola instalación son: ± 35000 registros en tres hojas, 1600 filas en una de las hojas de más datos) Esto ocasiona que, semana a semana se vayan ralentizando los cálculos y, sobre todo, una vez que la macro ordena según los diferentes criterios, pues los ocho procesadores de mi máquina se pueden tirar, en algún caso, hasta cuarenta minutos calculando. Sé que, para este volumen de datos, Excel no es la mejor opción, pero aún estoy muy pez con Power Bi y no encuentro el tiempo para avanzar, además de la dificultad añadida de no poder configurar tablas en columnas, si no en filas. Con las consultas le he conseguido quitar unas 19 columnas con fórmulas que multiplicas por las miles de filas, optimizo bastante el cálculo, pero no es suficiente.

En la antigua macro, lo que iba haciendo era: seleccionar cada uno de los rangos a ordenar (C13:K122) y (C128:K237) hay más rangos, pero en el ejemplo solo he incluido estos dos, y ordenar según un criterio (Mayor a Menor), ahora quería que esto se hiciera de forma automática cuando, al introducir nuevos registros de base de datos y se recalcule la fórmula incluida en la columna de ordenación (TOTAL PERIODO) se ordenen de mayor a menor dichos rangos. Con el procedimiento “Change” he conseguido que, al introducir algún valor de forma manual en la columna TOTAL PERIODO, el rango se ordene y chuta bien, pero el objetivo es el indicado anteriormente, que se ordene nuevamente el rango al variar el resultado de la fórmula.

 

Lo he probado cambiando el procedimiento a “Calculate” pero me da un error de compilación por lo que la variable definida seguro que no es la correcta. El código que, incluyo directamente en la hoja de trabajo, es el siguiente:

 

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Column = 11 Then

        With Range("C12:K122")

            .Sort key1:=.Cells(1, 9), order1:=xlDescending, Header:=xlYes

        End With

    End If

    If Target.Column = 11 Then

        With Range("C127:K237")

            .Sort key1:=.Cells(1, 9), order1:=xlDescending, Header:=xlYes

        End With

    End If

End Sub

Ya de paso, si me podéis aconsejar sobre cómo agilizar los cálculos o como estructurar las consultas, sería capaz de haceros la ola… Desactivo el cálculo automático al inicio de la macro, desactivo los filtros que pudiera haber activos, el refresco de pantalla en “False” hasta el final de la macro, delimito el espacio de trabajo de las hojas, delimito el rango de los gráficos de evolución a un máximo de diez modos de incidencia y solo recalculo en dos ocasiones en todo el proceso.

Reitero mi agradecimiento y aprovecho para felicitar a todos los integrantes de esta extraordinaria comunidad, que es la biblia de los sufridores de Excel, y de la que me gustaría ser parte activa para lo que podáis necesitar, por lo que quedo a vuestra entera disposición.

Recibid un cordial saludo.

P.D. En el fichero de ejemplo os he incluido solo algunas columnas de la base de datos y un par de rangos a ordenar, si necesitáis el archivo completo no dudéis en solicitármelo. El código está en la Hoja "Rango prueba 1"

ORDEN AUTOMATICO RANGO BETA v01.xlsm

publicado

¡Hola @tonibcn!

Puedes usar el siguiente código, y modificarlo de acuerdo con tus rangos:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim a, r, i&
  
  a = Array("G13:J122", "G128:J237")
  r = Array("C12:K122", "C127:K237")
  For i = 0 To UBound(a)
    If Not Intersect(Target, Range(a(i))) Is Nothing Then
      With Range(r(i))
        .Sort .Cells(1, 9), xlDescending, Header:=xlYes
      End With
    End If
  Next i
End Sub

¡Comentas! ¡Bendiciones!

publicado

Buenos días,

Voy a echar un vistazo y os digo algo, el tiempo de tomarme un café para ver si me despierto.

Muchas gracias por la rápida respuesta.

 

publicado

Buenos días de nuevo John.

No funciona, no hace nada, manteniendo el procedimiento en Change, al recalcular se queda igual y si lo cambio a Calculate, me vuelve a dar el error de compilación por la variable.

Muchas gracias de nuevo por la intención pero creo que debemos seguir investigando.

 

publicado

Puedes utilizar cualquiera de las 2 macros (O una o la otra, no las dos a la vez)

Private Sub Worksheet_Change(ByVal Target As Range): On Error Resume Next
'------------------------
'En la hoja Base de datos <--------------------------------------------
'------------------------
If Not Intersect(Target, Range("C:C")) Is Nothing Then
   With Sheets("Rango prueba 1")
      Application.EnableEvents = False
      .Range("C12:K122").Sort Key1:=.Columns("K"), Order1:=xlDescending, Header:=xlYes
      .Range("C127:K237").Sort Key1:=.Columns("K"), Order1:=xlDescending, Header:=xlYes
      Application.EnableEvents = True
   End With
End If
End Sub

 

Private Sub Worksheet_Calculate(): On Error Resume Next
'-------------------------
'En la hoja Rango prueba 1 <-------------------------------------------
'-------------------------
Application.EnableEvents = False
Range("C12:K122").Sort Key1:=Columns("K"), Order1:=xlDescending, Header:=xlYes
Range("C127:K237").Sort Key1:=Columns("K"), Order1:=xlDescending, Header:=xlYes
Application.EnableEvents = True
End Sub

 

publicado

Antes de exponer las conclusiones, agradecer a John y Antoni su tiempo y conocimiento en la resolución del problema.

Antoni, las dos soluciones aportadas han funcionado como un "tiro". A mayores, la segunda opción funciona tanto, si la modificación se realiza a través del recálculo con fórmulas, como si dicha modificación de la columna TOTAL HORAS se realiza de forma manual con introducción directa del dato.

Sois unos Crack... Muchas, muchísimas gracias.

Desde ya un nuevo Fan.

Mes salut i força ?

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
      28

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

    1    1

  • Crear macros Excel

  • Mensajes

    • Hola nuevamente. Por eso la importancia de lo que mencionas tú como "ruta relativa". Tal cual comentas, y aún sin llegar a algunos detalles importantes para ayudarte, en realidad tal cual te comenté le día miércoles, pues sí podías hacer como comentabas, era cosa de obtener los Id de Windows (como tú los llamas) y la ruta de OneDrive en casa usuario y eso sí se puede obtener con VBA y luego pasarlo a PQ, pero medio que te cerraste en que "PQ no puede trabajar con rutas relativas", cosa cierta pero siempre hay formas. Si SAP puede o no guardar en OneDrive o SharePoint, pues si está mapeado en la PC ¡claro que se puede! Pero bueno, creo que si te es útil tu propia propuesta ¡avanza con eso!
    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
    • Hola nuevamente, mi duda sigue siendo la ruta, o rutas, finales que quedan, esas que llamas "relativas"; igual por si acaso pon 3 o 4 de esas, tal cual son y/o se ven en el explorador de cada PC y, de ser posible, en cualquier otro "lado" en que las veas.
  • 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.