¿Como marcar/desmarcar todas las casillas de verificación?

Buenois días, tengo un formulario con un campo mailing de tipo si/no. He puesto en el encabezado de ese campo un botón (comando31) para marcar y desmarcar todas las casillas. El código es el siguiente:

Option Compare Database

Function MarcarCampo(SióNo As Boolean)
prg = MsgBox("Seguro desea Marcar o Desmarcar todas las Casillas ", vbExclamation + vbYesNo, "Edit")
If prg = vbYes Then
Dim ctr As Control
For Each ctr In Me
With ctr
If .ControlType = acCheckBox Or _
.ControlType = acOptionButton Then
.Value = SióNo
End If
End With
Next ctr
End If
End Function
Private Sub Comando31_Click()
If Me.Comando31.Caption = "Marcar" Then
MarcarCampo True
Me.Comando31.Caption = "Desmarcar"
ElseIf Me.Comando31.Caption = "Desmarcar" Then
MarcarCampo False
Me.Comando31.Caption = "Marcar"
End If
End Sub
Private Sub Form_Open(Cancel As Integer)
Me.Comando31.Caption = "Marcar"
End Sub

Sin embargo algo falla porque solo me marca y desmarca la primera casilla de verificación del primer registro del formulario. ¿Me podfeis ayudar?

2 Respuestas

Respuesta
2

Si tu formulario trabaja directamente sobre la tabla (o una consulta de selección), una opción rápida es usar una SQL de actualización, con lo que tu función MarcarCampo quedaría:

Function MarcarCampo(SióNo As Boolean)
prg = MsgBox("Seguro desea Marcar o Desmarcar todas las Casillas ", vbExclamation + vbYesNo, "Edit")
If prg = vbYes Then
CurrentDb.Execute "UPDATE NombreTablaConsulta SET NombreCampo=" & SióNo
End If
End Function

Solo has de cambiar lo que está en negrita por los nombres que tu tengas.

Otra opción es recorrer todos los registros del recordset, por ejemplo:

Function MarcarCampo(SióNo As Boolean)
prg = MsgBox("Seguro desea Marcar o Desmarcar todas las Casillas ", vbExclamation + vbYesNo, "Edit")
If prg = vbYes Then

Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
Do Until rst.EOF
rst.Edit
rst("NombreCasilla") = SióNo
rst.Update
rst.MoveNext
Loop
rst.Close

End If
End Function

De nuevo solo has de cambiar lo que está en negrita por el nombre de tu casilla.

Y aún habría alguna que otra opción más...

Un saludo.


Gracias Sveinbjorn,

Ahora consigo marcar todas las casillas de verificación pero no las desmarca

El formulario esta basado en una consulta "pisos_ocupados_mailing". El campo de las casillas de verificación "mailing", el botón "Comando31". Pego a continuación los códigos que tengo puestos:

Function MarcarCampo(SióNo As Boolean)
prg = MsgBox("Seguro desea Marcar o Desmarcar todas las Casillas ", vbExclamation + vbYesNo, "Edit")
If prg = vbYes Then
Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
Do Until rst.EOF
rst.Edit
rst("mailing") = SióNo
rst.Update
rst.MoveNext
Loop
rst.Close
End If
End Function

Private Sub Comando31_Click()
If Me.Comando31.Caption = "Marcar" Then
MarcarCampo True
Me.Comando31.Caption = "Desmarcar"
ElseIf Me.Comando31.Caption = "Desmarcar" Then
MarcarCampo False
Me.Comando31.Caption = "Marcar"
End If
End Sub
Private Sub Form_Open(Cancel As Integer)
Me.Comando31.Caption = "Marcar"
End Sub

gracias

Vale, añade la siguiente línea antes del Do Until rst. EOF:

Rst. MoveFirst

Es decir, que tu función quedará:

Function MarcarCampo(SióNo As Boolean)
prg = MsgBox("Seguro desea Marcar o Desmarcar todas las Casillas ", vbExclamation + vbYesNo, "Edit")
If prg = vbYes Then
  Dim rst As DAO.Recordset
  Set rst = Me.RecordsetClone
  rst.MoveFirst
  Do Until rst.EOF
    rst.Edit
    rst("Mailing") = SióNo
    rst.Update
    rst.MoveNext
  Loop
  rst.Close
End If
End Function
Respuesta
2

También podrías poner en el botón

For Each Control In Form.Controls
If Control.ControlType = acCheckBox Then
Control.Value = 0
End If
Next

Para "marcarlas"

control.value=-1

Gracias Icue,

Esto también me podría valer pero lo he puesto y solo me marca la casilla de verificación del primer registro. Esto es lo que he puesto:

Private Sub Comando31_Click()
For Each Control In Form.Controls
If Control.ControlType = acCheckBox Then
Control.Value = -1
End If
Next
End Sub

Por lo que dices me da la impresión de que el formulario es continuo. Si ese es el caso es lógico que sólo te marque la casilla del registro activo. Ten en cuenta, que en los formularios continuos aunque veas varios registros sólo tiene existencia real el registro activo. Los demás son "imágenes virtuales". Lo mismo que cuando el formulario es único, sólo ves el registro activo, que está en pantalla y para cualquier cosa te tienes que desplazar, con lo que el nuevo lo conviertes en el registro activo. Pues en los continuos es lo mismo. Sólo existe el activo.

Para solucionarlo te aconsejaría que usaras lo que te indica Sveinborj, es decir actualiza las casillas en la tabla. Luego con usar un Me. Requery listo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas