'Esto debes colocarlo al principio del modulo, justo
debajo de
'Option Compare Database y Option Explicit (si está)
Public Enum
Direc
Subir
Bajar
End Enum
'Esto en cualquier lugar del módulo
'**********************************************************************************************
'* Function SubeBajaLista
'* Mueve un elemento del cuadro de lista (Lista de
Valores) pasado como paramentro (Lista) a la
'
posición inmediatamente anterior o posterior de acuerdo con el parámentro Direccion
'* Argumentos: frm => Ojeto que hace referencia al form
en el que se encuentran las listas
'
Lista => Nombre (texto) del cuadro de lista sobre el que actuaremos
entre ""
' Direccion => Subir o Bajar indica en que dirección
moveremos el elemento
' no es necesario usar comillas, es una
enumeración de un tipo
' definido por el usuario (Gracias a Emilio Sancha) por este detalle.
'* Uso: Call SubeBajaLista(Me,
"NombreLista", Subir o Bajar)
'* Marciano Almohalla,
Diciembre 2005
'**********************************************************************************************
Function
SubeBajaLista(frm As Form, Lista
As String, Direccion As Direc)
'Con este codigo vamos a mover
la opción que se encuentre seleccionada
'en el listbox, a la posición
inmediatamente anterior o posterior
'Como el listbox tiene como
origen de datos una lista de valores
'para poderlos ordenar creamos una Matriz y la cargamos
con los valores
'del listbox
Dim arrayLista()
As Variant
Dim i As Integer
Dim mLista As String
Dim iSel As Variant
'Guardamos la posición ordinal de la opcion
que se encuentra
'seleccionada en el listbox en
la variable iSel
For i = 0 To frm.Controls(Lista).ListCount
- 1
If frm.Controls(Lista).Selected(i) = True Then
iSel
= i
Exit For
End If
Next i
'Si iSel es 0, es que estamos
en el primer registro y
'por lo tanto no podemos subir
mas
If iSel = 0 And Direccion = Subir Then Exit Function
'Si estamos en el ultimo registro ya no se puede bajar
mas
If iSel = frm.Controls(Lista).ListCount
- 1 And Direccion = Bajar
Then Exit Function
'Redimensionamos la Matriz para que admita un numero de
valores
'igual al de elementos que hay en el listbox
ReDim arrayLista(frm.Controls(Lista).ListCount)
'Rellenamos la Matriz recorriendo la lista de valores
For i = 0 To frm.Controls(Lista).ListCount
arrayLista(i) = frm.Controls(Lista).ItemData(i)
Next i
'Rellenamos una variable string
con los valores reordenados
'Diferenciamos según queramos subir o bajar
If Direccion
= Subir Then
'Añadimos a la
lista todos los valores anteriores a los dos afectados
For i = 0 To iSel - 2
mLista
= mLista & arrayLista(i) & ";"
Next i
'a continuacion ponemos el valor a mover, con lo cual ya ha
subido un puesto
mLista = mLista
& arrayLista(iSel)
& ";"
'ahora
colocamos el que baja ese puesto
mLista = mLista
& arrayLista(iSel - 1)
& ";"
'y aquí el
resto hasta completar la lista de valores
For i = iSel + 1 To frm.Controls(Lista).ListCount
mLista
= mLista & arrayLista(i) & ";"
Next i
ElseIf Direccion
= Bajar Then
'Añadimos a la
lista todos los valores anteriores a los dos afectados
For i = 0 To iSel - 1
mLista
= mLista & arrayLista(i) & ";"
Next i
'ahora
colocamos el valor que sube
mLista = mLista
& arrayLista(iSel + 1)
& ";"
'y el valor que
baja
mLista = mLista
& arrayLista(iSel)
& ";"
'y po fin el resto de los valores
For i = iSel + 2 To Me.CamposMostrados.ListCount
mLista
= mLista & arrayLista(i) & ";"
Next i
Else
'Si direccion no es ni "Subir" ni "Bajar",
hay un error en la llamada, asi que abortamos
MsgBox "Parámetro no válido, debe indicar Subir o
Bajar para el parametro Direccion",
vbOKOnly + vbCritical,
"ERROR"
Exit Function
End If
'quitamos el ultimo ; que generaria una opcion ""
en el listbox
mLista
= Left(mLista, Len(mLista) - 1)
'asignamos el valor de esta variable al cuadro de lista,
de esta
'forma ya lo tendremos reordenado
frm.Controls(Lista).RowSource = mLista
'Marcamos como seleccionada la opcion
que acabamos de mover
If Direccion = Subir Then
frm.Controls(Lista).Selected(iSel - 1) = True
Else
frm.Controls(Lista).Selected(iSel + 1) = True
End If
End Function