Contar los CheckBox que doy Check
Impreso de: Foro de Access y VBA
Categoría: Otros de Microsoft: Windows y Office
Nombre del foro: Excel
Descripción del foro: Foro de Excel y VBA de Excel
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86384
Fecha de impresión: 26/Marzo/2026 a las 19:25
Tema: Contar los CheckBox que doy Check
Publicado por: RobertoCarlos
Asunto: Contar los CheckBox que doy Check
Fecha de publicación: 15/Junio/2022 a las 22:44
|
Muy buenas tardes, espero estén muy bien Aquí un reto para mi tal vez un segundo para mas de uno en este Foro
Estoy queriendo ingresar datos de manera fácil desde un formulario, es un pequeño control de pagos de un colegio para ello ya hice mi formulario, ahora hago unos filtros y me trae al alumno y me pone check en los checkbox que tiene el mes pagado por ejemplo si el alumno pago Febrero al cargar los datos se me cargar y se pone Check en el control lo verán a continuación. Ahora mi problema radica en por ejemplo el alumno debe pagar 10 mensualidades a lo largo del año y si yo quiero pagar Marzo por ejemplo doy check en el CheckBox de Marzo y si quiere pagar Abril también y así con los otros meses pero ahora me gustaría ir capturando los datos en un array para luego completo pasarlo a la hora de excel. Pero ahí es cuando comienza mi problema no se como hacerlo ya vi diferentes maneras pero ninguna se acerca a mi necesidad.
Por ejemplo mis campos en excel son estos Fecha NumeroRecibo Estudiante Mes Monto me gustaría que en memoria me cree ese arreglo con filas y columnas para después con un botton pasarlos a la hoja. pero por ejemplo si pago hasta Julio, me tocaría agosto y septiembre o los meses que quiera pagar por ejemplo si quiere pagar solo Julio que mi arreglo tenga una fila con todas esas columnas y si quiere pagar dos meses que tenga dos filas mis imágenes Por ejemplo esta es la imagen cuando inicio el form prácticamente vacío
Bueno no pude subir mis imágenes.
Agradezco la colaboración
------------- Roberto
|
Respuestas:
Publicado por: AnSanVal
Fecha de publicación: 15/Junio/2022 a las 23:35
|
Perdona pero te complicas bastante (tal vez para hacerlo más bonito?) con cosas que son más fáciles de hacer directamente en celdas.
Para lo que pides puedes tener una celda (lejos donde no estorbe) que cada vez que «des check» incrementes dicha celda y luego uses ese valor para los cálculos que necesites.
Te recuerdo que una celda (o varias) es la mejor memoria que tenemos en Excel, tanto para lo que pides ahora (no se borra aunque cerremos el libro) como para variables fijas o temporales, incluso matrices de varias dimensiones.
------------- Saludos desde Tenerife.
|
Publicado por: RobertoCarlos
Fecha de publicación: 16/Junio/2022 a las 01:33
|
De antemano muchas gracias, y Sí, así lo estuve haciendo por ejemplo hice algo que cuando doy check se me pinte en una celda lo que tengo en el Tag de ese checkbox, pero, que pasa si el usuario dio check por error y luego decide que ya no quiere o no tenia que dar check en ese mes como lo quito
------------- Roberto
|
Publicado por: AnSanVal
Fecha de publicación: 16/Junio/2022 a las 09:57
|
Para eso sirven los condicionales: si la casilla cambia a VERDADERO sumas 1, si la casilla cambia a FALSO restas 1, y como la casilla no tiene más estados... problema resuelto.
Pero no me refería a 'eso', si los datos los tienes en celdas pagados y no pagados; simplemente sumas o cuentas y con ello (quites o pongas) el cálculo siempre será el correcto peeero... (como se suele decir) «cada maestrillo tiene su librillo», es decir: si tu te sientes más cómodo con tu sistema... adelante que para ello Excel ofrece tantas opciones como ofrece, yo simplemente te comparto mi opinión, que no es (con mucho) ni la mejor ni la única.
------------- Saludos desde Tenerife.
|
Publicado por: AnSanVal
Fecha de publicación: 16/Junio/2022 a las 10:14
|
El problema de la comunicación a distancia, es que no podemos ver: lo que tiene el otro (tú) o a lo que se refiere el otro (yo).
Dices que lo tienes con un formulario, ¿Que tipo de formulario?, ¿Es el formulario integrado?, ¿Es un USERFORM de VBA?
(Para poder intentar ayudarte mejor) Sería interesante alguna imagen.
Editado: ¡Perdona!, no me había fijado que estás teniendo problemas para subir las imágenes. 
------------- Saludos desde Tenerife.
|
Publicado por: RobertoCarlos
Fecha de publicación: 16/Junio/2022 a las 14:18
|
Buen día, subiré las imágenes, por favor como debo hacer eso porque ya las subí a una página me dio el link pero me dice error al intentar vista previa
Gracias
------------- Roberto
|
Publicado por: AnSanVal
Fecha de publicación: 16/Junio/2022 a las 14:44
|
Desde un Formulario VBA (es un poco mas
laborioso) podría ser como el siguiente.

