Ver Mensaje Individual
  #13 (permalink)  
Antiguo 24/11/2011, 06:19
carnero
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: revision codigo: sacar duplicado

Cita:
Iniciado por pkj Ver Mensaje
Por muy bien que esten los códigos, (el mio solo tiene un ligero fallo), seguirás teniendo problemas mientras no cambies de sistema.

El fallo está en que un listbox solo admite 32767 elementos, y con solo que añadas 1 mas, los valores de listcount empiezan a ser negativos. De ese modo cuando intentas correr la sub, como el count es <0, no se hace nada y se sale de la sub. Por eso no te funciona con muchos elementos.


PD: De hecho lo he revisado y además de corregir el fallo que tenía lo he hecho muchisimo mas rápido:
PD2: Para solucionar el problema de la cantidad de elementos lo que puedes hacer es sumarlos segun cargas las listas y asi no habra fallos siempre que los codigos de articulo no superen los 32766 elementos.

Código vb:
Ver original
  1. Private Sub Command1_Click()
  2.   CargarTabla
  3. End Sub
  4.  
  5. Private Sub CargarTabla()
  6.   Dim f As Long
  7.   For f = 1 To 125767  ' MAXIMOS ELEMENTOS = NO HAY LIMITE
  8.    List1.AddItem Int(Rnd * 15) + 1 ' MAXIMOS CODIGOS = 32766
  9.    List2.AddItem Int(Rnd * 15) + 1
  10.     List3.AddItem Int(Rnd * 15) + 1
  11.     List4.AddItem Int(Rnd * 15) + 1
  12.     List5.AddItem Int(Rnd * 15) + 1
  13.     QuitaDup
  14.   Next f
  15. End Sub
  16.  
  17. Private Sub QuitaDup()
  18.   Dim X As Long, I As Long, REINICIAR As Integer
  19.   'MsgBox List1.ListCount
  20.  REINICIAR = 1
  21.   Do Until REINICIAR = 0
  22.     REINICIAR = 0
  23.     For I = 0 To List1.ListCount - 2
  24.       For X = List1.ListCount - 1 To I + 1 Step -1
  25.         If List1.List(I) = List1.List(X) Then ' SI TIENEN EL MISMO CODIGO SE SUMAN
  26.          List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  27.           List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  28.           List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  29.           List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  30.           List1.RemoveItem X
  31.           List2.RemoveItem X
  32.           List5.RemoveItem X
  33.           List3.RemoveItem X
  34.           List4.RemoveItem X
  35.           REINICIAR = 1
  36.           'Exit For ' Y SE REINICIA EL TRABAJO PARA NO CONTAR CON LA LINEA ELIMINADA
  37.        End If
  38.       Next X
  39.       DoEvents
  40.       If REINICIAR = 1 Then Exit For
  41.     Next I
  42.   Loop
  43.  
  44. End Sub

Claro que, de este modo, la sub QuitaDup puede ser reemplazada por una que solo compare el ultimo elemento añadido a la lista, y sería mucho más rápido.


Código vb:
Ver original
  1. Private Sub Form_Load()
  2.   CargarTabla
  3. End Sub
  4.  
  5. Private Sub CargarTabla()
  6.   Dim F As Long
  7.   For F = 1 To 112767  ' MAXIMOS ELEMENTOS = NO HAY LIMITE ' 112767 ELEMENTOS CARGADOS Y SUMADOS EN 12 SEGUNDOS (EN MI PC)
  8.    List1.AddItem Int(Rnd * 15) + 1 ' MAXIMOS CODIGOS = 32766
  9.    List2.AddItem Int(Rnd * 15) + 1
  10.     List3.AddItem Int(Rnd * 15) + 1
  11.     List4.AddItem Int(Rnd * 15) + 1
  12.     List5.AddItem Int(Rnd * 15) + 1
  13.     QuitaDup
  14.   Next F
  15. End Sub
  16.  
  17. Private Sub QuitaDup()
  18.   Dim I As Long, X As Long
  19.   X = List1.ListCount - 1
  20.   For I = 0 To List1.ListCount - 2
  21.     If List1.List(I) = List1.List(X) Then
  22.       List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  23.       List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  24.       List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  25.       List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  26.       List1.RemoveItem X
  27.       List2.RemoveItem X
  28.       List3.RemoveItem X
  29.       List4.RemoveItem X
  30.       List5.RemoveItem X
  31.       Exit For
  32.     End If
  33.   Next I
  34. End Sub
no tenia idea que tenia limite el list, la mejor solucion sera no usar el list

con que componente puedo hacer lo mismo y no tener estos problemas??
gracias otraves ;)