La idea del trabajo de hoy es obtener un listado ordenado (en sentido descendente-de mayor a menor-) mediante una UDF, o función personalizada en VBA.
Supongamos el siguiente origen de información, del cual queremos obtener un listado a parte con aquellos registros cuyo número de unidades sea mayor, por ejemplo, los cinco primeros.. aunque, con esta personalización podrías obtener aquellas posiciones que deseáramos.
Construiremos una función que realice por nostros la búsqueda de los valores que necesitemos, la posterior ordenación interna, y acabe devolviendo el valor ya ordenado...
Lo interesante es que apoyándonos en nuestro propio Tipo de datos (ver cómo) desplegaremos no solo los valores numéricos ('unidades') si no también el resto de datos de esos registros...
El proceso completo de la función es:
1- carga de datos en nuestra Array (matriz)
2- ordenación de esos datos siguiendo el modelo burbuja (ver)
3- la función acaba devolviendo un dato según el argumento 'tipo' seleccionado.. quien retornará una de las propiedades del Type.
Insertamos el código de la función en un módulo estándar de nuestro proyecto de VBA desde el editor de VB:
Supongamos el siguiente origen de información, del cual queremos obtener un listado a parte con aquellos registros cuyo número de unidades sea mayor, por ejemplo, los cinco primeros.. aunque, con esta personalización podrías obtener aquellas posiciones que deseáramos.
Construiremos una función que realice por nostros la búsqueda de los valores que necesitemos, la posterior ordenación interna, y acabe devolviendo el valor ya ordenado...
Lo interesante es que apoyándonos en nuestro propio Tipo de datos (ver cómo) desplegaremos no solo los valores numéricos ('unidades') si no también el resto de datos de esos registros...
El proceso completo de la función es:
1- carga de datos en nuestra Array (matriz)
2- ordenación de esos datos siguiendo el modelo burbuja (ver)
3- la función acaba devolviendo un dato según el argumento 'tipo' seleccionado.. quien retornará una de las propiedades del Type.
Insertamos el código de la función en un módulo estándar de nuestro proyecto de VBA desde el editor de VB:
Type Referencias 'definimos un tipo de dato personalizado con tres propiedades.... Uds As Integer NumRef As String DSArt As String End Type '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Function ordenado(rng As Range, orden As Integer, tipo As String) 'el argumento tipo nos dirigirá hacia una o otra propiedad de nuestro tipo de dato 'tipo puede ser: 'producto', 'descripcion' o 'unidades' Application.Volatile 'contamos celdas con datos, no vacías... Num = Application.WorksheetFunction.CountA(rng) Dim matriz() As Referencias ReDim matriz(1 To Num) As Referencias 'rellenamos nuestra matriz con los valores con datos x = 1 For Each celda In rng If celda.Value <> 0 Then matriz(x).Uds = Val(celda.Value) matriz(x).NumRef = celda.Offset(0, -2).Value matriz(x).DSArt = celda.Offset(0, -1).Value x = x + 1 End If Next celda 'reordenarmos empleando el método de burbuja Dim strTemp As Referencias Dim i As Long, j As Long Dim lngMin As Long, lngMax As Long lngMin = 1 lngMax = x - 1 'ordenado por Burbuja For i = lngMin To lngMax - 1 For j = i + 1 To lngMax If Val(matriz(i).Uds) < Val(matriz(j).Uds) Then 'para unidades strTemp.Uds = Val(matriz(i).Uds) matriz(i).Uds = Val(matriz(j).Uds) matriz(j).Uds = Val(strTemp.Uds) 'para Cod Artículo strTemp.NumRef = matriz(i).NumRef matriz(i).NumRef = matriz(j).NumRef matriz(j).NumRef = strTemp.NumRef 'para Descripción strTemp.DSArt = matriz(i).DSArt matriz(i).DSArt = matriz(j).DSArt matriz(j).DSArt = strTemp.DSArt End If Next j Next i 'devolvemos un dato u otro según el argumento 'tipo' If tipo = "unidades" Then ordenado = matriz(orden).Uds ElseIf tipo = "descripcion" Then ordenado = matriz(orden).DSArt ElseIf tipo = "producto" Then ordenado = matriz(orden).NumRef Else ordenado = "error" End If End FunctionEn la celda F3 introduciremos la función: =ordenado($C$3:$C$21;$E3;F$2) donde alimentamos los argumentos creados en nuestra UDF. primer argumento: rango de los valores (campo unidades). segundo argumento: posición deseada; recuerda el orden es descendente. Posición 1 el mayor valor, etc.. tercer argumento: dato deseado (unidades, producto o descripción) Como veíamos en la imagen de más arriba, el orden obtenido responde a lo que pretendíamos...
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.