Este es un ejemplo sencillo para tres
meses (el código vale para los que necesites), constrúyelo y juega con él para
que veas lo que hace, y si te vale adáptalo a tu caso real.
Mi
ejemplo consta de:
UserForm1 , Frame1 (contenedor de las casillas), CheckBox1, CheckBox2, CheckBox3 y Label1
------------- Saludos desde Tenerife.
|
Publicado por: AnSanVal
Fecha de publicación: 16/Junio/2022 a las 14:57
|
RobertoCarlos: «... subiré las imágenes, por favor como debo hacer eso...»
Yo las subía a OneDrive y no tenía problemas para vincularlas, pero después de que actualizaron al nuevo formato no he logrado hacerlo. La verdad no lo intenté mucho, como no tengo problemas desde mi sitio web, pues lo hago desde allí. 
Pero si puedes (es más fácil) en vez de vincular la imagen, pega aquí directamente el enlace para su descarga, o incluso sólo el texto del enlace.
------------- Saludos desde Tenerife.
|
Publicado por: RobertoCarlos
Fecha de publicación: 16/Junio/2022 a las 16:51
|
AnSanVal doy gracias a Dios por tu sabiduría. y gracias por colaborarme, conforme a lo indicado para subir imágenes, he conseguido subirlas al dropbox, las pasare en orden para que veas en la primera es cuando ejecuto el formulario https://www.dropbox.com/s/d9d96jtoy0nbslr/1.png?dl=0
En la segunda es cuando busco un estudiante y con el botón cargar cargo los datos de ese estudiante al formulario, datos que vienen de la hoja de cálculo. https://www.dropbox.com/s/anhc301t1v1tnni/2.png?dl=0 y la tercera es cuando el estudiante me dice quiero pagar en la imagen se ve que quiere pagar Mayo Junio y Julio el que esta con el recuadro verde en la imagen. los que están con el recuadro rojo, ya no se puede quitar el check porque están bloqueados, y los que estan sin el check son mensualidades que el estudiante debe. https://www.dropbox.com/s/f1qn64egu1ta37a/3.png?dl=0
Ahora bien cuando yo hago Check por ejemplo en Junio el con este código en el evento click Private Sub ChkNoviembre_Click() If ChkNoviembre Then
Dim fila As Integer fila = 1 While Cells(fila, 39) <> "" fila = fila + 1 Wend Hoja12.Cells(fila, 39) = TxtFecha.Value Hoja12.Cells(fila, 40) = TxtRecibo.Value Hoja12.Cells(fila, 41) = CboEstudiantes.Value Hoja12.Cells(fila, 42) = TxtCurso.Value Hoja12.Cells(fila, 43) = ChkNoviembre.Tag Hoja12.Cells(fila, 44) = 20 Hoja12.Cells(fila, 45) = CboTipoMovimiento.Value
End If
End Sub me agregar a una fila que esto me funciona bien, es decir carga los datos ahora bien el usuario del sistema se apresuro y hizo check en septiembre y el estudiante le dijo no. solo pagare hasta agosto entonces como ya está check debo quitar el check para que se quite la fila que se agrego para ello hice este otro codigo en el evento change Private Sub ChkNoviembre_Change() If ChkNoviembre.Value = False Then Sheets("Pagos").Select col = "AQ" texto = ChkNoviembre.Tag Valor = texto If IsNumeric(texto) Then Valor = Val(texto) ' Application.ScreenUpdating = False For i = Range(col & Rows.Count).End(xlUp).Row To 1 Step -1 If LCase(Cells(i, "AQ")) = LCase(Valor) Then f1 = i Sheets("Pagos").Range("AM" & f1, "AS" & f1).Delete Shift:=xlUp End If Next
End If End Sub
que también lo quita,
Mi próxima pregunta sería, como lo puedo mejorar este código por favor, creo que el funciona pero creo que esta muy artesanal
Perdón edito por ejemplo uno de los problemas que veo es que en cada checkbox tendría que ir el código y son 10 meses de febrero a noviembre, y en ambos eventos En febrero el código del click y el código del change en marzo lo propio y creo que habría mucho código
Muchas gracias
------------- Roberto
|
Publicado por: AnSanVal
Fecha de publicación: 17/Junio/2022 a las 11:45
RC:
«... uno
de los problemas que veo es que en cada checkbox tendría que ir el código y son
10 meses de febrero a noviembre, y en ambos eventos. En febrero el código del
click y el código del change en marzo lo propio y creo que habría mucho código...»
ASV: Sí, eso es innecesariamente
repetitivo,
pero fíjate en el código que te compartí: el código
de acción
está sólo una vez (Private Sub pagos) y
los eventos Change
de las casillas (son necesarios) solo contienen su llamada a la subrutina pagos.
En tu caso tendrás que adaptar a:
Option Explicit ' es importante; estas declaraciones con
alcance general.
Dim totP#, mensual#, cnt As Object 'totalPagado,
cuota y (cada)control.
Private Sub ChkFebrero_Change()
pagos
End Sub
. . .
Private Sub ChkNoviembre_Change()
pagos
End Sub
Private Sub pagos()
totP = 0
For Each cnt In Me.Controls
If Left(cnt.Name, 3)
= "Chk" Then
If cnt.Value Then totP = totP + 1
End If
Next cnt
'En
vez de poner totalPagado en la etiqueta, lo pondrás en C.Pagadas.
UserForm1.Label1.Caption = "Total pagos: " & Abs(totP)
End Sub
NOTA: Es muy importante que otros controles
(que no sean casillas de verificación)
del formulario, su nombre NO sea «Chk???»
y que el formulario no contenga más casillas que las de los meses (con esto
parece que no hay problemas).
Editado para aplicar espacios entre párrafos. Recuerda comentar si has resuelto, para cerrar el hilo. Editado 2: He modificado para que totP sea el conteo de pagadas (no necesitarías mensual).
------------- Saludos desde Tenerife.
|
Publicado por: AnSanVal
Fecha de publicación: 18/Junio/2022 a las 13:01
Hola de nuevo.
(1) ► ASV.- En el evento Click de
Noviembre (supongo cualquier mes) el bucle no es
necesario, para que fila
apunte a la primer fila libre, lo puedes hacer con...
fila = Cells(Rows.Count,
39).End(xlUp).Offset(1).Row
... , de todos modos es preferible
llamar a una
subrutina común para cualquier mes, o mejor aún, como indico en el siguiente
punto.
(2) RC.- «... el
usuario del sistema se apresuró e hizo check en septiembre y el estudiante le
dijo no, solo pagaré hasta agosto, entonces como ya está check debo quitar el
check para que se quite la fila que se agrego...»
► ASV.- Creo que la solución no
debería estar ligada a añadir fila al activar la casilla y eliminar fila al
desactivar la casilla, sino que al activar/desactivar la casilla solo cambie C. Pagadas y C. a pagar, en el formulario y NO en la hoja. Luego cuando los datos sean
firmes y pulses Guardar sea cuando se agreguen los datos a la
hoja y se limpia el formulario en espera de otro alumno.
(3) Si (por la causa que sea) prefieres
guardar con el click, deberías hacer como en mi ejemplo pagos (llamada en el evento a subrutina común), te ahorrarías mucho código. Peeero... el evento Click NO se dispara cuando desactivas la casilla , el evento change se dispara en ambos casos.
Opciones te
ofrezco, ¡Tú decides!
------------- Saludos desde Tenerife.
|
Publicado por: eli1
Fecha de publicación: 20/Julio/2022 a las 16:59
Muy buenas tardes, espero estén muy bien
Aquí un reto para mi tal vez un segundo para mas de uno en este Foro
Estoy queriendo ingresar datos de manera fácil desde un formulario, es un pequeño control de pagos de un colegio para ello ya hice mi formulario, ahora hago unos filtros y me trae al alumno y me pone check en los checkbox que tiene el mes pagado por ejemplo si el alumno pago Febrero al cargar los datos se me cargar y se pone Check en el control lo verán a continuación.
Ahora mi problema radica en por ejemplo el alumno debe pagar 10 mensualidades a lo largo del año y si yo quiero pagar Marzo por ejemplo doy check en el CheckBox de Marzo y si quiere pagar Abril también y así con los otros meses pero ahora me gustaría ir capturando los datos en un array para luego completo pasarlo a la hora de excel.
Pero ahí es cuando comienza mi problema no se como hacerlo ya vi diferentes maneras pero ninguna se acerca a mi necesidad.
Por ejemplo mis campos en excel son estos
Fecha NumeroRecibo Estudiante Mes Monto
me gustaría que en memoria me cree ese arreglo con filas y columnas para después con un botton pasarlos a la hoja.
pero por ejemplo si pago hasta Julio, me tocaría agosto y septiembre o los meses que quiera pagar
por ejemplo si quiere pagar solo Julio que mi arreglo tenga con https://www.calcularhoras.com/ - calculadora de horas , una fila con todas esas columnas y si quiere pagar dos meses que tenga dos filas
mis imágenes
Por ejemplo esta es la imagen cuando inicio el form prácticamente vacío
Bueno no pude subir mis imágenes.
Agradezco la colaboración
|
Hola compañero
Cada vez que se haga ckeck tienes que rellenar la matriz como este ejemplo:
Dim MyWeek, MyDay
MyWeek = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
' Return values assume lower bound set to 1 (using Option Base
' statement).
MyDay = MyWeek(2)&&&&' MyDay contains "Tue".
MyDay = MyWeek(4)&&&&' MyDay contains "Thu".
Y con la la función UBound(MyWeek) te devolverá el numero máximo de elmentos.
|
Publicado por: joaquin16
Fecha de publicación: 26/Julio/2022 a las 02:21
|
Pues yo lo planteo con un código de JavaScript:
var checkboxes = document.getElementById("form1").checkbox;var cont = 0;
for (var x=0; x < checkboxes.length; x++) {
if (checkboxes[x].checked) {
cont = cont + 1;
}
}___________________________ Trabajo con Tecnología de http://https://freewayconsulting.com/consultoria-salesforce/mulesoft/" rel="nofollow - Mulesoft que agiliza la comunicación de varios sistemas.
|
|