Hola, wtoniw.
El error se produce a causa de lo siguiente:
Cuando checkeas uno de los CheckBox, se asigna el valor de su índice
como un elemento más del ComboBox.
El problema se encuentra al quitar el checkeo al CheckBox.
La instrucción que utilizas llama a eliminar el elemento con el índice
de planta, pero:
1-No sabes si el elemento con Indice planta tiene el valor planta
2-No sabes si el elemento con Indice planta existe
Es este último error el que hace soltar el MsgBox de error a Llamada de procedimiento no válido, puesto que se encuentra que el índice del elemento a eliminar no existe.
Para resolver este problema sería necesario disponer de un identificador propio
para cada elemento de la lista, uno que, al contrario de Index, no dependiera de su posición (ya que esta variará según se añadan o se eliminen otros elementos).
Tenemos 2 opciones:
1-Utilizar la propiedad List de los elementos (devuelve el valor que se muestra en
el ComboBox). Es una propiedad individual, puesto que solo habrá un valor 1, un valor 2, un valor 3... sin importar el orden en el cual aparezcan
2-Utilizar la propiedad ItemData de los elementos.
Tiene la misma funcionalidad que List, pero utilizando este se puede reservar
List para otros trabajos, quedando el ItemData para las operaciones de
añadir y eliminar y, dejando así modificar los valores mostrados sin
peligro de bugs en el programa.
Puede ser que no te hayas enterado de mucho, pero, con el código que te doy a continuación te será un tanto más fácil entenderlo.
Tan solo debes reemplazar el código:
If Check1(planta).Value = 1 Then
Combo3.AddItem planta
End If
If Check1(planta).Value = 0 Then
Combo3.RemoveItem planta
End If
Por el código:
'Se comprueba el estado del CheckBox
If Check1(planta).Value = 1 Then
'Si está checkeado, se añade un nuevo elemento con el valor planta
Combo3.AddItem planta
'Se añade también el valor planta a la propiedad ItemData del nuevo elemento para identificarlo
Combo3.ItemData(Combo3.NewIndex) = planta
Else
'Se recorre el ComboBox en busca de un elemento que tenga un ItemData coincidente con el valor planta
'Esto se podría hacer recurriendo al valor List del ComboBox, sin utilizar ItemData,
'pero de esta manera creo que queda un código más "encapsulado",
'puesto que más tarde es posible cambiar el valor de los elementos
'sin tener que modificar el código
For i = 0 To Combo3.ListCount - 1
If Combo3.ItemData(i) = planta Then Combo3.RemoveItem i: Exit Sub
Next i
End If
'---------------------------------------------------------
Perdón por el rollo, pero es que es propio de mi, sí, lo acepto, soy un plasta....
Espero que el código te ayude a resolver el problema con el maldito ComboBox...
Hasta otra,
Zoto