Jump to content

Error en Userform, Error en El Evento Exit de un ListBox


Recommended Posts

Muy Buen Dia, agradesco su ayuda.

El problema es que tengo un UserForm con 40 ListBox, en los cuales con el evento Exit deben de ir Armando un "Where" que quiero usar para SQL, los primeros 20 ListBox lo hacen perfectamente, pero los Siguientes 20, no hace nada cuando se cumple el evento.

Estube revisando paso a paso y primero cierra el UserForm y al final se va al Exit del Listbox(21-40) correspondiente.

Este es el Codigo de ListBox1, que funciona bien.

Private Sub F_1__Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim F As New Collection
For i = 0 To F_1_.ListCount - 1
If F_1_.Selected(i) = True Then F.Add ("Base.A1 = '" & F_1_.List(i) & "'")
Next i
If F.Count <> 0 Then
If F.Count = 1 Then Where1 = " AND ( " & F(1) & ")"
If F.Count >= 2 Then
T = ""
For i = 2 To F.Count
T = T & " OR " & F(i)
Next i
Where1 = " AND ( " & F(1) & T & ")"
End If
If Where1 <> "" Then Where = Where & Where1
End If

If F.Count <> 0 Then
T = L_1_.Caption & ": "
T = T & Replace(Replace(F(1), "Base.A1 = '", ""), "'", "")
If F.Count >= 2 Then
For i = 2 To F.Count
T = T & ", " & Replace(Replace(F(i), "Base.A1 = '", ""), "'", "")
Next i
End If
If TextoArticulo = "" Then
TextoArticulo = "Filtros de Articulo= " & T
Else
TextoArticulo = TextoArticulo & "- " & T
End If
End If
End Sub[/CODE]

Este es el codigo del ListBox21, que ya no funciona.

[CODE]Private Sub F_21__Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim F As New Collection
For i = 0 To F_21_.ListCount - 1
If F_21_.Selected(i) = True Then F.Add ("Base.A21 = '" & F_21_.List(i) & "'")
Next i
If F.Count <> 0 Then
If F.Count = 1 Then Where1 = " AND ( " & F(1) & ")"
If F.Count >= 2 Then
T = ""
For i = 2 To F.Count
T = T & " OR " & F(i)
Next i
Where1 = " AND ( " & F(1) & T & ")"
End If
If Where1 <> "" Then Where = Where & Where1
End If
If F.Count <> 0 Then
T = L_21_.Caption & ": "
T = T & Replace(Replace(F(1), "Base.A21 = '", ""), "'", "")
If F.Count >= 2 Then
For i = 2 To F.Count
T = T & ", " & Replace(Replace(F(i), "Base.A21 = '", ""), "'", "")
Next i
End If
If TextoArticulo = "" Then
TextoArticulo = "Filtros de Articulo= " & T
Else
TextoArticulo = TextoArticulo & "- " & T
End If
End If
End Sub
[/CODE]

Saludos, espero me puedan ayudar, ya busque mucho y no encuentro el error.

Link to comment
Share on other sites

Con apenas unas líneas puedes resolver tu problema sin necesidad de programar un proceso para cada listbox, ya que con uno solo es suficiente.

Abre el adjunto, selecciona los valores que quieras, y pulsa el botón "Play azul".

Para borrar la selección pulsa el botón "Cancel rojo"

40 listbox.xls

Link to comment
Share on other sites

Muchas Gracias, me ayudo bastante el ejemplo, ya que tenia tiempo intentando hacer algo parecido pero no habia encontrado la forma, tengo una duda sobre un comando de sql en el mismo archivo, espero no romper las reglas. Ya que lo que cargo en cada uno de los listbox lo saco de una base en access, pero soy novato en esto, y uso el siguiente codigo para traer los datos a una hoja y posteriormente los cargo al listbox correspondiente, y luego con el mismo codigo lo borro, eh intentado traerlo desde la base con el comando sql a un array o algo en memoria, para posteriormete incluirlos en el listbox. Disculpa las molestias, soy algo novato en esto. Saludos.

Codigo para traer los datos a cargar en un listbox. Creo que cometo el mismo error que en el anterior, ya que tengo un Sub para cada carga. Espero me puedas ayudar y de verdad mil gracias.

Sub F1()
ListBox1.Clear
If Where <> "" Then Espacio = Chr(13) & "" & Chr(10)
Sheets("Proceso").Select
Range("A:B").Clear
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DSN=MS Access Database;DBQ=" & Archivo & ";DefaultDir=" & Ruta & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;", Destination:=Range("$A$1")).QueryTable
.CommandText = _
"SELECT DISTINCT Base.A1" & Chr(13) & "" & Chr(10) & _
"FROM `" & Archivo & "`.Base Base" & Chr(13) & "" & Chr(10) & _
Where & Esp & _ 'Aqui lo puse asi, para que sea actualizable, y se cargen solo los datos aplicables.
"ORDER BY Base.A1 ASC"
.ListObject.DisplayName = "Tabla"
.Refresh BackgroundQuery:=False
End With
ActiveSheet.ListObjects("Tabla").Unlist
If Cells(1, 3) > 1 Then 'Aqui hago una comprobacion para saber que si trajo datos.
For i = 2 To Cells(1, 3)
ListBox1.AddItem Cells(i, 1).Value 'Aqui los agrego al ListBox
Next i
End If
End Sub[/CODE]

Mi duda es si puedo cargar todos de una sola vez, y cuando cambie la seleccion en un listbox se actualicen los demas, sin tener que meterlos a una hoja y de ahi cargarlos, ya que de la forma que yo lo hago tarda mucho en actualizar todos los listbox, es por eso que yo solo los actualizaba con el evento doble clic, pero estaria perfecto poderlos cargar en el cambio de seleccion.

Saludos.

Link to comment
Share on other sites

Perdon por la tardanza, desde ayer estaba intentando contestar pero sin exito.

Muy Bien. Mi archivo practicamente esta muy enredado, ya que queria asegurarme que de la informacion bien y luego depurarlo y darle algo de formato, pero te explico, Son 2 archivos, uno es la base, y esta hecha en access, y el otro es el que yo denomino reporteador, que es un excel, en el cual tengo el formulario y despues de contestar el formulario quiero traer los datos a una hoja. La base se conforma asi, con su respectivo Ejemplo:

Año: 2011

Mes: 1

ID_Mes: 201101

ID_Mes2: 01_Enero

ID_Sem: 201103

ID_Sem2: 03 de 2011

ID_Articulo: 18811575

Sku: 188115577

Ean: 7506278600377

Descripcion: Bota Michelin Hi Hydroedge

Detalle: Bota, Hi Hydroedge, Cafe Medio, 26

A1: Michelin

A2: Bota

A3: Estilo

A4: Cafe Medio

A5: Talla

A6: 67

A7: Primavera-Verano

A8: Moda

A9: Activo

A10: 43

A11:

A12:

A13:

A14:

A15:

A16:

A17:

A18:

A19:

A20:

Precio: 1999

Costo: 982

Alta: 17/05/2011

ID_Tienda: 106

A21: 106_Lindavista

A22:

A23:

A24:

A25:

A26:

A27:

A28:

A29:

A30:

A31:

A32:

A33:

A34:

A35:

A36:

A37:

A38:

A39:

A40:

InvPza: 1

InvCto: 982.27

InvVta: 1378.62

VtaPza: 1

VtaCto: 982.27

VtaNta: 1378.62

VtaBta: 1395.10

Lo que yo deseo hacer, es cargar el formulario, poder seleccionar si quiero el reporte Semanal o Mensual, despues que me pida 4 Datos a para formar mi rango de fechas, que serian AñoInicial, MesInicial(o SemInicial), AñoFinal, MesFinal(o SemFinal). Ya que tengo el Rango de Fechas poder seleccionar filtros de Articulo o Tienda, con opcion de multiseleccion. Los Campos del Articulo Son del A1 al A20, y los de Tienda del A21 al A40. Tambien quiero poder seleccionar un Rango de Precios, Costo, o Alta; en el cual pueda poner entre Tal Dato y Tal Dato Respectivamente, y por ultimo con un boton de generar, traer los datos a una hoja de excel, para poder trabajar con formulas en excel. Uno de los detalles, es que quiero que cuando aga seleccion en alguno de los filtros, los demas se actualicen y solo me muestre los aplicables.

En los archivos adjuntos esta un poco confuso, pero espero entiendas el punto de lo que intento hacer. Ya lo trabaje pero soy algo novato y hay muchas cosas que creo que ago de la manera incorrecta, espero me puedas ayudar y muchas gracias, me ha servido mucho lo anterior, si puedo pagartelo de alguna forma, no dudes en decirmelo.

Te envio un link con los archivos, ya que superan el limite permitido

http://dl.dropbox.com/u/63196918/Pruebas/Base.accdb

http://dl.dropbox.com/u/63196918/Pruebas/Reporte%20V3.xlsm

Link to comment
Share on other sites

Pues si, algo confuso está.

Para empezar hablas de datos de la tienda A21 a A40, cuando en la base de datos estas columnas están como T1 a T20.

Voy a prepararte una consulta tipo a la base de satos y luego tu la adaptas a tus necesidades.

- - - - - Mensaje combinado - - - - -

Hola:

Te adjunto un ejemplo de como acceder a la base de datos y cargar las listas con los datos para seleccionar.

He utilizado ADO para conectar Excel con Access. (Es un procedimiento de lo mas habitual para conectarse con bases de datos SQL)

Lo he hecho para los datos del Artículo (Columnas A1 a A20), supongo que no tendrás problemas para añadir el resto.

Antes de abrir el archivo asegúrate que:

La base de datos Base.accdb está en el mismo directorio

Si te da error al abrir el archivo en la sentencia ADODB.Connection, que es lo mas probable, debes añadir al proyecto la referencia:

Microsoft ActiveX Data Objects 2.7 Library (Alt+F11\Herramientas\Referencias)

Saludos

Consulta con 20 listbox.xls

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

Privacy Policy