sábado, 12 de octubre de 2013

Ordenar un millón de valores

Descargue el fichero: Ordena_un_millon.xlsm

Podemos ordenar un millón de valores numéricos con VBA en un tiempo bastante aceptable.

En mi portatil (i7, 8Gb RAM) cada una de las dos macros tarda 2 segundos aproximadamente.


Sub genera_aleatorios_en_columna_A()
Dim i As Long
Dim R As Range
Dim A
Set R = Range("A1:A1000000")
A = R
Randomize
For i = 1 To 1000000
   A(i, 1) = Rnd
Next i
R = A
End Sub

Sub ordena_columna_A()
Columns("A:A").Sort key1:=Range("A1"), _
      order1:=xlAscending, Header:=xlNo
End Sub


Nota

La línea

R = A

equivale a

Range("A1:A1000000") = A

También puede interesarle ...

6 comentarios:

  1. Hola, no sé bien si aqui es donde pueda solicitar ayuda. He estado buscando como hacer algo asi como un while en excel, no sé visual basic, pero en mi trabajo me dieron la tarea de entregar un reporte funcional, y pensando creo que veo dos opciones pero no sé si una macro pueda ayudarme. Mi idea es que de un combo se pueda seleccionar una "zona" y al seleccionarla, se pudiera desplegar la información que respecta a esta, se usar el burcarv o h, pero la cosa es q no solo es una linea sino varios clientes con diferente avance por cada zona, asi que no he encontrado algo q me funcione, por otro lado como intermedio podría usar una bd de pivote, pero quiero ponerle un identificador, si tengo x ejemplo 10 veces el 33 y luego el 54 y adi sucesivamente y quiero poner una especie de ehile en donde sea el 33+1 y asi hasta llegar a 33n hasta q al rncontrar el 54 reiniciara la suma, es decir dl 33n se cambiara al 541 y asi empezar la suma con cada cambio de identificador. Alguna de estas formas, puede hacerse con una macro?.
    De antemano te agradezco que leas mi comentario, si es posible una respuesta sería genial, mil gracias!!!!

    ResponderEliminar
  2. Hola Johann.

    Posiblemente lo mejor para realizar ese reporte es una Tabla Dinámica (Pivot Table).

    Si luego quieres hacer un formato diferente que la tabla dinámica no te da puedes crear un informe secundario basado en la Tabla Dinámica donde ya podrías incluir todas las ideas que se te ocurran.

    Creo que lo que quieres se puede hacer con fórmulas, sin necesidad de hacer una macro. Sería cuestión de lucharlo para ver si se puede conseguir usando fórmulas.

    Un saludo.

    ResponderEliminar
  3. Hola Adolfo, estoy haciendo un curso de excel avanzado, y como último tema he llegado a las macros, he visto algún ejemplo con visual Basic. ¿Tan de moda estan las macros para tener que hacer un curso de visual basic?. Podrías decirme de algún otro curso para que me sirva para contabilidad, auditoría, y ampliar mis conocimientos con excel avanzado. Gracias.

    ResponderEliminar
  4. Estimado Adolfo, estoy realizando una macro y necesito cambiar el enlace de una fórmula es decir lo que esta enero quiero que se cambie a febrero y así poder cambiar con los meses que desee, a través de un click en a alguna lugar, es medio parecido a la respuesta que diste cambiando mes1 a mes2 y así sucesivamente pero esta vez quiero que se cambie de enero a febrero y no sólo 1, 2 ... Por favor dame una ayuda con este problema que tengo

    ResponderEliminar
  5. ORDENAR (EN ESTE CASO PRO NOMBRE)
    Hola Adolfo
    Tengo un pequeño sistema que lo hice de manera muy primitiva hace algunos años atrás.
    DETALLES
    Tengo un rango de datos que incluyen columas (CODIGO, NOMBRE, COLOR, UNIDADES, y otros más.
    CODIGO y UNIDADES son datos obtenidos por teclado por el usuario
    NOMBRE COLOR Y OTROS son obtenidos de otras hojas con formulas y funciones.
    Mi macro (prmitiva) ordenaba por nombre con los siguientes pasos.
    1 copiaba el rango completo (origen) a una hoja vacia (pegaba como valores).
    2 ordenaba alfabeticamente por nombre (pues ya no era formula sino texto)
    3 copiaba la columna CODIGO (ordenada) y pegaba en el espacio de CODIGO ORIGEN
    4 copiaba la columna UNIDADES (ordenada) y pegaba en el espacio UNIDADES ORIGEN.
    (Lo hacia por separado porque la columnas no son contiguas)
    FUNCIONA SI, PERO... tarde mucho si son muchos datos.

    LA CONSULTA
    Veo en este blog tuyo que amablemente compartes, que puedo usar arrays y ordenar dentro rangos grandes de datos.
    1ro, las filas varian, las columnas no.
    2do, ya puedo llevar mi RANGO ORIGEN una variable array.
    3ro, veo que ordenar los datos contenidos es posble con lo que tu enseñas aqui.
    4to, ¿como puedo llevar la columna ENTERA de UNIDADES del array a las celdas que le corresponden? y luego ¿como llevar la columna ENTERA de UNIDADES del array, a las celdas que le corresponden, SIN USAR NEXT FOR?
    pues pegar lso datos a las celcas UNO POR UNO usando NEXT FOR, tarda demasiado cuando son muchas filas.

    Espero tengas paciencia para enseñarme, y gracias por anticipado por tu tiempo.

    ResponderEliminar
  6. FELICITACIONES Y GRACIAS A LA VEZ, ENCONTRÉ MAS DE LO QUE BUSCABA

    ResponderEliminar