Le preparé este ejemplo, consta de 1 tabla 1 formulario y 1 módulo de VBA.
TABLA
Con base en esta tabla lleno el cuadro de lista principal
FORMULARIO
Observe cuando hago clic se pasan al siguiente cuadro de lista el campo desglosado. Si hago clic en otro elemento del cuadro de lista principal, obtengo la siguiente pregunta.
Si haga clic en SI obtengo lo siguiente:
Ahora, si hago Doble clic me retira el elemento y obtengo:
EVENTO AL HACER CLIC EN EN CUADRO DE LISTA DEL TEXTO ORIGINAL
Private Sub lstPpal_Click()
Dim cta_campos As Byte
Dim strCampo As String
Dim x As Integer
Dim varPos As Integer
If Me.lstAux.ListCount > 0 Then
If MsgBox("Hay items, ¿Los conserva? ", vbQuestion + vbYesNo + vbDefaultButton2, "Le informo") = vbNo Then
'Remover items
For x = 0 To Me.lstAux.ListCount - 1
Me.lstAux.RemoveItem (varPos)
Next
End If
End If
cta_campos = contar_palabras(Replace(Me.lstPpal.Column(1), ",", " "))
If cta_campos = 1 Then
strCampo = extrae(Me.lstPpal.Column(1), 1, ",")
Me.lstAux.AddItem strCampo
Else
For x = 1 To cta_campos
strCampo = extrae(Me.lstPpal.Column(1), x, ",")
Me.lstAux.AddItem strCampo
Next x
End If
End Sub
Observe que llamo 2 funciones:
Contar_palabras - Esta cuenta el número de palabras de una frase pero separada por espacios, por esto se utiliza la funcion Replace() para suprimir las comas (,)
extrae . Esta función extrae la palabra de acuerdo con la posición
CÓDIGO ENVENTO AL HACER DOBLE CLIC EN EL CUADRO DE LISTA INVIDUAL
Private Sub lstAux_DblClick(Cancel As Integer)
If lstAux.ListCount >= 1 Then
Me.lstAux.RemoveItem (Me.lstAux.ListIndex)
End If
End Sub
Este código es para retirar el item seleccionado del cuadro de lista. Se pude mejorar, por ejemplo, con un botón para seleccionar todos, etc.
CÓDIGO DEL MÓDULO
Function contar_palabras(strPalabras As String)
'Función para contar las palabras en una frase
'Ej. contar_palabras("Mi hermano del alma"
'Retorna 4
Dim WrdArray() As String
WrdArray() = Split(strPalabras)
contar_palabras = UBound(WrdArray()) + 1
End Function
Public Function extrae(pvstring As Variant, pipart As Integer, Optional psDeli As String = ",")
'Functión para extraer parte de una cadena
'Parámetros:
' pvstring=Cadena de texto a minipular
' pipart=Parte de cadena a extraer de acuerdo con el separador,
' por ejemplo,1 primera parte, 2 segunda parte
' psdeli=Separador, opcional por defecto coma (,) pero pueder otro como guion(-)
'Elaborada por: Eduardo Pérez Fernández
'Fecha: 06/09/2021
'Ejemplos de llamada:
'? Extrae("Eduardo, Pérez", 1,",") ------>> retorna Pérez elimina el espacio que hay antes de Pérez
'? Extrae(", Pérez", 2,",") ------>> retorna Pérez elimina el espacio que hay antes de Pérez
'? Extrae("Eduardo-Pérez", 2,"-") ------>> retorna Pérez. Observe que cambie el separador de cadena por -
'? Extrae("Eduardo, Pérez", 2) ------>> retorna Pérez. No inclui el separador toma el separador por defecto,
'? Extrae("Eduardo, Pérez, Fernández", 3) ----->> retorna el segundo apellido Fernández
On Error Resume Next
extrae = Null
If Mid(pvstring, 1, 1) = psDeli Then
pvstring = "nd" & pvstring
End If
If IsNull(pvstring) Then Exit Function
extrae = Trim(Split(pvstring, psDeli)(pipart - 1))
End Function
Observe que la función extrae tiene bastante utilidad. Si quiere el ejemplo lo puede solicitar a [email protected] favor en el asunto anotar la pregunta.