Contar los CheckBox que doy Check |
Responder |
Autor | |
RobertoCarlos
Habitual Unido: 12/Marzo/2013 Localización: Bolivia Estado: Sin conexión Puntos: 168 |
Opciones de entrada
Gracias(0)
Enviado: 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
|
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(0)
|
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.
|
|
RobertoCarlos
Habitual Unido: 12/Marzo/2013 Localización: Bolivia Estado: Sin conexión Puntos: 168 |
Opciones de entrada
Gracias(0)
|
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
|
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(0)
|
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.
|
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(0)
|
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. Editado por AnSanVal - 16/Junio/2022 a las 10:39 |
|
Saludos desde Tenerife.
|
|
RobertoCarlos
Habitual Unido: 12/Marzo/2013 Localización: Bolivia Estado: Sin conexión Puntos: 168 |
Opciones de entrada
Gracias(0)
|
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
|
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(1)
|
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.
|
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(0)
|
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.
|
|
RobertoCarlos
Habitual Unido: 12/Marzo/2013 Localización: Bolivia Estado: Sin conexión Puntos: 168 |
Opciones de entrada
Gracias(0)
|
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 Editado por RobertoCarlos - 16/Junio/2022 a las 16:55 |
|
Roberto
|
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(0)
|
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). Editado por AnSanVal - 17/Junio/2022 a las 12:43 |
|
Saludos desde Tenerife.
|
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(0)
|
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! Editado por AnSanVal - 18/Junio/2022 a las 13:17 |
|
Saludos desde Tenerife.
|
|
eli1
Nuevo Unido: 20/Julio/2022 Estado: Sin conexión Puntos: 0 |
Opciones de entrada
Gracias(0)
|
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. |
|
joaquin16
Nuevo Unido: 09/Marzo/2021 Localización: México Estado: Sin conexión Puntos: 13 |
Opciones de entrada
Gracias(0)
|
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 Mulesoft que agiliza la comunicación de varios sistemas. |
|
Responder | |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |