Hola!
Peazo código!
Le he echado un ojo y mejor que buscar dónde falla, te voy a dar algunos consejillos que van a hacer que rutinas tan complejas sean más legibles y eficaces, y te resulte más fácil encontrar este tipo de errores:
- En primer lugar, no utilices la propiedad Text de los ComboBoxes para comprobar nada. Imagina que pasado mañana en lugar de "Carga Uniforme" tienes que poner otra cosa (o traducirlo a otro idioma)... ya tendrías que cambiar mucho código. Probablemente incluso tu problema esté ahí. En su lugar, utiliza la propiedad ItemData: en las Combos y en las ListBoxes, hay tantos elementos en ItemData (es un array) como haya en List, de hecho, puedes también introducirlos en tiempo de diseño, pero si quieres llenarlas por código es algo así:
Código:
With Combo1
Call .AddItem("Carga uniforme")
.ItemData(.NewIndex) = 0
Call .AddItem("Carga puntual")
.ItemData(.NewIndex) = 1
.... ' ad infinitum =]
End With
De esta forma, comprobar qué valor hay es tan sencillo como:
Código:
If Combo1.ItemData(Combo1.ListIndex) = 0 Then...
Puedes hacerlo aún más legible definiendo constantes o enumeraciones para los distintos valores. De hecho, te recomendaría que te acostumbraras a ello

. Por ejemplo, para tu caso:
Código:
Public Enum TipoCargaConst
TC_Vacio = 0
TC_SinCarga = 1
TC_Uniforme = 2
TC_Puntual = 4 ' Progresión geométrica, estaba pensando en hacer otro truco, pero para el caso actual, da igual los valores que pongas aquí =]
End Enum
Private Sub Form_Load()
With Combo1
.Clear
Call .AddItem("-")
.ItemData(.NewIndex) = TC_Vacio
Call .AddItem("Sin Carga")
.ItemData(.NewIndex) = TC_SinCarga
Call .AddItem("Carga uniforme")
.ItemData(.NewIndex) = TC_Uniforme
Call .AddItem("Carga puntual")
.ItemData(.NewIndex) = TC_Puntual
.ListIndex = 0
End With
End Sub
Y para comprobar lo que quieras, lo harías así (se ve la diferencia, verdad? ):
Código:
If Combo1.ItemData(Combo1.ListIndex) = TC_Uniforme Then ...
Y si un día tienes que cambiar la descripción, la cambias una única vez y en un único sitio.
- Cuando tengas que hacer comprobaciones encadenadas, utiliza la estructura Select Case... End Select. Te reescribo el principio de tu función para que te hagas una idea de cómo quedaría:
Código:
Private Sub codigomomentosvano2()
'A PARTIR DE AQUÍ SON LAS IMÁGENES DE LOS MOMENTOS
Dim i As Integer
Dim m As Integer
For i = 0 To 27
picture72(i).Visible = False
Next
For m = 0 To 6
picture81(m).Visible = False
Next
'CASO PRIMERO
If Combo1.Text = 2 And Check2.Value = 0 Then
'CASO 1º A
Select Case combo3.ItemData(combo3.ListIndex)
Case TC_Uniforme: ' Valor en Combo3
Select Case combo7.ItemData(combo7.ListIndex)
Case TC_Vacio, TC_SinCarga, TC_Uniforme: ' Cualquiera de los tres vale para este caso
If combo11.ItemData(combo11.ListIndex) = TC_Vacio Or combo11.ItemData(combo11.ListIndex) = TC_SinCarga Then
picture72(2).Visible = True
picture81(0).Visible = True
End If
Case TC_Puntual:
If combo11.ItemData(combo11.ListIndex) = TC_Vacio Or combo11.ItemData(combo11.ListIndex) = TC_SinCarga Then
If Val(Form8.Text1) = 0 Or Val(Form8.Text1) = Val(Form2.Text2) Then
picture72(2).Visible = True
picture81(0).Visible = True
ElseIf Val(Form8.Text1) < ((Val(Form2.Text2)) / 2) And Val(Form8.Text1) > 0 Then
picture72(22).Visible = True
picture81(5).Visible = True
ElseIf Val(Form8.Text1) = ((Val(Form2.Text2)) / 2) Then
picture72(18).Visible = True
picture81(4).Visible = True
ElseIf Val(Form8.Text1) > ((Val(Form2.Text2)) / 2) And Val(Form8.Text1) < Val(Form2.Text2) Then
picture72(26).Visible = True
picture81(6).Visible = True
End If
End Select
Case TC_Puntual: ' Valor en combo3
Select Case combo7.ItemData(combo7.ListIndex)
case ...
End Select
case ...
End Select
End If
End Sub
La función sería mucho mas larga porque el propio algoritmo requiere muchas comprobaciones, pero fíjate que ya parece más fácil de seguir, ¿verdad?
Observa que he utilizado también la estructura If... ElseIf ... End If. Es similar a Select Case ... End Select, pero legible a su manera. La idea detrás de esto es que si el programa comprueba una de las opciones y es verdadera, las demás no se van a ejecutar, así que sobra comprobarlas.
- Acostúmbrate también a dar un nombre descriptivo a los controles. "picMomento" es más fácil de seguir que "Picture1"... a mí también me da pereza a veces, no te creas, pero a la larga se acaba agradeciendo
- Y como truquillos, define las variables para contadores y esas cosas como Long, no como Integer. Long utiliza 32 bits, mientras que Integer sólo usa 16: los sistemas Windows 2000 y superiores están optimizados para trabajar con Longs y el código puede acelerarse si los utilizas intensivamente.
Espero no haberte apabullado mucho con todo esto, pero he deducido del código que tú vales para esto, así que ¡ánimo!, y si tienes cualquier duda, pregunta sin miedo