Saltar al contenido

Contar Unicos (con macro)


Gerson Pineda

Recommended Posts

Hola

Existen varios metodos para contar unicos, especialmente con formulas, de hecho Excel (2007/2010) ya incluye una opcion llamada Quitar Duplicados, esta herramienta nos cuenta los unicos, pero elimina nuestros datos, dejando solo unicos

Esta macro cuenta los unicos sin tocar los datos, solo debemos seleccionarlos y correr la macro, al final en la celda derecha se nos presentara el valor de cuantos son

Nota: lo subi como xlsm (para probar con mas filas/datos), pero la macro se puede utilizar en cualquier version de Excel

Espero sea de utilidad

Saludos

Contar unicos VBA.zip

Enlace a comentario
Compartir con otras webs

Muy bueno y rápido. Ve que te estás pasando al lado oscuro,....jejeje

Nota: lo subi como xlsm (para probar con mas filas/datos), pero la macro se puede utilizar en cualquier version de Excel

Y los de Excel 2003, ¿ Como lo abren ?

Enlace a comentario
Compartir con otras webs

Muy bueno y rápido. Ve que te estás pasando al lado oscuro,....jejeje

Y los de Excel 2003, ¿ Como lo abren ?

Que tal don Antony! gusto saludarte, hace un tiempo aparecio un complemento para poder abrir archivos 2007/2010 desde 2003, aunque sera mejor (dado tu comentario) que suba uno en version 2003, el cual adjunto

Saludos

Contar unicos VBA.zip

Enlace a comentario
Compartir con otras webs

Gracias, si me ayuda, solo una duda o sugerencia haber si lo puedes adaptar, ademas de contar únicos crees que sea posible que ademas que diga que hay N° de únicos me diga cuales son osea me saque los datos únicos en otra columna.

Gracias

Saludos

Celest3

Enlace a comentario
Compartir con otras webs

Hola Maria

Lo tomare como un plus y no como consulta, pues resulta muy util lo que comentas, y con esto estamos simulando y superando la herramienta "Quitar duplicados", al menos eso creo jeje!

He modificado la macro, adjunto los dos archivos xls-2003 y 2007/2010-xlsm

Saludos

Contar unicos VBA.zip

Contar unicos VBA-.zip

Enlace a comentario
Compartir con otras webs

Gerson muy buen aporte estoy tratando de entenderlo , mi pregunta es es muy dificil hacer algo parecido pero con una o dos condiciones es decir tener dos columnas

A NOMBRE

CIUDAD XX

CIUDAD1 XXX

CIUDAD XXX

CIUDAD XXX

CIUDAD1 XXX

CIUDAD1 XX

Y QUE ARROJE A UNA CELDA DETERMINADA EL RESULTADO:

CIUDAD 2NOMBRES

CIUDAD1 2NOMBRES

Enlace a comentario
Compartir con otras webs

Gerson muy buen aporte estoy tratando de entenderlo , mi pregunta es es muy dificil hacer algo parecido pero con una o dos condiciones es decir tener dos columnas

A NOMBRE

CIUDAD XX

CIUDAD1 XXX

CIUDAD XXX

CIUDAD XXX

CIUDAD1 XXX

CIUDAD1 XX

Y QUE ARROJE A UNA CELDA DETERMINADA EL RESULTADO:

CIUDAD 2NOMBRES

CIUDAD1 2NOMBRES

Hola

Gracias por comentar, pero en este subforo no debes consultar... abre un tema (pues lo tuyo es diferente) en el subforo correcto y con gusto te ayudaremos

Saludos

Enlace a comentario
Compartir con otras webs

Hola! Buen aporte! Pero... estaría fantástico adaptarlo a manera de función! asi yo escribo:

=valores_unicos(rango_datos)

y en automático me devuelve el numero de valores únicos en la celda donde escribí la formula. Pero al pasarlo a función creo que tendrias que prescindir del advancedfilter para obtener los valores únicos ya que las funciones operan con datos sin modificar la estructura del libro u hoja o estoy confundido en ese aspecto?

Enlace a comentario
Compartir con otras webs

Hola mi estimado Joshua tienes razon, gracias a ti, he corregido el archivo e hice otras adaptaciones/modificaciones para evitar al maximo otro error

- Ahora (primero seleccionamos los datos) la macro pegara el resultado y los unicos dos columnas a la derecha, por lo que no importara donde esten ubicados

Digitalboy

Creo que con la UDF no nos queda mas que trabajarlo en memoria, cuidado! si son demasiados datos Excel se puede congelar! ojo con eso... para los que realicen pruebas

- Al utilizar la UDF no se debe seleccionar el encabezado, solamente los datos

Si hay mas errores me gustaria lo comenten, adjunto nuevamente el archivo que incluye tambien la UDF

Saludos a todos

Contar unicos VBA version3 y UDF.zip

Enlace a comentario
Compartir con otras webs

Digitalboy

Creo que con la UDF no nos queda mas que trabajarlo en memoria, cuidado! si son demasiados datos Excel se puede congelar!

ni que lo digas! en efecto se congela! Es en estas situaciones cuando me arrepiento de la netbook que adquiri:

Procesador Intel Core Solo a 1.4 Ghz

2 GB de Memoria RAM DDR II

mi procesador es de un núcleo y por lo tanto no puedo sacar ventaja a Excel 2007 que saca provecho a procesadores de doble núcleo o mas para acelerar el calculo en las formula entre otras cosas.

Pero por otro lado... tengo la ventaja de que me veo obligado a hacer uso de buenas practicas y algoritmos para hacer buen uso de los recursos con los que cuento. Si logro que un programa corra eficientemente en mi maquina por supuesto que volara en otra que tenga mejores recursos!

Hice pruebas en la macro que nos brindas... me arrojo los siguientes resultados:

Generando números aleatorios entre 1-100 de A1:A60001 (incluyendo encabezado) -> 0.71875 segundos -> Contar_unicos_GP

Generando números aleatorios entre 1-3000 de I1:I60001 (incluyendo encabezado) -> 16.875 segundos -> Contar_unicos_GP

Generando números aleatorios entre 1-100 de O1:O15000 (no incluyendo encabezado) -> 23.15625 segundos -> UnicosGP

Tal como mencionas... se ralentizo la UDF, lo que me sorprende es la degradación en desempeño del filtro avanzado cuando amplio el rango de números aleatorios de 100 a 3000, en teoría debería de consumir el mismo tiempo ya que se trata de la misma cantidad de elementos.

Esta es mi versión alternativa de la UDF:


'---------------------------------------------------------------------------------------
' Funcion : Xcuentaunicos
' Programacion : Luis Cervantes
' Fecha : 25/09/2011
' Proposito : Obtener la cantidad de valores unicos
'---------------------------------------------------------------------------------------
Function Xcuentaunicos(rng As Range)
Dim i As Range
Dim colUnicos As New Collection


Application.Volatile
On Error Resume Next
For Each i In rng
colUnicos.Add i, CStr(i) 'agregamos el elemento a la coleccion.
Next i
On Error GoTo 0


Xcuentaunicos = colUnicos.Count
End Function
[/CODE]

A pesar de que es mas rápida en comparación con la UDF que proporcionas... hice la prueba de su funcionamiento en Excel 2007 al llenar la columna A con números aleatorios de 1-10000 y se tarda casi 15 segundos! una cantidad inaceptable de tiempo! Se me ocurren las siguientes ideas para acelerar el desempeño de la UDF:

  1. Usar un objeto Dictionary en lugar de un Collection
  2. Hacer una dll empleando Visual Basic
  3. Crear un servidor COM en Python para poder emplear los diccionarios de Python

Alguien tiene alguna otra idea para poder acelerar la UDF anterior y contar con una rápida y eficiente UDF?

Enlace a comentario
Compartir con otras webs

Hola Gerson, muy interesante!,

Te comento algunas cosillas que he encontrado, por si quieres perfilarlo aun mas:

Seleccionando solo estos dos, dice que seleccione mas datos

ZIPVILLANUEVA

ZIPINDELVA

Primero unico y dos repes seguidos dan 1 solo unico

ZIPVILLANUEVA

ZIPINDELVA

ZIPINDELVA

Primero repetido y segundo unico da dos resultados (esta seleccion si que funciona bien)

ZIPINDELVA

ZIPINDELVA

ZIPRIOBLANCO

Seleccionando toda la columna (pinchando en A), da mas de 65500 unicos, es decir, toma en cuenta los espacios en blanco

La siguiente seleccion indica el numero correcto de repeticiones (3 unicos):

ZIPVILLANUEVA

ZIPVILLANUEVA

ZIPINDELVA

ZIPINDELVA

ZIPINDELVA

ZIPINDELVA

ZIPINDELVA

ZIPRIOBLANCO

ZIPRIOBLANCO

Pero el resultado mostrado es:

ZIPVILLANUEVA (el primero sobra, entiendo que esto esta asi programado para mantener el encabezado)

ZIPVILLANUEVA

ZIPINDELVA

ZIPRIOBLANCO

Saludos!

Enlace a comentario
Compartir con otras webs

Hola verzulsan (gusto verte de nuevo)

Excelente tus pruebas eso para mi es valioso, porque te das cuenta de ciertas exigencias en cada aporte

Prueba de nuevo el adjunto, espero ahora si este quedando mejor y que tus proximos comentarios sean que ya no falla jeje

Pd la macro necesita un titulo pues se trabaja en base a "Filtro avanzado" la Udf no necesita titulo, prueba tambien la de digitalboy

Saludos a todos!

Contar unicos VBA version4 y UDF.zip

Enlace a comentario
Compartir con otras webs

  • 3 weeks later...

A pesar de que es mas rápida en comparación con la UDF que proporcionas... hice la prueba de su funcionamiento en Excel 2007 al llenar la columna A con números aleatorios de 1-10000 y se tarda casi 15 segundos! una cantidad inaceptable de tiempo! Se me ocurren las siguientes ideas para acelerar el desempeño de la UDF:

  1. Usar un objeto Dictionary en lugar de un Collection
  2. Hacer una dll empleando Visual Basic
  3. Crear un servidor COM en Python para poder emplear los diccionarios de Python

Después de un tiempo de ausencia... creo que ya esta olvidado este tema... yo sin embargo hace poco me di el tiempo de experimentar las 2 de la 3 opciones que mencione anteriormente.

Use un diccionario... no me convenció se tardo mas que usando la colección.

La dll no la haré... no se por que rehuyo de VB 6.0 y .Net? Creo que no son para mi! jajaja Soy feliz con VBA/Excel!

Después de 4 horas y algo de frustración ante algunos vanos intentos, lo logre! puede echar andar un servidor COM Python para poder utilizar el objeto diccionario nativo de Python en VBA Excel, eso me alegro, pero por otro lado me desanimo darme cuenta de que es mas lento que la colección de VBA. Quizás aun pueda optimizarlo, por que los diccionarios de Python si que vuelan! En unos días estaré publicando en el apartado de aportaciones lo del servidor COM desde Python!

Revisando mi Biblia de VBA/Excel encontre una forma para disminuir los 15 segundos en las mas de un millón de celdas a solo 9 segundos! Es todo lo que pude hacer!

Aquí les dejo la nueva versión de mi UDF de únicos, misma que estaré incorporando al complemento iSoftutilities al cual ya le he agregado algunas mas...


' Funcion : Xunicos
' Programacion : Luis Cervantes
' Fecha : 30/06/2012
' Proposito : Devuelve el numero o los valores unicos
'---------------------------------------------------------------------------------------
Function xUnicos(rng As Range, Optional intOp As Integer = 0)
Dim i As Long
Dim col As New Collection
Dim datos() As Variant
Dim tempo As Double


tempo = Timer


If rng.Columns.Count > 1 Then
xUnicos = -1
Exit Function
End If


datos = Application.WorksheetFunction.Transpose(rng)
For i = 1 To UBound(datos)
On Error Resume Next
col.Add datos(i), CStr(datos(i)) 'agregamos el elemento a la coleccion
On Error GoTo 0
Next i


'devuelve el numero de valores unicos
If intOp = 0 Then
xUnicos = col.Count
Debug.Print Timer - tempo
Exit Function
End If


'devuelve los valores unicos
If intOp = 1 Then
ReDim datos(col.Count - 1)
For i = 1 To col.Count
datos(i - 1) = col.Item(i)
Next i


xUnicos = Application.WorksheetFunction.Transpose(datos)
Debug.Print Timer - tempo
End If
End Function
[/CODE]

Esta no solo devuelve el numero de elementos únicos, sino también los valores cuando se usa de forma matricial (pero podría volverse lenta, dependiendo la cantidad de datos). Sin duda alguna es mejor trabajar con los datos en memoria que ir celda por celda. Es lento accesar a cada celda para para almacenar el valor de la misma en la coleccion!

Saludos!

Enlace a comentario
Compartir con otras webs

...Use un diccionario... no me convenció se tardo mas que usando la colección...

Hola maestro digitalboy,

en mi caso es más rápido un diccionario que una colección... no sé exactamente cómo era tu código, pero usando algo así la UDF en mi equipo arrojó el resultado casi en la mitad del tiempo que con la colección (probando con 50.000 datos):

Function Unicos2(ByRef Datos As Variant) As Long

Dim i As Long
Dim objDic As Object
Dim arrDatos As Variant


If TypeOf Datos Is Excel.Range Then arrDatos = Datos.Value2

Set objDic = CreateObject("scripting.dictionary")

For i = 1 To UBound(arrDatos)
If Not objDic.exists(arrDatos(i, 1)) Then objDic.Add arrDatos(i, 1), i
Next i

Unicos2 = objDic.Count

Set objDic = Nothing
End Function[/CODE]

No me he preocupado mucho por escribir una UDF usable, sino sólo como prueba porque me llamó la atención tu resultado y como te digo en mi caso el diccionario se demora casi la mitad de lo que lo hace una UDF así pero con una colección.

Es más, si uso enlace anticipado (estableciendo la referencia a Microsoft Scripting Runtime y reeplazando la declaración por "Dim objDic as Dictionary" y la instanciación por "set objDic = new dictionary") el código es todavía más rápido, como sería de esperarse.

Bueno, apenas una nota al pie de tu valioso aporte.

Enlace a comentario
Compartir con otras webs

Muy buenos las dos UDF

Mauricio ya se extrañan tus magnifcos aportes, pues esa UDF es supersonica y la sencillez de usar

Set objDic = CreateObject("scripting.dictionary")[/PHP]

Yo trate de aplicarlo, pero no di con el uso correcto

Saludos

Enlace a comentario
Compartir con otras webs

en mi caso es más rápido un diccionario que una colección... no sé exactamente cómo era tu código, pero usando algo así la UDF en mi equipo arrojó el resultado casi en la mitad del tiempo que con la colección (probando con 50.000 datos):

No me he preocupado mucho por escribir una UDF usable, sino sólo como prueba porque me llamó la atención tu resultado y como te digo en mi caso el diccionario se demora casi la mitad de lo que lo hace una UDF así pero con una colección.

Es más, si uso enlace anticipado (estableciendo la referencia a Microsoft Scripting Runtime y reeplazando la declaración por "Dim objDic as Dictionary" y la instanciación por "set objDic = new dictionary") el código es todavía más rápido, como sería de esperarse.

Hola Mauricio! Gracias por tu comentario y aporte!

Primero que nada una disculpa por que me he dado cuenta que la UDF que proporcione tiene un fallo, el cual al hacer uso de:


datos = Application.WorksheetFunction.Transpose(rng)
[/CODE]

Si bien se guardan los datos como un array unidimensional, tiene el inconveniente de de solo almacena a lo mucho alrededor de 41 mil elementos o sea que no sirve para grandes cantidades de datos. Hice la modificación para solo el conteo de valores únicos y me quedo así:

[CODE]
Function Unicos1(rng As Range)
Dim i As Long
Dim col As New Collection
Dim Datos() As Variant
Dim tempo As Double


tempo = Timer
Datos = rng


On Error Resume Next
For i = 1 To UBound(Datos)
col.Add Datos(i, 1), CStr(Datos(i, 1)) 'agregamos el elemento a la coleccion
Next i
On Error GoTo 0


'devuelve el numero de valores unicos
Unicos1 = col.Count
Debug.Print Timer - tempo
End Function
[/CODE]

Después... compare el código anterior (el cual ya me cerciore que devuelva el conteo de únicos) contra el código que proporciona Mauricio. Estas fueron las pruebas:

  • Prueba #1

En el rango A1:A50000 utilice la función "aleatorio.entre" para generar números del 1-50000. Después copie y pegue por valor.

Tiempo Requerido usando diccionario: 0.312 segundos!

Tiempo Requerido usando colección: 0.453 segundos!

  • Prueba #2

En el rango A1:A500000 utilice la función "aleatorio.entre" para generar números del 1-500000. Después copie y pegue por valor.

Tiempo Requerido usando diccionario: 13.265 segundos!

Tiempo Requerido usando colección: 4.859 segundos!

Mauricio y Gerson... mucho les agradecería hicieran la comparación y me informen de los resultados obtenidos en sus equipos con las pruebas antes mencionadas y sino fuera mucho pedir pongan las características de sus equipos (principalmente el tipo de procesador, velocidad de este y cantidad de núcleos).

De antemano les agradezco y quedo en espera de sus observaciones al respecto!

Enlace a comentario
Compartir con otras webs

Invitado Cacho R
... Revisando mi Biblia de VBA/Excel encontre una forma para disminuir los 15 segundos en las mas de un millón de celdas a solo 9 segundos! Es todo lo que pude hacer! ...

Hola! amigos.

Muy interesantes los sucesivos aportes.

Recién me di a intervenir a raiz de los números que comenta digitalboy, pues llamaron mi atención.

En efecto: como ando con "juguete nuevo" estoy contrastando velocidades. Puedo comentarles que -para un millón de datos- y con los procedimientos que adjunto, he obtenido:

- Por procedimiento: dos segundos y medio

- Por UDF: 3 segundos

De modo que me gustaría conocer vuestros rendimientos comparativos para evaluar la eficiencia de los métodos programados.

Saludos, Cacho R.

Contar únicos (by CachoR).rar

Enlace a comentario
Compartir con otras webs

En efecto: como ando con "juguete nuevo" estoy contrastando velocidades. Puedo comentarles que -para un millón de datos- y con los procedimientos que adjunto, he obtenido:

- Por procedimiento: dos segundos y medio

- Por UDF: 3 segundos

De modo que me gustaría conocer vuestros rendimientos comparativos para evaluar la eficiencia de los métodos programados.

Hola Cacho!

Probé tu macro tal cual y esto son los resultados arrojados por mi modesta netbook...

- Por procedimiento: 5.67 segundos!

- Por UDF: 4.96 segundos!

Que raro! en mi maquina es mas rápido por UDF!

Ahora... modificando esta parte de tu código:


.Formula = "=RANDBETWEEN(1, 6000)" ' Fórmula válida para Excel 2010/2007
[/CODE]

Me arroja estos resultados:

- Por procedimiento: 18.78 segundos!

- Por UDF: 5.21 segundos!

Caray! el tiempo para el filtro avanzado se inflo bastante conforme aumenta el rango de aleatoriedad de los números no así para la UDF que solo aumento una parte poco significativa!

En el caso de la UDF creo que consume mas tiempo agregar un nuevo elemento a la colección que cerciorarse si esta duplicado, en el caso del filtro avanzado no me doy una idea de por que aumento el tiempo.

Saludos!

[color=blue]- - - - - Mensaje combinado - - - - -[/color]

En el caso de la UDF creo que consume mas tiempo agregar un nuevo elemento a la colección que cerciorarse si esta duplicado...

Saludos!

En efecto, así es! Rellene la columna A con los números del 1-1048576, obviamente no hay duplicados y por lógica ya sabemos la cantidad de valores únicos, si utilizo la UDF para para la columna me devuelve el resultado en:

14.34 segundos!

Bueno, esperare con impaciencia las observaciones de Cacho y Mauricio para cotejar resultados! Y por el momento creo que ya no hay nada mas que se pueda hacer para acelerar la obtención de la cantidad de valores únicos.

Saludos!

Enlace a comentario
Compartir con otras webs

Invitado Cacho R

Hola! digitalboy. Un par de apuntes:

__________________________

- Avalo tus comentarios por llegar a las mismas observaciones experimentales.

__________________________

- Agrego un detalle adicional: la diferencia de tiempos de proceso entre el procedimiento basado en el filtro avanzado y la udf basada en Collection, no depende tanto de la cantidad de datos a comparar, como de la cantidad de datos distintos: ¿Se entiende lo que digo?...

Si la cantidad de datos distintos es "baja", el procedimiento del Excel AdvancedFilter es eficiente. Caso contrario vemos lo que has notado.

__________________________

- Dando por entendidas las dos cuestiones previamente acotadas, he incorporado al "rar" de mi mensaje #18 otro archivo.

En efecto: por un lado mantengo el archivo que compara filtro avanzado con udf/Collection. Por otro lado he incorporado un archivo que compara tiempos de proceso entre udf/Collection y udf/Dictionary.

Es interesante adverir que hasta 400.000 filas de números enteros entre 1 y 400.000, los tiempos son -casi- indistinguibles con alguna ventaja a favor del método basado en Dictionary.

Sin embargo, y a partir de ese número: los tiempos de udf/Collection aumentan lentamente a expensas de un aumento exponencial del procedimiento udf/Dictionary.

¡Es para tenerlo en cuenta!...

__________________________

- Finalmente menciono que en udf/Dictionary no aplico el método Exists por ser mucho más lento que On error Resume Next en todas mis pruebas.

__________________________

Saludos, Cacho R.

Enlace a comentario
Compartir con otras webs

Hola

Mis tiempos con el archivo2 de Cacho con 100,000 datos

[TABLE=width: 253]

[TR]

[TD]Datos únicos[/TD]

[TD]Casos[/TD]

[TD]Tiempo[/TD]

[/TR]

[TR]

[TD]Por Collection:[/TD]

[TD]63,374[/TD]

[TD]3.711 seg[/TD]

[/TR]

[TR]

[TD]Por Dictionary:[/TD]

[TD]63,374[/TD]

[TD]2.090 seg[/TD]

[/TR]

[/TABLE]

Portatil Compac Presario

Procesador Intel Celeron® 530 @1.73 Ghz

Ram 1.5 Sistema de 32

Windows Vista Home Basic

Excel 2010

Notaran que es no la gran computadora pero espero obtener una mejor no se cuado jeje

Saludos

Enlace a comentario
Compartir con otras webs

- Agrego un detalle adicional: la diferencia de tiempos de proceso entre el procedimiento basado en el filtro avanzado y la udf basada en Collection, no depende tanto de la cantidad de datos a comparar, como de la cantidad de datos distintos: ¿Se entiende lo que digo?...

Si la cantidad de datos distintos es "baja", el procedimiento del Excel AdvancedFilter es eficiente. Caso contrario vemos lo que has notado.

__________________________

Es interesante adverir que hasta 400.000 filas de números enteros entre 1 y 400.000, los tiempos son -casi- indistinguibles con alguna ventaja a favor del método basado en Dictionary.

Sin embargo, y a partir de ese número: los tiempos de udf/Collection aumentan lentamente a expensas de un aumento exponencial del procedimiento udf/Dictionary.

¡Es para tenerlo en cuenta!...

Wow hasta utilizaste una gráfica para hacerlo mas entendible! mis respetos! :applouse:

Lo de la cantidad de datos distintos quedo claro, creo que no supe explicarlo previamente! La udf/collection se tarda 7.76 segundos... para una aplicación comercial creo que no es suficiente y menos para un tipo obsesionado como yo con los tiempos de desempeño... jajaja. Aun me queda la opción de Python o probar IronPython del mismo microsoft y fusionarlo con VBA/Excel para disponer de una potente udf pero creo que me tomara algo de tiempo hacer las pruebas y no estoy seguro de poder conseguir algo, en fin...

También veo en tu código...


Erase Vec
Set myDic = Nothing
[/PHP]

Obviamente se que lo haces con la intención de liberar memoria... pero acaso no VBA libera la memoria de forma automática? o he vivido engañado?

haré una prueba... si, si la linera en automático al salir!

Saludos!

[color=blue]- - - - - Mensaje combinado - - - - -[/color]

Hola

Mis tiempos con el archivo2 de Cacho con 100,000 datos

[TABLE=width: 253]

[TR]

[TD][b]Datos únicos[/b][/TD]

[TD][b]Casos[/b][/TD]

[TD][b]Tiempo[/b][/TD]

[/TR]

[TR]

[TD]Por Collection:[/TD]

[TD]63,374[/TD]

[TD]3.711 seg[/TD]

[/TR]

[TR]

[TD]Por Dictionary:[/TD]

[TD]63,374[/TD]

[TD]2.090 seg[/TD]

[/TR]

[/TABLE]

Portatil Compac Presario

Procesador Intel Celeron® 530 @1.73 Ghz

Ram 1.5 Sistema de 32

Windows Vista Home Basic

Excel 2010

Notaran que es no la gran computadora pero espero obtener una mejor no se cuado jeje

Saludos

Estos son mis resultados y caracteristicas:

[TABLE=width: 253]

[TR]

[TD][b]Datos únicos[/b][/TD]

[TD][b]Casos[/b][/TD]

[TD][b]Tiempo[/b][/TD]

[/TR]

[TR]

[TD]Por Collection:[/TD]

[TD]63,356[/TD]

[TD]1.016 seg[/TD]

[/TR]

[TR]

[TD]Por Dictionary:[/TD]

[TD]63,356[/TD]

[TD]0.641 seg[/TD]

[/TR]

[/TABLE]

Portatil MSI X340

Procesador Intel® Core2 Solo CPU U3500 @1.40 GHz

Ram 1.87 GB Sistema de 32

Windows XP (Version Desatendida)

Excel 2007

Enlace a comentario
Compartir con otras webs

Invitado Cacho R

Hola! Amigos.

Adjunto un par de gráficas más:

7526091630_e606a097ff.jpg

¿Qué significan las relaciones 1:1 y 1:3?...

La relación 1:1 es lo que vemos programado en el archivo del mensaje #18. Por ejemplo: generamos 450.000 datos aleatorios en el rango de números enteros 1 a 450.000.

La relación 1:3 implica que genero 450.000 datos aleatorios en el rango de números enteros 1 a 150.000. Se deduce fácilmente que esta relación de trabajo implica una menor exigencia y, por ende, menores tiempos.

_____________________________

Es interesante ver que ambos métodos (el basado en Collection y el basado en Dictionary) se comportan -prácticamente- igual con bajas cantidades de datos.

Sin embargo es notorio que a medida que aumenta la exigencia (desde 100.000 datos en adelante), mientras que lo basado en Collection desmejora su perfomance de modo lineal, vemos que lo basado en Dictionary desmejora su perfomance de modo exponencial.

_____________________________

Mi conclusión de todo lo visto la puedo resumir en tres ideas:

a) Con bajas exigencias (baja cantidad de datos y pocos datos diferentes) ambos métodos se comportan -casi- iguales;

B) Con exigencias medias el método basado en Dictionary saca ventajas;

c) Con altas exigencias (alta cantidad de datos y muchos datos diferentes) el método basado en Collection saca ventajas

No sé si comparten la conclusión...

Saludos, Cacho R.

_____________________________

P.D.

Las pruebas fueron hechas con un hard/soft de las siguientes características:

Windows 7 Ultimate 64 bits

Intel Core I5-2310 CPU @ 2.90 GHz

8 GB RAM

Excel 2010

Enlace a comentario
Compartir con otras webs

Hola! Amigos.

Mi conclusión de todo lo visto la puedo resumir en tres ideas:

a) Con bajas exigencias (baja cantidad de datos y pocos datos diferentes) ambos métodos se comportan -casi- iguales;

B) Con exigencias medias el método basado en Dictionary saca ventajas;

c) Con altas exigencias (alta cantidad de datos y muchos datos diferentes) el método basado en Collection saca ventajas

No sé si comparten la conclusión...

Saludos, Cacho R.

_____________________________

P.D.

Las pruebas fueron hechas con un hard/soft de las siguientes características:

Windows 7 Ultimate 64 bits

Intel Core I5-2310 CPU @ 2.90 GHz

8 GB RAM

Excel 2010

Que gran desgloce mi estimado Cacho! y parece que la nueva adquisicion es de alto rendimiento jeje enhorabuena

Saludos

Enlace a comentario
Compartir con otras webs

Mi conclusión de todo lo visto la puedo resumir en tres ideas:

a) Con bajas exigencias (baja cantidad de datos y pocos datos diferentes) ambos métodos se comportan -casi- iguales;

B) Con exigencias medias el método basado en Dictionary saca ventajas;

c) Con altas exigencias (alta cantidad de datos y muchos datos diferentes) el método basado en Collection saca ventajas

No sé si comparten la conclusión...

Estoy de acuerdo!:positive:

Enlace a comentario
Compartir con otras webs

Archivado

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

  • 97 ¿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
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola que tal amigos programadores por favor me podrían ayudar con una macro que me genere un archivo CSV delimitado por comas, la estructura del archivo CSV no deberá llevar encabezado, los datos del archivo CSV serán obtenidos de la hoja “Datos”. En la columna A: deberá tener la clave clues que se toma de la columna B de la hoja Datos En la Columna B: el Código (son 230 codigos que van del rango G1:IB1 de la hoja datos) En la Columna C: el valor almacenado a su correspondiente al código y clues En la Columna D: el número del mes que se obtendrá de la de la columna E de la hoja Datos En la Columna E: el año que se tomará de la columna F de la hoja de Datos   Son 230 códigos por lo que la macro generará 230 filas por cada clave clues que tenga la hoja Datos En el archivo anexo una hoja llamada CSV para que vean la estructura que tendrá, el archivo CSV estará delimitado por comas   Les agradecería mucho que me ayuden por favor, Dios los bendiga Exportar datos a csv.xlsx
    • Hola buenas tardes.   Debido al trabajo debo estar comparando en un periodo unos archivos dentro de una carpeta o subcarpeta. en base a la fecha de creacion o modificacion.  pero tengo que estar viendo carpeta por carpeta y aveces son varios. Con una macro intente  listar los archivos de cualquier carpeta y subcarpeta, esto activandolo segun la celdaactiva. El problema es que tiene algunos errores. 1. si la carpeta cuenta con subcarpetas me los manda a muchas filas abajo. Mi idea es hoja(Así debe quedar) Que con una macro pueda seleccionar la carpeta desde el buscador y me de la lista de archivos a partir de la fila 6. siendo columna A= fecha de modificación, columna B =Fecha de creación y columna C=Nombre del archivo con hiperlink. Con otro o con la misma macro poder seleccionar otra carpeta y sus subcarpetas, según sea el caso. y me liste a partir de la columna F de la fila 6 Siendo La columna F=Nombre del archivo, columna H=fecha de creación, columna I=ultima modificación   Para así poder acceder y comparar mis archivos, directamente desde excel.   Muchas gracias Mariano       Listar archivos de 2 carpetas para comparar.xlsm
    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
    • Agradecido Antoni! Tus sugerencias me ayudaron mucho! Como pudiese hacerte llegar el archivo?
    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
  • 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.