Ayuda posible con ListBox?

02/12/2003 - 23:12 por msnews.microsoft.com | Informe spam
Hola amigos tengo un problema pero quizas no haya mas solucion:

1.- 1 LISTBOX
2.- Agrego articulos con consulta SQL, (desde base de datos de mdb)
3.- Cantidad de articulos: 3500

Historia breve:
Originalmente hacia el ADDITEM en una COMBOBOX lo cual tardaba
aproximandamente (en agregar los 3mil articulos) 3 segundos, en red,
localmente era 1 segundo.
Ahora es necesario que haga el ADDITEM en una LISTBOX.

Problema:
TIEMPO que tarda en agregar el ADDITEM los 3mil articulos a la LISTBOX mas o
menos 10 segundos en red, con pentium 3 10/100.

Alguna idea para agilizar esto??
podria ser esto?:
1.- que hay una menera de hacer mas rapido el ADDITEM a una listobox.
2.- o cambiar y usar COMBOBOX y que haya una manera de mostrar desplegada la
combobox por default (el usuario no usa mouse), podria ser algo relacionado
con DROP, se podra?

este es el codigo:

ListBox1.ColumnCount = 3
With RecrdSet
While Not .EOF
ListBox1.AddItem
ListBox1.List(cont, 0) = RecrdSet!DESCRIPCION
ListBox1.List(cont, 1) = RecrdSet!EXISTENCIA
ListBox1.List(cont, 2) = Format(RecrdSet!PVENT, "CURRENCY")
cont = cont + 1
.MoveNext
Wend
End With
ListBox1.TextColumn = 1


Saludos a todos y gracias por su cooperacion
PD se aceptan sugerencias de todas!

_____________________________
Rodrigo
_____________________________

Preguntas similare

Leer las respuestas

#1 Luis Garcia
03/12/2003 - 09:36 | Informe spam
"msnews.microsoft.com" escribió en...
Problema:
TIEMPO que tarda en agregar el ADDITEM los 3mil articulos a la LISTBOX mas


o
menos 10 segundos en red, con pentium 3 10/100.

Alguna idea para agilizar esto??
PD se aceptan sugerencias de todas!



Prueba antes de cargar los datos de poner Visible = False del listbox,
y cuando finalizes, volver a ponerlo a True. En VB funciona.

Saludines
Respuesta Responder a este mensaje
#2 msnews.microsoft.com
05/12/2003 - 01:05 | Informe spam
Pues no, funciona igual no hay cambio en la rapidez, alguna otra idea?


_____________________________
Rodrigo
_____________________________

"Luis Garcia" escribió en el mensaje
news:uqhJ$
"msnews.microsoft.com" escribió en...
> Problema:
> TIEMPO que tarda en agregar el ADDITEM los 3mil articulos a la LISTBOX


mas
o
> menos 10 segundos en red, con pentium 3 10/100.
>
> Alguna idea para agilizar esto??
> PD se aceptan sugerencias de todas!

Prueba antes de cargar los datos de poner Visible = False del listbox,
y cuando finalizes, volver a ponerlo a True. En VB funciona.

Saludines


Respuesta Responder a este mensaje
#3 Héctor Miguel
06/12/2003 - 02:13 | Informe spam
hola, Rodrigo !

mensaje 1
Problema: ... TIEMPO que tarda en agregar el ADDITEM los 3mil articulos a la LISTBOX
mas o menos 10 segundos en red, con pentium 3 10/100. [...]



mensaje 2
Prueba antes de cargar los datos de poner Visible = False del listbox,
y cuando finalizes, volver a ponerlo a True. En VB funciona.





mensaje 3
Pues no, funciona igual no hay cambio en la rapidez, alguna otra idea?







existe una manera 'express' de cargar datos a listboxes usando variables de matriz
aunque el procedimiento ['engañosamente'] pareciera NO 'tener' NADA de 'express' :))
1.- 'asignar' a una variable de matriz ['tipo' Variant] los valores de un rango de celdas
2.- 'cargar' la listbox usando la propiedad 'List' y 'llenandola' CON la variable de matriz
- esto REQUIRE 'bajar' -primero- a un rango la consulta antes de llenar la listbox
- usando la propiedad CopyFromRecordSet de un objeto 'Range' => XL2000 o 'superior' < - una vez EN la listbox, el rango se puede borrar [inclusive puede 'estar' en una hoja 'oculta']
- lo que 'da la apariencia' de TRIPLE labor: 'escribir' en el rango + 'escribir' en la listbox + borrar :((
- todo el proceso [consulta, rango, lista, presentar el formulario, etc.] en las pruebas que efectue...
- le tomo ... 1 segundo con 4,000 registros y 3 campos [columnas] =>P-3 @800 10/100< - obviamente la red NO 'internivo' y la consulta fue a un archivo de texto con formato csv :))
3.- de hecho, use una hoja oculta [que se llama 'Oculta'] y le 'puse' los tiempos a la hoja 'activa'
4.- sera mejor 'recortar' la consulta a SOLO los campos 'necesarios' :))
5.- las 'adaptaciones' para tu codigo serian +/- las siguientes:
a) incluir una variable [p.e. Dim Listado] =>una variable declarada SIN tipo es por omision del tipo Variant< b) usar una hoja oculta, cuyo 'unico' fin es 'contener' [temporalmente] el 'RecordSet' para la variable y la listbox
c) 'sustituir' el llenado de la listbox usando 'AddItem' y el 'MoveNext', etc. por...
[... ...]
With Worksheets("Tu Hoja Oculta")
.Range("a1").CopyFromRecordset RecrdSet
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
Listado = .Value
.ClearContents
End With
End With
ListBox1.ColumnCount = RecrdSet.Fields.Count
ListBox1.List = Listado
[... ...]

saludos,
hector.
_______ el codigo 'probado' _______
Sub ConsultaEnArchivoDeTexto()
Range("a1") = Now
Dim Conexion As ADODB.Connection, Registros As ADODB.Recordset, _
Directorio As String, Archivo As String, Consulta As String, Listado As Variant
Directorio = "C:\Mis documentos"
Archivo = "ConsultaSQL.csv"
Consulta = "SELECT * FROM " & Archivo
Set Conexion = New ADODB.Connection
Conexion.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=" & Directorio & ";Extensions=asc,csv,tab,txt;"
Set Registros = New ADODB.Recordset
Registros.Open Consulta, Conexion, adOpenForwardOnly, adLockReadOnly, adCmdText
With Worksheets("Oculta")
.Range("a1").CopyFromRecordset Registros
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
Listado = .Value
.ClearContents
End With
End With
With UserForm1
.ListBox1.ColumnCount = Registros.Fields.Count
.ListBox1.List = Listado
.Show vbModeless
End With
Registros.Close: Set Registros = Nothing
Conexion.Close: Set Conexion = Nothing
Range("a2") = Now
End Sub
Respuesta Responder a este mensaje
#4 msnews.microsoft.com
08/12/2003 - 17:54 | Informe spam
Ok Hector haber voy a estudiarlo y a tratar de implementarlo, te comento mas
al rato, gracias.


_____________________________
Rodrigo
_____________________________

"Héctor Miguel" escribió en el mensaje
news:
hola, Rodrigo !

mensaje 1
> Problema: ... TIEMPO que tarda en agregar el ADDITEM los 3mil articulos


a la LISTBOX
> mas o menos 10 segundos en red, con pentium 3 10/100. [...]

mensaje 2
>> Prueba antes de cargar los datos de poner Visible = False del listbox,
>> y cuando finalizes, volver a ponerlo a True. En VB funciona.

mensaje 3
>>> Pues no, funciona igual no hay cambio en la rapidez, alguna otra idea?

existe una manera 'express' de cargar datos a listboxes usando variables


de matriz
aunque el procedimiento ['engañosamente'] pareciera NO 'tener' NADA de


'express' :))
1.- 'asignar' a una variable de matriz ['tipo' Variant] los valores de un


rango de celdas
2.- 'cargar' la listbox usando la propiedad 'List' y 'llenandola' CON la


variable de matriz
- esto REQUIRE 'bajar' -primero- a un rango la consulta antes de


llenar la listbox
- usando la propiedad CopyFromRecordSet de un objeto 'Range' =>


XL2000 o 'superior' <> - una vez EN la listbox, el rango se puede borrar [inclusive puede
'estar' en una hoja 'oculta']
- lo que 'da la apariencia' de TRIPLE labor: 'escribir' en el rango


+ 'escribir' en la listbox + borrar :((
- todo el proceso [consulta, rango, lista, presentar el formulario,


etc.] en las pruebas que efectue...
- le tomo ... 1 segundo con 4,000 registros y 3 campos [columnas]


=>P-3 @800 10/100<> - obviamente la red NO 'internivo' y la consulta fue a un archivo de
texto con formato csv :))
3.- de hecho, use una hoja oculta [que se llama 'Oculta'] y le 'puse' los


tiempos a la hoja 'activa'
4.- sera mejor 'recortar' la consulta a SOLO los campos 'necesarios'


:))
5.- las 'adaptaciones' para tu codigo serian +/- las siguientes:
a) incluir una variable [p.e. Dim Listado] =>una variable declarada


SIN tipo es por omision del tipo Variant<> b) usar una hoja oculta, cuyo 'unico' fin es 'contener'
[temporalmente] el 'RecordSet' para la variable y la listbox
c) 'sustituir' el llenado de la listbox usando 'AddItem' y el


'MoveNext', etc. por...
[... ...]
With Worksheets("Tu Hoja Oculta")
.Range("a1").CopyFromRecordset RecrdSet
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
Listado = .Value
.ClearContents
End With
End With
ListBox1.ColumnCount = RecrdSet.Fields.Count
ListBox1.List = Listado
[... ...]

saludos,
hector.
_______ el codigo 'probado' _______
Sub ConsultaEnArchivoDeTexto()
Range("a1") = Now
Dim Conexion As ADODB.Connection, Registros As ADODB.Recordset, _
Directorio As String, Archivo As String, Consulta As String,


Listado As Variant
Directorio = "C:\Mis documentos"
Archivo = "ConsultaSQL.csv"
Consulta = "SELECT * FROM " & Archivo
Set Conexion = New ADODB.Connection
Conexion.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=" & Directorio & ";Extensions=asc,csv,tab,txt;"
Set Registros = New ADODB.Recordset
Registros.Open Consulta, Conexion, adOpenForwardOnly, adLockReadOnly,


adCmdText
With Worksheets("Oculta")
.Range("a1").CopyFromRecordset Registros
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
Listado = .Value
.ClearContents
End With
End With
With UserForm1
.ListBox1.ColumnCount = Registros.Fields.Count
.ListBox1.List = Listado
.Show vbModeless
End With
Registros.Close: Set Registros = Nothing
Conexion.Close: Set Conexion = Nothing
Range("a2") = Now
End Sub


Respuesta Responder a este mensaje
#5 msnews.microsoft.com
08/12/2003 - 20:38 | Informe spam
Perfecto mi buen Hector estas lineas de abajo son muy interesantes, es la
clave, haces un matriz de todo el contenido de las celdas que tienen valor,
hacia la derecha y hacia abajo. Enseguida metes la matriz a la variable
listado, luego calculas las columnas para la listbox, en base a los campos
del recordset, y enseguida vacias listado en listbox, pero lo que no imagine
es que se pudiera hacer >Range(.Range("a1"),
.Range("a1").End(xlToRight).End(xlDown)), y meternlo a una variable como
matriz, y funciona excelente y muy rapido, creo que esto es finalmente la
solucion, te lo agrdezco mucho saludos!!!!!!!!!!!!!

With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
Listado = .Value





_____________________________
Rodrigo
_____________________________

"Héctor Miguel" escribió en el mensaje
news:
hola, Rodrigo !

mensaje 1
> Problema: ... TIEMPO que tarda en agregar el ADDITEM los 3mil articulos


a la LISTBOX
> mas o menos 10 segundos en red, con pentium 3 10/100. [...]

mensaje 2
>> Prueba antes de cargar los datos de poner Visible = False del listbox,
>> y cuando finalizes, volver a ponerlo a True. En VB funciona.

mensaje 3
>>> Pues no, funciona igual no hay cambio en la rapidez, alguna otra idea?

existe una manera 'express' de cargar datos a listboxes usando variables


de matriz
aunque el procedimiento ['engañosamente'] pareciera NO 'tener' NADA de


'express' :))
1.- 'asignar' a una variable de matriz ['tipo' Variant] los valores de un


rango de celdas
2.- 'cargar' la listbox usando la propiedad 'List' y 'llenandola' CON la


variable de matriz
- esto REQUIRE 'bajar' -primero- a un rango la consulta antes de


llenar la listbox
- usando la propiedad CopyFromRecordSet de un objeto 'Range' =>


XL2000 o 'superior' <> - una vez EN la listbox, el rango se puede borrar [inclusive puede
'estar' en una hoja 'oculta']
- lo que 'da la apariencia' de TRIPLE labor: 'escribir' en el rango


+ 'escribir' en la listbox + borrar :((
- todo el proceso [consulta, rango, lista, presentar el formulario,


etc.] en las pruebas que efectue...
- le tomo ... 1 segundo con 4,000 registros y 3 campos [columnas]


=>P-3 @800 10/100<> - obviamente la red NO 'internivo' y la consulta fue a un archivo de
texto con formato csv :))
3.- de hecho, use una hoja oculta [que se llama 'Oculta'] y le 'puse' los


tiempos a la hoja 'activa'
4.- sera mejor 'recortar' la consulta a SOLO los campos 'necesarios'


:))
5.- las 'adaptaciones' para tu codigo serian +/- las siguientes:
a) incluir una variable [p.e. Dim Listado] =>una variable declarada


SIN tipo es por omision del tipo Variant<> b) usar una hoja oculta, cuyo 'unico' fin es 'contener'
[temporalmente] el 'RecordSet' para la variable y la listbox
c) 'sustituir' el llenado de la listbox usando 'AddItem' y el


'MoveNext', etc. por...
[... ...]
With Worksheets("Tu Hoja Oculta")
.Range("a1").CopyFromRecordset RecrdSet
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
Listado = .Value
.ClearContents
End With
End With
ListBox1.ColumnCount = RecrdSet.Fields.Count
ListBox1.List = Listado
[... ...]

saludos,
hector.
_______ el codigo 'probado' _______
Sub ConsultaEnArchivoDeTexto()
Range("a1") = Now
Dim Conexion As ADODB.Connection, Registros As ADODB.Recordset, _
Directorio As String, Archivo As String, Consulta As String,


Listado As Variant
Directorio = "C:\Mis documentos"
Archivo = "ConsultaSQL.csv"
Consulta = "SELECT * FROM " & Archivo
Set Conexion = New ADODB.Connection
Conexion.Open _
"Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=" & Directorio & ";Extensions=asc,csv,tab,txt;"
Set Registros = New ADODB.Recordset
Registros.Open Consulta, Conexion, adOpenForwardOnly, adLockReadOnly,


adCmdText
With Worksheets("Oculta")
.Range("a1").CopyFromRecordset Registros
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
Listado = .Value
.ClearContents
End With
End With
With UserForm1
.ListBox1.ColumnCount = Registros.Fields.Count
.ListBox1.List = Listado
.Show vbModeless
End With
Registros.Close: Set Registros = Nothing
Conexion.Close: Set Conexion = Nothing
Range("a2") = Now
End Sub


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida