Cambiar valores de Togglebuttons automáticamente

Tengo un Userform con el aspecto que se ve aquí (estoy haciéndome, por diversión, un hundir la flota):

Estoy intentando hacer una función que barra todo el tablero al acabar una partida y que vuelve a poner su estado de "true" a "false" para "despulsarlos" y he escrito esto:

matriz_columas = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
For i = 0 To 9
   letra = matriz_columnas(i)
   For k = 1 To 10
      letra & k.Value = False
   Next k
Next i

La intención es que vaya haciendo "A1.Value=False"; "A2.Value=False", "A3.Value=False", ...., "J10.Value=False", pero obviamente no funciona.

¿Alguien podría echarme una mano?

2 Respuestas

Respuesta
1

Si estás intentando enviar datos a la hoja, debes indicarlo como 'rango' y no hace falta el 'value' en la variable K:

   For k = 1 To 10
        Range(letra & k) = False
   Next k

Si esto resuelve tu consulta no olvides valorarla.

Buenas Elsa.

Quizás no me he explicado bien anteriormente, porque la parte importante del código es un poco ambigua.

Lo que estoy intentando es que cada uno de los togglebuttons, los cuales he renombrado como A1, A2, A3, etc. por comodidad, cambien el valor de su atributo "Value" a False, para que pasen en el Userform de estar "pulsados" a estar "despulsados". A1, A2, etc, no se refieren a casilla de una hoja del libro, sino al nombre de los togglebuttons.

Si acaso, por hacerlo más entendible, imaginemos que quiero cambiarles el color a todos a rojo. El código que yo usaría es este:

matriz_columas = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "I")
For i = 0 To 9
   letra = matriz_columnas(i)
   For k = 1 To 10
      letra & k.Backcolor = vbRed
   Next k
Next i

El problema es que el "letra & k.Backcolor" no lo reconoce como "A1.Backcolor", por ejemplo.

Espero haberme explicado mejor ahora.

Bien, ahora sí. Como tu array se llama 'matriz_columnas' y con esas letras bien podría haber estado asociado a celdas.

Para llamar a un grupo de controles, la instrucción sería:

Me.Controls(letra & k).BackColor = vbRed      'si se trata de todos los controles en el UF

Frame1.Controls(letra & k). BackColor = vbRed 'si se trata solo de algunos controles, en este caso dentro de un Frame.

La diferencia se observa en la imagen, donde solo afecté al grupo de controles dentro del frame.

PD) Valoraste antes de enviar tus aclaraciones.

Veo que aún no modificaste el nombre de tu array... hay un error de sintaxis: ¿es matriz_columas o matriz_columnas? Ajusta el nombre.

Sdos!

Muchísimas gracias Elsa. Funciona perfectamente con la función Me.Controls(...)

Te voté la respuesta antes de dar con la solución porque el mero hecho de contestar me parece suficiente motivo para valorarlo positivamente.

Aprovechando esta situación, tengo más preguntas de este estilo. ¿Habría manera de darnos otra forma de comunicación para comentarlas? Si no, hago otra pregunta en todoexpertos y si puedes pasarte a echarle un vistazo, te lo agradezco. Se trata de cómo reproducir esto:

Private Sub A1_Click()

   If A1.Value = True Then
      A1.BackColor = vbGreen
      casilla = "A1"
      resultado = "agua"
      Call escribir_disparo
   Else
      A1.BackColor = &H8000000F
   End If

End Sub

En los 100  Private Sub que tendría que hacer. Seguro que puedo ahorrarme escribirlos, pero no sé cómo.

Gracias de nuevo por tu respuesta.

Debes dejar una consulta por cada tema. En el título debe indicarse qué se busca y de ese modo se puede ubicar luego desde el buscador.
Si necesito una muestra para poder probar lo que solicitas me la podés enviar a alguno de los correos que aparecen en la portada de mi sitio que dejo al pie. No respondo consultas privadas ni mal valoradas ;)

Respuesta
2

Haz caso a Elsa, ya que es de las que más sabe de Excel. Personalmente no tengo ni idea, pero por si te puede servir. Supongamos que tengo un formulario

Donde puedes ver que hay algunos "señalados". Si pulso el botón

El código del botón es

Private Sub Comando422_Click()
Dim tb As Control, i As Byte
For i = 1 To 6
Set tb = Controls("A" & i)
If tb = True Then
tb = False
End If
Next
End Sub

Por si te da una idea

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas