You are on page 1of 37

Eliminar los valores duplicados o repetidos de un array o vector

En el ejemplo se recorre un array, se le agregan unos valores (nombres de personas) en el cual hay algunos repetidos. Tambin hay un array temporal en el cual se copia el otro array para luego poder comparar sus valores y eliminarlos. Por ltimos se recorre el arreglo y se aaden los elementos en un control Listbox
Controles

Colocar un control ListBox llamado List1 y un Command1

Cdigo fuente
1. 2. 3. 4.

'Array Dim Arreglo() As String 'Array temporal Dim TempArray() As String Private Sub Command1_Click() Dim x As Integer, x2 As Integer, y As Int Dim z As Integer, Elemento As Variant 'eliminamos el contenido del List1 List1.Clear 'Agregamos algunos elementos al Array 'Hay 2 elementos duplicados: Gastn y ReDim Arreglo(8)

5.
6.

7.
8.

eger
9.

10.
11.

12. 13. 14.


15.

16.
17.

Mariana
18.

19. 20. 21. 22. 23. 24. 25. 26. 27.

Arreglo(0) Arreglo(1) Arreglo(2) Arreglo(3) Arreglo(4) Arreglo(5) Arreglo(6) Arreglo(7) Arreglo(8)

= = = = = = = = =

"Carlos" "Mariana" "Pepito" "Gastn" "Mariana" "Luciano" "Agustin" "Mariana" "Gastn"

28. 29.
30.

For i = LBound(Arreglo) To UBound(Arr

eglo) 'Redimensionamos el Array temporal y preservamos el valor 32. ReDim Preserve TempArray(i) 33. 'Asignamos al array temporal el val or del otro array 34. TempArray(i) = Arreglo(i) 35. 36. Next 37. 38. For x = 0 To UBound(Arreglo) 39. z = 0 40. 41. For y = 0 To UBound(Arreglo) 42. 'Si el elemento del array es igua l al array temporal 43. If Arreglo(x) = TempArray(z) And y <> x Then 44. 'Entonces Eliminamos el valor duplicado 45. Arreglo(y) = "" 46. Nduplicado = Nduplicado + 1 47. End If 48. z = z + 1 49. Next y 50. Next x 51. 52. 'Recorremos el array. Para recorrer un ar ray con ForEach 53. 'la variable de la coleccindebe ser de t ipo Variant 54. For Each Elemento In Arreglo
31.

55.

'Si el elemento es distinto de una ca 'lo agegamos al List1 If Elemento <> "" Then List1.AddItem

dena vacia
56. 57.

Elemento 58. Next 59. 60. 'Mostramos el nmero de elementos repetid os que se eliminaron del array 61. MsgBox "Elementos duplicados: " & Nduplic ado, vbInformation 62. 63. End Sub

Aadir datos sin dusplicados a una coleccin


Este es un simple cdigo fuente para poder aadir datos a una coleccin, y verificar que no se aadan elementos duplicados en la misma. Los elementos se cargan en un control de lista, pero por supuesto se puede utilizar con otros controles y adaptarlo a las necesidades de cada caso, aadir mas opciones, etc .. . Para comprobar que no se intente insertar un item repetido, se comprueba el error nmero 457 mediante un controlador de error. 457 -- "El elemnto ya existe en la coleccin" Crear ejemplo

Aadir una caja de texto : Nombre txtValue --

Text para el nuevo item

Un ListBox : Nombre lstListValues -- Control para

los datos

Un Botn : Nombre CmdAdd -- Agregar nuevo

item

Dos Bottones en un array (cmdDelete(0) y

cmdDelete(1)) -- Eliminar items Formulario

Cdigo fuente
1.

Option Explicit

2. ' \\ -- Simple ejemplo para aadir datos a un a coleccin sin duplicados 4. ' -- -5. ' --------------------------------------------------------------------------------6. 7. ' -- Declarar una coleccin 8. Private m_ColData As Collection 9. 10. ' ---------------------------------------------------------------------------11. '\\ -- Botn para agregar nuevo valor a la co leccin 12. ' ---------------------------------------------------------------------------3.

13. Private Sub cmdAdd_Click() 14. On Error GoTo error_Handler 15. On Error Resume Next 16. If Len(txtValue) Then 17. ' -- Agregar item ( texto y clave) ...

Si no hubo error al intentar aadir un nuevo val or que ya existe .. 18. m_ColData.Add txtValue.Text, "_" & Tri m(txtValue.Text) 19. If Err.Number = 0 Then 20. ' -- Agrega el valor 21. lstListValues.AddItem txtValue .Text 22. ' -- Mostrar mensaje de error ( el ele mento ya existe - Misma clave) 23. ElseIf Err.Number = 457 Then 24. MsgBox "El elemento ya existe en la coleccin", vbExclamation 25. Else 26. GoTo error_Handler 27. End If 28. End If 29. 30. On Error GoTo 0 31. 32. ' -- Otros errores 33. Exit Sub 34. error_Handler: 35. MsgBox Err.Description, vbCritical, "erro r en el botn agregar" 36. End Sub 37. ' ---------------------------------------------------------------------------38. '\\ -- Botn para Eliminar el elemento selecc ionado o toda la coleccin 39. ' ---------------------------------------------------------------------------40. Private Sub cmdDelete_Click(Index As Integer)
41. 42. 43. 44.

45.
46.

Select Case Index Case 0 Set m_ColData = Nothing Set m_ColData = New Collection lstListValues.Clear Case 1

47.

If lstListValues.ListIndex <> -1

Then m_ColData.Remove "_" & Trim(l stListValues.Text) 49. lstListValues.RemoveItem lstListValues.ListIndex 50. End If 51. End Select 52. End Sub 53. ' ---------------------------------------------------------------------54. ' \\ -- Desactivar botn cuando no hay ningn dato en la caja de texto 55. ' ---------------------------------------------------------------------56. Private Sub txtValue_Change() 57. cmdAdd.Enabled = Len(txtValue) 58. End Sub 59. 60. ' ---------------------------------------------------------------------------61. '\\ -- Inicio 62. ' ---------------------------------------------------------------------------63. Private Sub Form_Load() 64. ' -- Instanciar la coleccin 65. Set m_ColData = New Collection 66. ' -- Configurar controles 67. cmdAdd.Enabled = False 68. cmdDelete(0).Enabled = False 69. cmdDelete(1).Enabled = False 70. txtValue.Text = vbNullString 71. cmdAdd.Caption = "Agregar" 72. cmdDelete(1).Caption = "Eliminar" 73. cmdDelete(0).Caption = "Eliminar colecci n" 74. End Sub 75. ' ---------------------------------------------------------------------------76. '\\ -- Fin 77. ' ---------------------------------------------------------------------------78. Private Sub Form_Unload(Cancel As Integer) 79. ' -- Destruir la coleccin 80. Set m_ColData = Nothing 81. End Sub
48.

Ejemplo 1
Este ejemplo ordena un array o vector usando el mtodo de ordenacin llamado Burbuja o Bubble Sort.

Nota importante. Este algottmo no es el mas


indicado para realizar ordenacin de datos, ya que en comparacin a otros mtodos es lento. Lo que si es un mtodo fcil de entender. ( Al final de la pgina hay enlaces para utilizar otros mtodos). Tambin puedes mirar esta pgina donde hay una tabla que demuestra algunos conceptos a la hora de poder elegir entre los mtodos de ordenacin mas convenientes segn la tarea que debamos realizar: En el cdigo, se utiliza un control Listbox para cargar algunos valores no numricos y a la vez se asignan estos a un vector. Luego al llamar a la rutina Ordenar, se ordenar en forma alfabtica y ascendente. Por ltimo se cargan los datos ordenados en un List2.

Ejemplo

Colocar un List1

Un List2 Dos botones (Command1 y Command2 )

Cdigo en un Form
Option Explicit 2. 3. ' -- Vector para los datos 4. Dim Vector() As Variant 5. 6. ' -----------------------------------------------------------------------------7. ' \\ -- Inicio 8. ' -----------------------------------------------------------------------------9. Private Sub Form_Load() 10. Command1.Caption = " Ordenar Ve ctor " 11. Command2.Caption = " Cargar Vec tor " 12. Command1.Enabled = False 13. End Sub 14. 15. ' -----------------------------------------------------------------------------16. ' \\ -- Botn para Ordenar el array y cargar los valores en el List2 17. ' -----------------------------------------------------------------------------18. Private Sub Command1_Click() 19. Dim i As Integer 20. 21. Call Ordenar
1.

22. 23.
24.

List2.Clear For i = 0 To UBound(Vector) List2.AddItem Vector(i) Next i Command1.Enabled = False End Sub

25.
26. 27. 28.

29. ' -----------------------------------------------------------------------------31. ' \\ -- Cargar valores en el List1 32. ' -----------------------------------------------------------------------------33. Private Sub Command2_Click() 34. Command2.Enabled = False 35. Command1.Enabled = True 36. 37. Call Cargar_Array 38. End Sub 39. ' -----------------------------------------------------------------------------40. ' \\ -- BubbleSort - Sub para orden ar el vector 41. ' -----------------------------------------------------------------------------42. Private Sub Ordenar() 43. 44. Dim iMin As Long 45. Dim iMax As Long 46. Dim Vectemp As String ' -- variable temporal 47. Dim Pos As Long 48. Dim i As Long 49. 50. iMin = LBound(Vector) 51. iMax = UBound(Vector)
30.

52.
53.

54.
55. 56.

While iMax > iMin Pos = iMin For i = iMin To iMax - 1 If Vector(i) > Vector(i Vectemp = Vector(i + 1) Vector(i + 1) = Vector( Vector(i) = Vectemp Pos = i End If Next i iMax = Pos Wend End Sub

+ 1) Then 57. 58. i) 59. 60.


61. 62.

63.
64. 65.

66. ' ------------------------------------------------------------------------------68. ' \\ -- Sub cargar valores de ejemp lo en el array y en el control de lista 69. ' ------------------------------------------------------------------------------70. Private Sub Cargar_Array() 71. Dim i As Integer 72. 73. ' -- Listbox 74. With List1 75. .AddItem "A" 76. .AddItem "H" 77. .AddItem "B" 78. .AddItem "G" 79. .AddItem "C" 80. .AddItem "F" 81. .AddItem "D" 82. End With 83.
67.

84. 85.

' -- Array ReDim Vector(List1.ListCount For i = 0 To List1.ListCount Vector(i) = List1.List(i) Next i End Sub

1)
86.

1 87.
88. 89.

Ejemplo 2
similar al visto anteriormente, donde primeramente se cargan en forma aleatoria unos nmeros en un array y al mismo tiempo en un listbox ( el de la izquierda ). Luego para ordenar se llama a la rutina Bubble sort , enviando como argumento el vector anterior para ordenarlo.

Ejemplo que llena un vector con valores numricos aleatorios, y luego los ordena visualizandolos en un ListBox con el mtodo QuickSort

Este mtodo, por las pruebas que he hecho comparndolo con el mtodo burbuja (bubble sort ) y otros, para ordenar un vector o array que contiene los datos desordenados, es el mas rpido.

El ejemplo tiene una funcin llamada Ordenar_Matriz con los siguientes parmetros:

Sub Ordenar_Matriz(El_Vector() As Variant, _ Limite_Inferior As Long, _ Limite_Superior As Long)

El primer parmetro de la rutina se debe enviar el vector a ordenar. El segundo es el lmite inferior: Lbound(El_Vector) El tercero es el lmite Superior: Ubound(El_Vector)

Colocar dos Commandbutton. El Command1 crea valores aleatorios y los carga en el array y en un Listbox. El Command2 ordena la matriz y luego carga los datos ordenados en el control.

Nota: el vector est declarado como Variant para que se pueda enviar cualquier dato numrico. Por eso para utilizarlo con algn dato especifico y optimizar, por ejemplo datos de tipo Long, single etc.., declararlo como " tal " en el argumento de la funcin.

Cdigo fuente en el formulario: Option Explicit 2. 3.


1.

4.

'Vector que se va a desordenar y ordena

r Dim Vector() As Variant 6. 7. 8. Sub Ordenar_Matriz(El_Vector() As Varia nt, _ 9. Limite_Inferior As L ong, _ 10. Limite_Superior As Long) 11. 12. Dim i As Long, j As Long, x As Vari ant, y As Variant 13. 14. i = Limite_Inferior 15. j = Limite_Superior 16. 17. x = El_Vector((Limite_Inferior + Li mite_Superior) / 2) 18. 19. While i <= j 20. 21. While (El_Vector(i) < x) And (i < Limite_Superior) 22. i = i + 1 23. Wend 24. 25. While (x < El_Vector(j)) And (j > Limite_Inferior) 26. j = j - 1 27. Wend 28. 29. If i <= j Then 30. y = El_Vector(i) 31. El_Vector(i) = El_Vector(j)
5.

32. 33. 34.

El_Vector(j) = y i = i + 1 j = j - 1

35.

End If Wend

36.
37.

38. If Limite_Inferior < j Then Ordenar _Matriz El_Vector(), Limite_Inferior, j 40. If i < Limite_Superior Then Ordenar _Matriz El_Vector(), i, Limite_Superior 41. 42. End Sub 43. 44. 'carga valores aleatorios en el vec tor 45. Private Sub Command1_Click() 46. Dim i As Integer 47. Randomize 48. List1.Clear 49. 50. ReDim Vector(100) 51. 52. For i = 0 To 100 53. List1.AddItem Round(Rnd * 5 000) 54. ' Llena el array con los n meros 55. Vector(i) = Round(Rnd * 500 0) 56. Next 57. 58. Command1.Enabled = False 59. Command2.Enabled = True 60. End Sub 61. 62. 'Ordena la matriz y luego de ordena da los carga en el ListBox 63. Private Sub Command2_Click() 64. Dim i As Integer 65. List1.Clear 66.
39.

'Pasar el vector, y los lmites inferior y superior del mismo 68. Call Ordenar_Matriz(Vector, LBo und(Vector), UBound(Vector)) 69. 70. 'Agrega el vector ordenado al L istBox 71. For i = LBound(Vector) To UBoun d(Vector) 72. List1.AddItem Vector(i) 73. Next 74. 75. Command1.Enabled = True 76. Command2.Enabled = False 77. 78. End Sub 79. 80. 81. Private Sub Form_Load() 82. Command1.Caption = " Cargar Listbox con aleatorios " 83. Command2.Caption = " Ordenar Vector y cargarlo en ListBox " 84. Command2.Enabled = False 85. End Sub
67.

1 - QuickSort
Este ejemplo ordena un vector o array que se llena con nmeros aleatorios. Esos nmeros se visualizan en un control ListBox. Luego para ordenarlos se llama a una funcin llamada Ordenar. A esta funcin se le pasa el vector como parmetro. Por ltimo, una ves devuelto el vector ordenado, se recorre el mismo en un For-next y se agregan en un segundo ListBox

Colocar los siguiente controles como estn en la imagen:

Un control text1 que ser la cantidad de

elementos del vector a ordenar.

2 controles ListBox, El list1 carga el vector

desordenado con lo nmeros aleatorios. El List2 visualiza el resultado del vector ordenado

Dos CommandButton. El command1 Llena

el vector con nmeros aleatorios, el Command2 Ordena el vector.


Cdigo en un mdulo bas:
im vecMenor() As Long, vecMayor() As Long

Dim a, sl, pRight, pLeft, iEnd, Max, star, pos As Long

Public Sub ordenar2(elVector() As Long)

If Not entre Then pLeft = star pRight = iEnd pos = star entre = False End If

While elVector(pos) <= elVector(pRight) And (pos <> pRight) pRight = pRight - 1 Wend

If pos = pRight Then Exit Sub ElseIf elVector(pos) > elVector(pRight) Then Temp = elVector(pos) elVector(pos) = elVector(pRight)

elVector(pRight) = Temp pos = pRight End If

While elVector(pLeft) <= elVector(pos) And (pLeft <> pos) pLeft = pLeft + 1 Wend

If pos = pLeft Then Exit Sub ElseIf elVector(pLeft) > elVector(pos) Then Temp = elVector(pos) elVector(pos) = elVector(pLeft) elVector(pLeft) = Temp pos = pLeft

End If

ordenar2 elVector

End Sub

Public Function Ordenar(elVector() As Long) As Long()

ReDim vecMenor(UBound(elVector)) As Long ReDim vecMayor(UBound(elVector)) As Long

Max = 0 If UBound(elVector) > 1 Then Max = Max + 1 vecMenor(1) = 1 vecMayor(1) = UBound(elVector) End If

While Max <> 0 star = vecMenor(Max) iEnd = vecMayor(Max) Max = Max - 1

ordenar2 elVector

If star < pos - 1 Then Max = Max + 1 vecMenor(Max) = star vecMayor(Max) = pos - 1 End If

If pos + 1 < iEnd Then Max = Max + 1 vecMenor(Max) = pos + 1 vecMayor(Max) = iEnd End If Wend

Ordenar = elVector

End Function

Cdigo fuente en el formulario:


'Dim vector a ordenar Dim UnVector() As Long

Private Sub Command1_Click() Dim x As Long, i As Integer

List1.Clear List2.Clear

x = CInt(Text1)

ReDim UnVector(x) 'Llenamos el vector con nmeros aleatorios For i = 1 To x Randomize (x) UnVector(i) = (2500450 * Rnd) 'Agregamos los nmeros aleatorios al List List1.AddItem UnVector(i) Next Command1.Enabled = False Command2.Enabled = True End Sub

Private Sub Command2_Click()

'Pasamos a la funcin el Vector (la funcin devuelve el vector ordenado) UnVector = Ordenar(UnVector)

'Recorremos el vector ordenado y lo agregamos al List2 For i = 1 To UBound(UnVector) List2.AddItem UnVector(i) Next Command1.Enabled = True Command2.Enabled = False End Sub

3 - Ordenar archivos
Este ejemplo utiliza el mtodo de ordenacin QuickSort para ordenar un array que contiene cargado una lista de archivos. La ordenacin se realiza de acuerdo al tamao de los archivos en modo ascendente. El resultado se visualiza en un control TextBox Colocar en un formulario :

Una caja de texto : txtResult ( Colocar la

propiedad Multilinea en True )

Un botn : cmdSort

Vista previa del Form

Cdigo fuente
Texto planoImprimir Option Explicit 2. 3. ' ------------------------------------------------------------------------------------4. ' \\ -- Autor del ejemplo : Luciano Lod ola -- http://www.recursosvisualbasic.com .ar 5. ' \\ -- Nota. La funcin de ordenacin est adaptada de un ejemplo creado por Ra ndy Birch) 6. ' ------------------------------------------------------------------------------------7. 8. ' -- UDT para los datos 9. Private Type tData 10. sFileName As Stri ng ' -- Campo para el Nombre de l archivo 11. curFileSize As Curr ency ' -- Campo para el tamao ( expresado en bytes) 12. End Type 13.
1.

' -- Declarar matriz de datos ( alm acenar una lista de archivos) 15. Private the_array() As tDat a 16. 17. ' ------------------------------------------------------------------------------------18. ' \\ -- Funcin para ordenar el arr ay de acuerdo al campo numrico del UDT 19. ' -- Recibe el array, y el ndic e bajo y alto 20. ' ------------------------------------------------------------------------------------21. Private Sub QuickSort(the_array() A s tData, l As Currency, r As Currency) 22. 23. Dim i As Currency 24. Dim j As Currency 25. Dim X As Currency 26. Dim Y As tData 27. 28. i = l 29. j = r 30. X = the_array((l + r) / 2).c urFileSize 31. 32. While (i <= j) 33. While (the_array(i).cur FileSize < X And i < r) 34. i = i + 1 35. Wend 36. While (X < the_array(j).cur FileSize And j > l) 37. j = j - 1 38. Wend 39. 40. If (i <= j) Then 41.
14.

42. Y.curFileSize = the_arr ay(i).curFileSize 43. Y.sFileName = the_array (i).sFileName 44. 45. the_array(i).curFileSiz e = the_array(j).curFileSize 46. the_array(i).sFileName = the_array(j).sFileName 47. 48. the_array(j).curFileSiz e = Y.curFileSize 49. the_array(j).sFileName = Y.sFileName 50. 51. 52.
53. 54.

i = i + 1 j = j - 1 End If Wend If (l < j) Then Call QuickSort(the_array, l End If If (i < r) Then Call QuickSort(the_array, i End If End Sub

55.
56. 57.

, j)
58.

59.
60. 61.

, r)
62.

63.
64.

65. ' --------------------------------------------------------------------------------------67. ' \\ -- Botn para ordenar el array


66.

' --------------------------------------------------------------------------------------69. Private Sub cmdSort_Click() 70. 71. Dim sPath As String 72. 73. ' -- Abrir inputbox para el dir ectorio 74. sPath = InputBox("Escribir un d irectorio vlido", , Environ("windir")) 75. If Len(sPath) = 0 Then Exit Sub
68.

76. ' -- Cargar array ( por defecto enviar el directorio de windows ) 78. Call Fill_Array(sPath) 79. 80. ' -- Llamar a la funcin para o rdenar con QuickSort 81. Call QuickSort( _ 82. the_array, _ 83. LBound(the_array), _ 84. UBound(the_array)) 85. 86. ' -- Mostrar ahora el array en listbox, con los datos ordenados por el c ampo ( "Tamao de archivo") 87. Dim i As Long 88. 89. For i = LBound(the_array) To UB ound(the_array) 90. 'lstFiles.AddItem the_array (i).sFileName 91. txtResult.Text = txtResult. Text & the_array(i).sFileName & " -- " & the_array(i).curFileSize & " bytes" & vbN ewLine 92. txtResult.SelStart = Len(tx tResult)
77.

93.

Next End Sub

94.
95.

96. ' --------------------------------------------------------------------------------------98. ' \\ -- Inicio -- Cargar lista de a rchivos en el array 99. ' --------------------------------------------------------------------------------------100. Private Sub Fill_Array(sPath As Str ing) 101. 102. Dim sFileName As String 103. Dim lIndex As Long 104. 105. ' -- Comprobar la barra separad ora del path 106. If Right(sPath, 1) <> "\" Then sPath = sPath & "\" 107. ' -- Buscar el primer archivo d el directorio windows 108. sFileName = Dir(sPath & "*.*", vbArchive + vbHidden + vbNormal + vbReadO nly + vbSystem) 109. ' -- Redimensionar el array que contendr la lista de archivos a buscar e n windows 110. ReDim the_array(0) 111. 112. ' -- Cambiar puntero de espera del mouse 113. Me.MousePointer = vbHourglass 114. 115. ' -- Buscar ... 116. While sFileName <> "" 117. ' -- ndice del ltimo elem ento de la matriz
97.

118.

lIndex = UBound(the_array) 119. ' -- Cargar los datos en ar ray ( Tamao y nombre) 120. With the_array(lIndex) 121. .curFileSize = FileLen( sPath & sFileName) 122. .sFileName = sFileName 123. End With 124. ' -- redimensionar la matri z para el prximo elemento 125. ReDim Preserve the_array(lI ndex + 1) 126. ' -- Seguir buscando mas ar chivos 127. sFileName = Dir 128. Wend 129. ' -- Si hay mas de un archivo, entonces eliminar el ltimo ya que es un elemento vaco 130. If UBound(the_array) > 0 Then 131. ReDim Preserve the_array(UB ound(the_array) - 1) 132. End If 133. 134. ' -- Fin 135. Me.MousePointer = vbDefault 136. Exit Sub 137. error_handler: 138. MsgBox Err.Description, vbCriti cal 139. Me.MousePointer = vbDefault 140. End Sub 141. 142. Private Sub Form_Load() 143. cmdSort.Caption = "Cargar y Ord enar" 144. End Sub

Ordenar registros archivo de texto

de

un

El siguiente ejemplo es similar al anterior, y lo que hace es leer un archivo de texto que contiene registros ( un CVS delimitado por comas ). Este contiene dos campos : Nombre de producto y Precio de producto. Luego de leer los registros que se encuentran desordenados, se cargan todos ellos en un vector para poder ordenarlos con QuickSort de acuerdo al campo Precio. Por ltimo, una vez finalizada la ordenacin, se cargan los registros en un grid

Ejemplo 1 - Colocar un control Microsoft FlexGrid : MsFlexGrid1 2 - Botn : CmdSort 3 - Crear un archivo en al App.path llamado test.txt con dos campos ( Producto y precio ) El archivo contiene la siguiente estructura ( delimitado por el caracter punto y coma ) por ejemplo Producto Producto Producto Producto Producto Producto 1;130,65 2;76,85 3;16,35 4;98,28 5;1000,22 6;14,45

Producto Producto Producto Producto Producto Producto Producto Producto Producto

7;154,25 8;163,15 9;18,75 10;123,95 11;1,20 12;3,35 13;3,65 14;33,28 15;93,23

Cdigo fuente
Texto planoImprimir Option Explicit 2. 3. ' ------------------------------------------------------------------------------------4. ' \\ -- Autor del ejemplo : Luciano Lod ola -- http://www.recursosvisualbasic.com .ar 5. ' \\ -- Nota. La funcin de ordenacin est adaptada de un ejemplo creado por Ra ndy Birch)
1.

' ------------------------------------------------------------------------------------7. 8. ' -- UDT para los datos 9. Private Type tData 10. s_Nombre_Producto As String ' -- Campo para el No mbre del producto 11. cur_Precio_Producto As Currency ' -- Campo para el pr ecio del producto 12. End Type 13. 14. ' -- Declarar matriz de datos para almacenar los registros del archivo 15. Private the_array() As tDat a 16. 17. ' ------------------------------------------------------------------------------------18. ' \\ -- Funcin para ordenar los re gistros de acuerdo al precio de cada prod ucto 19. ' ------------------------------------------------------------------------------------20. Private Sub QuickSort(the_array() A s tData, l As Currency, r As Currency) 21. 22. Dim i As Currency 23. Dim j As Currency 24. Dim X As Currency 25. Dim Y As tData 26. 27. i = l 28. j = r 29. X = the_array((l + r) / 2).c ur_Precio_Producto
6.

30. While (i <= j) 32. While (the_array(i).cur _Precio_Producto < X And i < r) 33. i = i + 1 34. Wend 35. While (X < the_array(j).cur _Precio_Producto And j > l) 36. j = j - 1 37. Wend 38. 39. If (i <= j) Then 40. 41. Y.cur_Precio_Producto = the_array(i).cur_Precio_Producto 42. Y.s_Nombre_Producto = t he_array(i).s_Nombre_Producto 43.
31.

44. the_array(i).cur_Precio _Producto = the_array(j).cur_Precio_Produ cto 45. the_array(i).s_Nombre_P roducto = the_array(j).s_Nombre_Producto 46. 47. the_array(j).cur_Precio _Producto = Y.cur_Precio_Producto 48. the_array(j).s_Nombre_P roducto = Y.s_Nombre_Producto 49. 50. 51.
52. 53.

i = i + 1 j = j - 1 End If Wend If (l < j) Then Call QuickSort(the_array, l

54.
55. 56.

, j)

57.

End If If (i < r) Then Call QuickSort(the_array, i End If End Sub

58.
59. 60.

, r)
61.

62.
63.

64. ' --------------------------------------------------------------------------------------66. ' \\ -- Botn para comenzar la orde nacin 67. ' --------------------------------------------------------------------------------------68. Private Sub cmdSort_Click() 69. 70. ' -- Cargar los registros del a rchivo en el array 71. If Fill_Array(App.Path & "\test .txt") Then 72. ' -- Llamar a la funcin pa ra ordenar con QuickSort 73. Call QuickSort(the_array, L Bound(the_array), UBound(the_array)) 74. 75. ' -- Cargar los datos orden ados en el Grid ( Microsoft Flexgrid ) 76. Dim i As Variant 77. With MSFlexGrid1 78. Call pvConfig_FlexGrid 79. For i = LBound(the_arra y) To UBound(the_array) 80. ' -- Agregar produc to y precio ordenados en forma ascendente
65.

81.

.AddItem _

CStr(the_array( i).s_Nombre_Producto) & vbTab & _ 83. FormatCurrency( the_array(i).cur_Precio_Producto) 84. Next 85. End With 86. End If 87. 88. End Sub 89. 90. ' --------------------------------------------------------------------------------------91. ' \\ Leer los registros del archivo y cargarlos en la matriz para poder orden arlos 92. ' --------------------------------------------------------------------------------------93. Private Function Fill_Array(sFileNa me As String) As Boolean 94. 95. On Error GoTo error_handler 96. 97. Dim nFileNumber As Integer 98. Dim lIndex As Long 99. Dim sLine As String 100. Dim arrLine() As String 101. 102. ' -- Buscar un nmero de archiv o libre 103. nFileNumber = FreeFile 104. 105. Open sFileName For Input As #nF ileNumber 106. 107. ' -- Redimensionar el array que contendr la lista de archivos a buscar e n windows 108. ReDim the_array(0)
82.

109.
110.

' -- Cambiar puntero de espera Me.MousePointer = vbHourglass

del mouse
111.

112. ' -- Buscar ... 114. While Not EOF(nFileNumber) 115. ' -- ndice del ltimo elem ento de la matriz 116. lIndex = UBound(the_array) 117. 118. Line Input #nFileNumber, sL ine 119. 120. arrLine = Split(sLine, ";")
113.

121. ' -- Cargar los datos en ar ray ( Tamao y nombre) 123. With the_array(lIndex) 124. .cur_Precio_Producto = CCur(arrLine(1)) 125. .s_Nombre_Producto = ar rLine(0) 126. End With 127. ' -- redimensionar la matri z para el prximo elemento 128. ReDim Preserve the_array(lI ndex + 1) 129. Wend 130. 131. ' -- Cerrar el archivo 132. Close #nFileNumber 133. 134. ' -- Si hay mas de un archivo, entonces eliminar el ltimo ya que es un elemento vaco 135. If UBound(the_array) > 0 Then 136. ReDim Preserve the_array(UB ound(the_array) - 1)
122.

137. 138.

End If Fill_Array = True

139. ' -- Fin 141. Me.MousePointer = vbDefault 142. Exit Function 143. error_handler: 144. MsgBox Err.Description, vbCriti cal 145. Me.MousePointer = vbDefault 146. Close 147. End Function 148. ' --------------------------------------------------------------------------------------149. ' \\ Configurar opciones del Grid 150. ' --------------------------------------------------------------------------------------151. Private Sub pvConfig_FlexGrid() 152. ' -- Configurar encabezado del Grid 153. With MSFlexGrid1 154. .Clear ' -- Borrar datos pr evios del Grid 155. .FixedCols = 0 156. .FormatString = "NombreProd ucto|Precio del Producto" 157. ' -- Ancho de las columnas 158. .ColWidth(0) = 3500 159. .ColWidth(1) = 2500 160. .Rows = 1 161. End With 162. End Sub 163. 164. Private Sub Form_Load() 165. Call pvConfig_FlexGrid 166. cmdSort.Caption = "Cargar y Ord enar" 167. End Sub
140.

You might also like