Visual Basic para Aplicaciones - contar la frecuencia de un dato

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

contar la frecuencia de un dato

Publicado por salvador (7 intervenciones) el 02/02/2018 05:01:05
hola comunidad tengo una consulta tengo en una hoja de excel tres columanas una es "fecha" , "folio" y la otra es "Tipo cliente" quisera saber cual es la frecuencia con la que aparece un valor en "tipos de cliente" ejemplo "pareja" pero que en folio solo cuente los valores unicos y ese resultado lo muestre en un texbox.

Folio Tipo Cliente
52 pareja
52 pareja
52 pareja
51 familia
51 familia
50 señora
50 señora
50 señora
49 pareja
49 pareja
48 señora
48 señora

el resultado para "pareja" seria 2. y lo muestre en un textbox de userform. el rango lo ingreso igual en dos textbox "fecha inicial y fecha final"y presionando un boton quiero el resultado. muchas gracias de antemano
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
sin imagen de perfil

contar la frecuencia de un dato

Publicado por salvador (7 intervenciones) el 12/02/2018 00:13:53
no pude ejecutar la macro, soy nuevo en esto apenas estoy aprendiendo, te agradeceria que me orientaras con la macro
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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

contar la frecuencia de un dato

Publicado por Antoni Masana (498 intervenciones) el 12/02/2018 07:42:04
En A1:B12 puse estos datos:

1
2
3
4
5
6
7
8
9
10
11
12
52	pareja
52	pareja
52	pareja
51	familia
51	familia
50	señora
50	señora
50	señora
49	pareja
49	pareja
48	señora
48	señora

Y esta es la macro:

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
Option Explicit
 
Sub Macro1()
    Dim Lin As Single, Tabla(20) As String, Cuenta(20) As Single, _
        Pun As Single, a As Integer, Nuevo As Boolean, Texto As String
 
    ' ---&--- Inicialñizo la tabla y las variables
    For a = 1 To 200
        Tabla(a) = "": Cuenta(a) = 0
    Next
    Pun = 0
    Lin = 1
    Col = 2
    ' ---&--- Busca el la columna 2 (B) hasta una celda vacia
    While Cells(Lin, Col) <> ""
        Texto = Cells(Lin, Col)             ' --- Texto Celda
        ' --- Busca si ya existe en la tabla
        Nuevo = True
        For a = 1 To 20
            If Tabla(a) = Texto Then
               Cuenta(a) = Cuenta(a) + 1
               Nuevo = False
            End If
        Next
        ' --- No existe, es uno nuevo
        If Nuevo Then
           Pun = Pun + 1
           Tabla(Pun) = Texto: Cuenta(Pun) = 1
        End If
        ' --- Salto a la línea siguiente
        Lin = Lin + 1
    Wend
    ' --- Mota el texto para el TexBox
    Texto = ""
    For a = 1 To Pun
        Texto = Texto & Cuenta(a) & " - " & Tabla(a) & vbCrLf
    Next
    ' --- Resultado final
    MsgBox Left$(Texto, Len(Texto) - 2), vbInformation
End Sub

La macro es a nivel orientativo y puede tener cambios en función de como estén tus datos.

Un par de comentarios de la macro LIN es la línea o fija y COL es la columna y 2 corresponde a la B

Si tienes más duras preguntame.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

contar la frecuencia de un dato

Publicado por salvador (7 intervenciones) el 12/02/2018 15:18:35
le doy ejecutar directo desde Vba y me sale un error "la variable "col" no esta definida"
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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

contar la frecuencia de un dato

Publicado por Antoni Masana (498 intervenciones) el 12/02/2018 19:06:04
Hay un par de fallos.

Si se le quita la Option Explicit no da algunos de estos errores pero es mejor ponerlo y definir las variables.
Faltaba definir la variable Col y el primer FOR es de 1 a 20 y no 200 como estaba

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
Option Explicit
 
Sub Macro1()
    Dim Lin As Single, Tabla(20) As String, Cuenta(20) As Single, _
        Pun As Single, a As Integer, Nuevo As Boolean, Texto As String, _
        Col As Single
 
    ' ---&--- Inicializa la tabla y las variables
    For a = 1 To 20
        Tabla(a) = "": Cuenta(a) = 0
    Next
    Pun = 0
    Lin = 1
    Col = 2
    ' ---&--- Busca el la columna 2 (B) hasta una celda vacia
    While Cells(Lin, Col) <> ""
        Texto = Cells(Lin, Col)             ' --- Texto Celda
        ' --- Busca si ya existe en la tabla
        Nuevo = True
        For a = 1 To 20
            If Tabla(a) = Texto Then
               Cuenta(a) = Cuenta(a) + 1
               Nuevo = False
            End If
        Next
        ' --- No existe, es uno nuevo
        If Nuevo Then
           Pun = Pun + 1
           Tabla(Pun) = Texto: Cuenta(Pun) = 1
        End If
        ' --- Salto a la línea siguiente
        Lin = Lin + 1
    Wend
    ' --- Mota el texto para el TexBox
    Texto = ""
    For a = 1 To Pun
        Texto = Texto & Cuenta(a) & " - " & Tabla(a) & vbCrLf
    Next
    ' --- Resultado final
    MsgBox Left$(Texto, Len(Texto) - 2), vbInformation
End Sub

Saludos.
\\//_
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
sin imagen de perfil

contar la frecuencia de un dato

Publicado por salvador (7 intervenciones) el 13/02/2018 21:19:45
ya corrio el programa, pero no me arroja los datos que yo estoys buscando es decir, pareja = 2, familia = 1, señora = 2, es decir los datos de la columna "A" son los folios y solo existen 5 folios, 52, 51, 50, 49 y 48 pero algunos estan repetidos entonces lo que yo quiero es que cuente cuantas veces aparece "pareja" "familia" y "señora" por folio.

se me ocurria primero hacer un siclo "for" y un if en donde te de acceso solo si no ha aparecido el folio, despues tome el valor de la columna "B" que le corresponde y lo cuente. pero no se como hacerlo.
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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

contar la frecuencia de un dato

Publicado por Antoni Masana (498 intervenciones) el 14/02/2018 00:09:40
Esa parte no la había entendido.

Haber si así mejora.

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
Option Explicit
 
Sub Macro1()
    Dim Lin As Single, Tabla(20) As String, Cuenta(20) As Single, _
        Pun As Single, a As Integer, Nuevo As Boolean, Texto As String, _
        Col As Single, Folio As String, Libro(20) As String
 
    ' ---&--- Inicializa la tabla y las variables
    For a = 1 To 20
        Tabla(a) = "": Cuenta(a) = 0: Libro(a) = ""
    Next
    Pun = 0
    Lin = 1
    Col = 2
    ' ---&--- Busca el la columna 2 (B) hasta una celda vacia
    While Cells(Lin, Col) <> ""
        Texto = Cells(Lin, Col)             ' --- Texto Celda
        Folio = Cells(Lin, Col - 1)
        ' --- Busca si ya existe en la tabla
        Nuevo = True
        For a = 1 To 20
            If Tabla(a) = Texto Then
               If InStr(Libro(a), Folio) = 0 Then
                  Cuenta(a) = Cuenta(a) + 1
                  Libro(a) = Libro(a) + " " + Folio
               End If
               Nuevo = False
            End If
        Next
        ' --- No existe, es uno nuevo
        If Nuevo Then
           Pun = Pun + 1
           Tabla(Pun) = Texto: Cuenta(Pun) = 1
           Libro(Pun) = Folio
        End If
        ' --- Salto a la línea siguiente
        Lin = Lin + 1
    Wend
    ' --- Mota el texto para el TexBox
    Texto = ""
    For a = 1 To Pun
        Texto = Texto & Cuenta(a) & " - " & Tabla(a) & " = " & Libro(a) & vbCrLf
    Next
    ' --- Resultado final
    MsgBox Left$(Texto, Len(Texto) - 2), vbInformation
End Sub

Saludos.
\\//_
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
sin imagen de perfil

contar la frecuencia de un dato

Publicado por salvador (7 intervenciones) el 16/02/2018 07:14:06
espectacular, si me funciono bien, ahora estoy adaptándolo a mi código, pero me surge una duda las dimensiones de tabla (20), cuento (20) y libro (20) y es que pasa que este código me ayudara a consultar datos dentro de una base de datos muy grande y los rangos que analizare son variados es decir como pueden ser 10 o 1000, los rango yo los defino desde dos textbox, me podrias sugerir algo? de antemano muchas gracias
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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

contar la frecuencia de un dato

Publicado por Antoni Masana (498 intervenciones) el 16/02/2018 10:56:02
En mi ejemplo he puesto 20 elementos porque solo necesitaba 3 y no me pasaría, en tu caso es diferente.
Puedes definir la tabla a 10.000 y puede ser demasiado grande o quedarse corta.
Otra opción es predefinir unos cuantos he ir aumentando según la necesidad.
A modo de ejemplo te pongo parte del código por que es muy largo para esta ventana y te marco los cambios
Defino la tabla a 2000 elementos y voy aumentando de 500 en 500 según necesidad.

Te pongo parte del código y resalto los 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
Sub Macro1()
    Dim Lin As Single, Tabla(2000) As String, Cuenta(2000) As Single, _
        Pun As Single, a As Integer, Nuevo As Boolean, Texto As String, _
        Col As Single, Folio As String, Libro(2000) As String, Maximo as Single
 
        Maximo = 2000
    ...
        For a = 1 To Pun
            If Tabla(a) = Texto Then
               If InStr(Libro(a), Folio) = 0 Then
                  Cuenta(a) = Cuenta(a) + 1
                  Libro(a) = Libro(a) + " " + Folio
               End If
               Nuevo = False
            End If
        Next
    ...
        ' --- No existe, es uno nuevo
        If Nuevo Then
           Pun = Pun + 1
           If Pun > Maximo THEN
              Maximo = Maximo + 500
              ReDim Preserve Tabla(Maximo), Libro(Maximo) Cuenta(Maximo)
           End If
           Tabla(Pun) = Texto: Cuenta(Pun) = 1
           Libro(Pun) = Folio
        End If
    ...
End Sub

En el primer FOR he cambiado el 20 no por Maximo sino por el PUN que es el número de elementos que hay en la tabla.
Si tengo 2 elementos en la tabla y 1998 vacíos que necesidad hay de recorrelos todos si a partir del tercero yo no lo encontrara.
Estos detalles optimizan los procesos.


Saludos.
\\//_
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
sin imagen de perfil

contar la frecuencia de un dato

Publicado por salvador (7 intervenciones) el 17/02/2018 17:29:35
y por ultimo, me gustaria extraer los datos por separado que corresponden a "pareja" "señora" "familia" en diferentes variables, no se como extraerlos de la variable "texto". algun consejo?
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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

contar la frecuencia de un dato

Publicado por Antoni Masana (498 intervenciones) el 17/02/2018 21:21:23
Y lo pongo en la variable texto para mostrarlo en el MsgBox.

Los datos los tienes en las tablas:

1
2
3
4
Cuenta() --  Son los diferentes textos: "pareja" "señora" "familia"
Tabla()  --  Es el numero de veces que sale en paginas diferentes.
Libro()  --  Son las paginas en las que sale.
Pun      --  Es el numero de elementos con datos que tiene las tablas.

No saque los datos del la variable Texto, sacalós directamente de las tablas.

De hecho lo que hay después del Wend es para que veas lo que hace la macro y si saca los datos como los necesitas a partir aqui haces lo que necesites

Esto solo es valido para las pruebas y la macro la puedes llamar como más te guste.

1
2
3
4
5
6
7
8
9
10
11
Sub Macro1()
    ...
    Wend
    ' --- Mota el texto para el TexBox
    Texto = ""
    For a = 1 To Pun
        Texto = Texto & Cuenta(a) & " - " & Tabla(a) & " = " & Libro(a) & vbCrLf
    Next
    ' --- Resultado final
    MsgBox Left$(Texto, Len(Texto) - 2), vbInformation
End Sub

Saludos.
\\//_
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
sin imagen de perfil

contar la frecuencia de un dato

Publicado por salvador (7 intervenciones) el 18/02/2018 02:42:01
espectacular!!! gracias por tu tiempo y conocimiento. ya quedo todo funcionando bien.
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