Access: Active control
19/01/2022Diseñ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.