
Access: Active control
19/01/2022
Diseño: poner icono a mis formularios
20/01/2022¿Qué vamos a ver en esta clase?
En esta clase veremos como cargar un listbox con los datos de una tabla y cómo al seleccionar datos del primer listbox, se transforma un segundo listbox, adaptando su tamaño a los datos que va a contener.
Para conseguir esto vamos a necesitar un formulario de Access con dos listbox y tantos botones de comando que nos permitirán realizar acciones como ordenar alfabéticamente las columnas.
Al final de la entrada encontrarás un vídeo de cómo puedes hacerlo y un ejemplo que puedes descargar.
Los pasos a seguir son:
1. Creamos un listbox con origen de la fila en «Lista de valores» y dos columnas, con un botón de comando que nos permite cargar el listbox.
'----------------------------------------------------------------------------------------
' Fuente : https://access-global.net/listbox-dinamicos/
'----------------------------------------------------------------------------------------
' Título : listbox dinámicos
' Autor original : Antonio Otero
' Propósito : Rellenar listbox con los campos de una trabla, de forma dinámica
'Coloca este código en el código de tu formulario
'----------------------------------------------------------------------------------------
Private Sub Comando2_Click()
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Set dbs = CurrentDb
Me.l_campos.RowSource = ""
Set tdf = dbs.TableDefs("CLIENTES")
For Each fld In tdf.Fields
Me.l_campos.AddItem fld.Name & ";" & fld.Type
Next
Set fld = Nothing
Set tdf = Nothing
Set dbs = Nothing
End Sub
2. Creamos el segundo listbox que será el encargado de mostrarnos los datos de la tabla. Sus características se definen por código.
Private Sub l_campos_Click()
Dim lar()
Dim izqi As String, izq As String
Dim lanch As String
Dim i%, e%, b%
lar = Array(500, 4000, 4000, 2000, 2500, 1000)
izqi = Me.Lista4.Left
izq = izqi
For i = 1 To 6: Me.Controls("bt" & i).Visible = False: Next i
With Me.l_campos
For e = 0 To .ListCount - 1
If .Selected(e) = True Then
b = b + 1
Me.Controls("bt" & b).Visible = True
Me.Controls("bt" & b).Width = lar(e)
Me.Controls("bt" & b).Left = izq
Me.Controls("bt" & b).Caption = .Column(0, e)
izq = izq + lar(e) + 100
lanch = lanch & Format((lar(e) + 100) * 0.001763, "0.00") & " cm;"
End If
Next e
If lanch <> "" Then lanch = Left(lanch, Len(lanch) - 1)
'MsgBox lanch
End With
If lanch <> "" Then
With Me.Lista4
.ColumnWidths = lanch
.ColumnCount = b
.Width = izq - izqi
End With
End If
CARGA_SELECT
End Sub
Function CARGA_SELECT()
Dim c As Integer
Dim SQ As String
For c = 0 To Me.l_campos.ListCount
If Me.l_campos.Selected(c) = True Then SQ = SQ & Me.l_campos.Column(0, c) & ","
Next c
SQ = " SELECT " & Left(SQ, Len(SQ) - 1) & " FROM CLIENTES " & Me.TX_ORDEN
Me.Lista4.RowSource = SQ
End Function
3. Creamos tantos botones de comando como campos de la tabla hay. Los ponemos «no visibles» ya que los iremos visibilizando según representen a campos en la tabla.
4. Creamos una función para que se active cuando pulsamos cualquiera de los botones.
'Función que se asocia a cada botón de comando
Private Function ORDENA()
Dim c As Integer, b As Integer
Dim NBT As String, SUF As String
Dim NCA As String
For c = 0 To Me.l_campos.ListCount
If Me.l_campos.Selected(c) = True Then b = b + 1: Me.Controls("BT" & b).Caption = Me.l_campos.Column(0, c)
Next c
NBT = Me.ActiveControl.Name
NCA = Controls("" & NBT & "").Caption
If Me.TX_ORDEN = "ORDER BY " & NCA & " ASC" Then SUF = ChrW(9660): Me.TX_ORDEN = "ORDER BY " & NCA & " DESC" Else Me.TX_ORDEN = "ORDER BY " & NCA & " ASC": SUF = ChrW(9650)
Controls("" & NBT & "").Caption = SUF & " " & NCA & " " & SUF
CARGA_SELECT
End Function
A continuación puedes ver el vídeo con la explicación de todo el proceso.
Por último, te adjuntamos el ejemplo en Access para que te lo puedas descargar y utilizar en tus aplicaciones.
[wpdm_package id='10906']



