Visual Basic para Aplicaciones - Checkboxes y Etiquetas

Life is soft - evento anual de software empresarial
 
Vista:

Checkboxes y Etiquetas

Publicado por Pablo (77 intervenciones) el 09/10/2017 13:17:09
Hola de nuevo.
He ideado un configurador sencillo. El usuario elige un producto en un formulario inicial y de forma dinámica le llevo a un segundo formulario dónde le doy a elegir las opciones (un listado de checkboxes), que pueden ser 10, 11, 12, 20 o tan solo 3, 4 o 5.
Bien, una vez elegidas las opciones que quiere el usuario, las paso a un albarán (una hoja excel).
En el caption de cada checkbox he puesto lo que yo denomino PartNumber (un código alfanumérico). Pero también, le he puesto al lado una etiqueta con la descripción, para que el usuario sepa qué es lo que está eligiendo.
He conseguido pasar los partnumbers que va eligiendo el usuario (seguidos) al albarán, pero ahora quiero pasar también las etiquetas con su descripción y ahí me pierdo.
El checkbox tiene un value, que puede ser verdadero o falso, y los recorro dentro de un For each con una clausula IF.
He conseguido que el nombre de la etiqueta sea el caption del checkbox, pero no veo forma de relacionarlo en el For each, o realizar un For each solo para las etiquetas que me relacione los check boxes seleccionados (para obtener su caption) y buscar la etiqueta que cuyo nombre coincida con ese caption.
No se si me explico.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Checkboxes y Etiquetas

Publicado por JuanC (565 intervenciones) el 10/10/2017 19:24:00
no me queda del todo claro el problema, por las dudas igualmente te sugiero que uses
la propiedad Tag del label para asociar con otro componente (también podrías usar el Nombre del componente)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Checkboxes y Etiquetas

Publicado por Pablo (77 intervenciones) el 11/10/2017 09:36:19
Gracias por tu ayuda.
Ahora mismo, el label.name es igual al checkbox.caption.
Creo las parejas chekbox, cuyo caption es el partNumber de un artículo, y junto a él una etiqueta cuyo caption es la descripción de ese artículo.
El usuario elige los artículos que desea, haciendo que el checkbox.value = True. Con un For Each recorro todos los checkboxes y obtengo los partNumber de los artículos seleccionados que paso a la hoja del Albarán.
Lo que no se hacer, o no encuentro la forma, es: Ya que encuentro un checkbox seleccionado y conozco su caption, llamar a la etiqueta cuyo Name es el caption del checkbox seleccionado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Checkboxes y Etiquetas

Publicado por JuanC (565 intervenciones) el 11/10/2017 14:28:45
sería mucho más simple si publicaras el libro...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Checkboxes y Etiquetas

Publicado por Pablo (77 intervenciones) el 12/10/2017 10:44:52
Gracias Juan de nuevo por tu tiempo.
No soy programador, solo tengo la cabeza muy dura.
Al final lo he conseguido.

Una consulta me trae a mi libro excel un listado de PN's y Descripciones, que escribe en una hoja temporal.
Los leo y los PN's los convierto en Checkbox, y la descripción en una Label
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Private Sub creacheckbox()
Dim selectores, labeles As Control
Dim TopControl, fila, filas, i As Integer
Dim s_Etiqueta, l_EtiQueta As String
 
fila = 2
TopControl = 52
'Importamos la lista de Opcionales de dónde la deja la consulta a la DB
'Contamos el número de filas que ocupará el form.
filas = Hoja1.Range("A" & Rows.Count).End(xlUp).Row
 
'MsgBox filas
'Generación de los checkboxes con el PN y la Descripción
For i = 2 To filas
s_Etiqueta = Hoja1.Cells(fila, 1)
l_EtiQueta = Hoja1.Cells(fila, 2)
    Set selectores = UserForm1.Controls.Add("forms.CheckBox.1")
        With selectores
            .Top = TopControl
            .Height = 19
            .Width = 100
            .Left = 30
            .Caption = "  " & s_Etiqueta   'Dos espacios para que el PN no quede tan cerca del botón
            .Visible = True
            .Tag = s_Etiqueta       'Hay que usar strings mejor que integers
            .BackStyle = fmBackStyleTransparent
            .Font.Name = "tahoma"
            .Font.Size = 11
            .TextAlign = fmTextAlignLeft
        End With
    Set labeles = UserForm1.Controls.Add("forms.label.1")
        With labeles
            .Top = TopControl
            .Height = 19
            .Width = 300
            .Left = 135
            .Caption = l_EtiQueta
            .Tag = s_Etiqueta
            .Visible = True
            .BackStyle = fmBackStyleTransparent
            .Font.Name = "tahoma"
            .Font.Size = 10
            .TextAlign = fmTextAlignLeft
        End With
    fila = fila + 1
'Ver si la separación de 25 es suficiente para que visualmente quede ordenado.
    TopControl = TopControl + 25
    'MsgBox i
Next i
'Hacemos que la altura del formulario se adapte al número de checkboxes
UserForm1.Height = TopControl + 60
 
End Sub

Ya tengo mi formulario con un listado de opciones para que el usuario elija las que considere oportunas.
(Ahora tengo un problema añadido y es que algunas configuraciones no me entran en pantalla y el formulairo es muy grande)

Presentado el formulairo al usuario, este elige las opciones que necesite y al pulsar un botón, van al Albarán (para este ejercicio otro lugar de la misma hoja de momento)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub verEtiquetas()
Dim tal As Control
Dim cosa As String
Dim Fila1, Fila2 As Integer
Fila1 = 2
Fila2 = 2 'Esto es un apaño.
 
For Each tal In Me.Controls
    If TypeOf tal Is MSForms.CheckBox Then
        If tal.Value = True Then
            cosa = tal.Tag
            Hoja1.Cells(Fila1, 6).Value = tal.Caption
            'MsgBox tal.Tag & "  " & tal.Caption & "  " & Fila1
            Fila1 = Fila1 + 1
        End If
    End If
    If TypeOf tal Is MSForms.Label Then
        If tal.Tag = cosa Then
        	Hoja1.Cells(Fila2, 7).Value = tal.Caption
        	'MsgBox tal.Tag & "  " & tal.Caption & "  " & Fila2
        	Fila2 = Fila2 + 1
        End If
    End If
Next tal
End Sub

He descubierto cosas nuevas, como el funcionamiento de For Each, así es que he tenido que hacer un apaño para llevar dos contadores uno para los PN's y otro para las descripciones, pero al final funciona.
Pongo Msgboxes por todos lados para ver los valores que van tomando las variables.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Checkboxes y Etiquetas

Publicado por JuanC (565 intervenciones) el 12/10/2017 13:09:29
bien hecho, te hice un par de pequeños cambios...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Private Sub verEtiquetas()
Dim tal As Control
Dim cosa As String
Dim Fila1, Fila2 As Integer '//Estás declarando un Variant y un Integer
                            '//Lo correcto es: Dim Fila1 As Integer, Fila2 As Integer
                            '//o de la forma abreviada: Dim Fila1%, Fila2%
                            '//Otra cosa, cuando se trata de variables para fila
                            '//es recomendable usar tipo Long, Integer suele quedarse corto...
                            '//Por lo que quedaría: Dim lFila1&, lFila2&   (dos tipo Long)
Fila1 = 2
Fila2 = 2 'Esto es un apaño.
 
For Each tal In Me.Controls
    If TypeOf tal Is MSForms.CheckBox Then
        If tal.Value = True Then
            cosa = tal.Tag
            Hoja1.Cells(Fila1, 6).Value = tal.Caption
            'MsgBox tal.Tag & "  " & tal.Caption & "  " & Fila1
            Fila1 = Fila1 + 1
        End If
    ElseIf TypeOf tal Is MSForms.Label Then   '//En lugar de hacer otra consulta If puse un ElseIf
           If tal.Tag = cosa Then
              Hoja1.Cells(Fila2, 7).Value = tal.Caption
              'MsgBox tal.Tag & "  " & tal.Caption & "  " & Fila2
              Fila2 = Fila2 + 1
           End If
    End If
Next tal
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar