'*******************************************************************************

'* Function MoveList

'* Mueve un elemento de ListaOrigen a ListaDestino en Cuadros de Lista con la

'  propiedad tipo de origen de la fila = Lista de Valores

'* Argumentos: frm => Ojeto que hace referencia al form en el que se encuentran las listas

'              listaOrigen => Nombre (texto) del cuadro de lista Origen

'              listaDestino => Nombre (texto) del cuadro de lista de Destino

'* uso: Call MoveList(Me, "NombreListaOrigen", "NombreListaDestino)

'       Call MoveList(Forms!NombreForm!NombreSubForm.Form, "NombreListaOrigen", "NombreListaDestino")

'* Marciano Almohalla, Diciembre 2005

'*******************************************************************************

Function MoveList(frm As Form, listaOrigen As String, listaDestino As String)

'Primero guardamos en una variable el número de la opción seleccionada

'así podremos voler a dejar seleccionada la opción que ocupe su lugar

'una vez movida esta al otro listbox.

Dim it As Variant, i As Integer

'El bucle se hace hasta listcount -1 porque los valores en el listbox

'comienzan por el 0, por lo que el maximo indice de valor será listcount -1

For i = 0 To frm.Controls(listaOrigen).ListCount - 1

    If frm.Controls(listaOrigen).Selected(i) = True Then

        it = i

        Exit For

    End If

Next i

 

'Añadir y quitar filas a los cuadros de lista, sería mas facil con Additem, pero he

'querido hacerlo de forma que funcione en versiones anteriores que no tienen este metodo

Dim posFila As Integer, posI As Integer, posF

'Comprobamos que halla filas seleccionadas para añadir

If frm.Controls(listaOrigen).ItemsSelected.Count > 0 Then

    Dim it2 As Variant

    Dim Seleccionados As String

    'Recorremos la coleccion de opciones seleccionadas en el cuadro de lista

    'y las vamos guardando en una variable de texto separadas por ;

    For Each it2 In frm.Controls(listaOrigen).ItemsSelected

        Seleccionados = Seleccionados & frm.Controls(listaOrigen).ItemData(it2) & ";"

    Next it2

    'Eliminamos el ultimo ;

    Seleccionados = Mid(Seleccionados, 1, Len(Seleccionados) - 1)

   

    'Si listaDestino está vacio le asignamos directamente todos los nuevos

    If frm.Controls(listaDestino).RowSource = "" Then

        frm.Controls(listaDestino).RowSource = Seleccionados

    Else

        'Si no está vacio, es decir, si ya contiene valores, añadimos los nuevos

        frm.Controls(listaDestino).RowSource = frm.Controls(listaDestino).RowSource & ";" & Seleccionados

    End If

   

    'Quitamos de ListaOrigen los que hemos pasado a ListaDestino

    posI = 1

    posF = InStr(1, Seleccionados, ";")

    If posF = 0 Then posF = Len(Seleccionados) + 1

    'Para ello recorremos la variable que contiene los nombres de todos

    'los valores seleccionados (los que hemos pasado) y

    Do While posI < Len(Seleccionados)

        'Vamos buscando ese valor en el RowSource de ListaOrigen

        posFila = InStr(1, frm.Controls(listaOrigen).RowSource, Mid(Seleccionados, posI, posF - posI))

       

        'Eliminamos ese valor del Rowsource, para ello lo rehacemos copiando todos los valores

        'anteriores y los posteriores al que queremos quitar

        frm.Controls(listaOrigen).RowSource = Mid(frm.Controls(listaOrigen).RowSource, 1, posFila - 1) & _

                                            Mid(frm.Controls(listaOrigen).RowSource, posFila + (posF - posI) + 1)

        posI = posF + 1

        posF = InStr(posI, Seleccionados, ";")

        If posF = 0 Then posF = Len(Seleccionados) + 1

    Loop

   

    'Si se nos ha quedado un ; al final lo quitamos para que no nos quede un fila ""

    If Left(frm.Controls(listaOrigen).RowSource, 1) = ";" Then

        frm.Controls(listaOrigen).RowSource = Mid(frm.Controls(listaOrigen).RowSource, 2)

    End If

End If

 

'Dejamos seleccionado en el listbox la opción que ocupa el lugar de la

'que acabamos de traspasar al listbox ListaDestino

If frm.Controls(listaOrigen).ListCount > it Then

    frm.Controls(listaOrigen).Selected(it) = True

End If

 

End Function