Visual Basic - Ciclo anidado

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

Ciclo anidado

Publicado por Pablo (3 intervenciones) el 20/04/2017 01:15:37
Hola a todos
Soy nuevo programando, me agrada y me parece útil aprender a programar. Sin embargo como todo principiante se me presentan problemas. Por ejemplo tengo una planilla en EXCEL, utilizando la parte de programación (no estoy seguro si se llama VISUAL o Macros), trato de que mi algoritmo lea unos datos de una planilla y calcule los promedios de las temperaturas de un año, pero están están divididas por estaciones(verano, invierno, etc), es decir tenemos 4 promedios, uno por cada estación. Dispongo de 3 años en datos, es decir tengo 3 años de estaciones.

Excel

Entonces usando un ciclo for pensaba que leyera los datos de esta forma.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub prueba1()
sumaa = 0
l = 0
For i = 4 To 15
 dato = Cells(i, 3)
sumae = 0
k = 0
         For j = 4 To 15 Step 4
            dato = Cells(j, 3)
                If dato > -50 And dato < 150 Then
                    sumae = sumae + dato
                        k = k + 1
                End If
        Next j
        p = sumae / k
        Cells(17, 4) = p
        sumaa = p
        l = l + 1
        Next i
        pt = sumaa / l
        Cells(17, 5) = pt
        End Sub

sin embargo solo resulta para el ciclo interior, para poder obtener el promedio de los promedios de los años nos que hacer.

Espero les agrade, probablemente sea muy sencillo pero aun no se me ocurre.
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
Imágen de perfil de Antoni Masana
Val: 1.229
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Ciclo anidado

Publicado por Antoni Masana (444 intervenciones) el 20/04/2017 07:14:53
En la línea 17 debería poner: sumaa = sumaa + p

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub prueba1()
    sumaa = 0
    l = 0
    For i = 4 To 15
        dato = Cells(i, 3)
        sumae = 0
        k = 0
        For j = 4 To 15 Step 4
            dato = Cells(j, 3)
            If dato > -50 And dato < 150 Then
                sumae = sumae + dato
                k = k + 1
            End If
        Next j
        p = sumae / k
        Cells(17, 4) = p
        sumaa = p
        l = l + 1
    Next i
    pt = sumaa / l
    Cells(17, 5) = pt
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
1
Comentar
sin imagen de perfil

Ciclo anidado

Publicado por Pablo Pinuer (3 intervenciones) el 21/04/2017 02:05:31
Estimado Antoni
Quisiera agradecerte por responder a mi pregunta. Sin embargo, aun usando corrección el programa no logra calcular los promedios de los promedios.
Sigo intentando resolverlo, si tienes mas sugerencias son bienvenidas.

De ante manos gracias
Atte.
Pablo
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 wilmer
Val: 2
Ha aumentado su posición en 46 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Ciclo anidado

Publicado por wilmer (1 intervención) el 21/04/2017 03:10:24
Hola, con la corrección en la linea 17 (sumaa=sumaa+p) debería dar el resultado, pero veo que la variable dato la usa al inicio del primer for lo que no se me hace lógico. hice la corrección y si me resulto. suerte
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

Ciclo anidado

Publicado por Pablo (3 intervenciones) el 21/04/2017 03:15:26
Wilmer
Muchas gracias por atender el mensaje, ¿serias tan amable de explicarme por que no es coherente que pida el dato en esa parte del programa? La idea es que calcule el promedio de las primeras 4 estaciones y luego calcule los promedios de los promedios.

En fin seguiré intentando.
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.229
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Ciclo anidado

Publicado por Antoni Masana (444 intervenciones) el 21/04/2017 08:12:22
Se puede hacer en un solo FOR pero resulta mas complicado de entender si se es novato.
Si la tabla es muy grande hay que hacerlo en una sola lectura por que es mas optimo.
Lo he realizado en dos Bucles.

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
Option Explicit
 
Sub prueba1()
    Dim a As Integer, Suma_est As Long, Dato As Long, _
        b As Integer, Suma_Ano As Long, Anio As Integer
    Dim Estacion As String, Contador As Integer, Media As Long
 
    ' </> ---&--- Media Estacion
 
    For a = 4 To 7
        Estacion = Cells(a, 2)
        Suma_est = 0
        Contador = 0
 
        For b = a + 0 To 15 Step 4
            Dato = Cells(b, 3)
            If Dato > -50 And Dato < 150 Then
                Suma_est = Suma_est + Dato
                Contador = Contador + 1
            End If
        Next
        Media = Suma_est / Contador
        Cells(a + 13, 3) = Media
        Cells(a + 13, 4) = "Media " & Estacion
    Next
 
    ' </> ---&--- Media Año
 
    Anio = 0
    For a = 4 To 12 Step 4
        Anio = Anio + 1
        Suma_Ano = 0
 
        For b = a + 0 To a + 3
            Dato = Cells(b, 3)
            If Dato > -50 And Dato < 150 Then
                Suma_Ano = Suma_Ano + Dato
            End If
        Next
        Media = Suma_Ano / 4
        Cells(Anio + 22, 3) = Media
        Cells(Anio + 22, 4) = "Año " & Anio
    Next
End Sub

Este es con un solo Bucle, el principal calcula la media por año y el primer año hace el calculo por estaciones

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
Sub prueba2()
    Dim a As Integer, Suma_est As Single, Dato As Single, _
        b As Integer, Suma_Ano As Single, Anio As Integer, _
        c As Integer
    Dim Estacion As String, Contador As Integer, Media As Single
    Dim Lin_Est As Integer, _
        Lin_Ano As Integer
 
    Lin_Est = 17
    Lin_Ano = 23
    Anio = 0
 
    For a = 4 To 12 Step 4
        Anio = Anio + 1
        Suma_Ano = 0
 
        ' --- Calcula la media por estacion el primer año
 
        If a = 4 Then
           For b = 4 To 7
               Estacion = Cells(b, 2)
               Suma_est = 0
               Contador = 0
               For c = b To 15 Step 4
                   Dato = Cells(c, 3)
                   If Dato > -50 And Dato < 150 Then
                      Suma_est = Suma_est + Dato
                      Contador = Contador + 1
                   End If
               Next
               Media = Suma_est / Contador
               Cells(Lin_Est, 7) = Media
               Cells(Lin_Est, 8) = "Media " & Estacion
               Lin_Est = Lin_Est + 1
           Next
        End If
 
        ' --- Calcula la media del año
 
        For b = a + 0 To a + 3
            Dato = Cells(b, 3)
            If Dato > -50 And Dato < 150 Then
                Suma_Ano = Suma_Ano + Dato
            End If
        Next
        Media = Suma_Ano / 4
        Cells(Lin_Ano, 7) = Media
        Cells(Lin_Ano, 8) = "Año " & Anio
        Lin_Ano = Lin_Ano + 1
    Next
End Sub

El segundo codigo es lo que deseabas hacer y no te funcionaba, puedes ejecutar las dos macros y veras que dan el mismo resultado, el primero lo deja en las columnas C:D y el segundo en las columnas G:H. Todo a partir de la linea 17.

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