La macro busca cuáles turnos ya fueron asignados y en pantalla solo muestra los disponibles, de esta forma ya no puedes seleccionar un turno que ya fue asignado.
Private Sub UserForm_Activate()
'Por.Dante Amor
Set ha = Sheets("asignaciones")
ListBox1.Clear
For i = 1 To Sheets("TURNOS").Range("A" & Rows.Count).End(xlUp).Row
ListBox1.AddItem Sheets("TURNOS").Cells(i, "A")
Next
'
With UserForm1
LCur = .ListBox1.List(.ListBox1.ListIndex, 0)
LFac = .ComboBox2
LCic = .ComboBox3
End With
'busca cursos en el listbox2
For i = 0 To UserForm1.ListBox2.ListCount - 1
If UserForm1.ListBox2.List(i, 0) = LCur And _
UserForm1.ListBox2.List(i, 1) = LFac And _
UserForm1.ListBox2.List(i, 2) = LCic Then
turno = UserForm1.ListBox2.List(i, 3)
For n = 0 To ListBox1.ListCount - 1
If ListBox1.List(n) = turno Then
ListBox1.RemoveItem n
Exit For
End If
Next
End If
Next
'busca cursos en asignaciones
For i = 2 To ha.Range("A" & Rows.Count).End(xlUp).Row
If ha.Cells(i, "B") = LCur And _
ha.Cells(i, "C") = LFac And _
ha.Cells(i, "D") = LCic Then
turno = ha.Cells(i, "E")
For n = 0 To ListBox1.ListCount - 1
If ListBox1.List(n) = turno Then
ListBox1.RemoveItem n
Exit For
End If
Next
End If
Next
'
End Sub
Pero la macro funciona con la estructura de las hojas y el mismo diseño de un formulario.
La lógica de esta macro, es cargar los todos los turnos en un listbox, luego busca en una hoja (base de datos) si alguno fue asignado, si ya fue asignado, entonces borra ese turno del listbox, también busca los turnos seleccionado pero que aún no han sido guardados en la base de datos.
Espero que te sirva la explicación.