** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - bucle para contar
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

bucle para contar

 Responder Responder
Autor
Mensaje
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita litris Cita  ResponderRespuesta Enlace directo a este mensaje Tema: bucle para contar
    Enviado: 26/Julio/2017 a las 09:15
Buenos dias a todos,

He creado una macro que no me acaba de funcionar. La idea es la siguiente:
Tengo una hoja donde están todos los datos almacenados. De esa hoja me interesa contar cuantas incidencias están en Pendiente y cuantas en Finalizadas (corresponde a la columna E). Esa cuenta la copio en una hoja llamada FotoMes y la pego en dos celdas (todavia no he definido cuales porque no me funciona la fórmula).
En la hoja llamada FotoMes tengo dos celdas en la que escribo el Mes y el año que quiero contabilizar (servirian como filtro) y que me serviran para comparar con las columnas AO y AP que almacenan el mes y año en que se ha creado esa incidencia. La fórmula que he hecho es la siguiente:

Sub FotoMes()

Dim fila&, P&, F&
Dim celda As Range

fila = 2 'para que empiece por la fila 2 en la hoja donde estan todos los datos
P = 0 'contador para pendientes
F = 0 'contador para finalizadas

For Each celda In Worksheets("owssvr").Range("AO" & fila)

    If Cells(1, 2) = Worksheets("owssvr").Range("AO" & fila) & Cells(2, 2) = Worksheets("owssvr").Range("AP" & fila) Then

        If Worksheets("owssvr").Range("E" & filaO2) = "Pendiente" Then
   
            P = P + 1
   
        End If
   
        If Worksheets("owssvr").Range("E" & filaO2) = "Finalizadas" Then
   
            F = F + 1
   
        End If
       
     End If
    
    fila = fila + 1
   
Next celda

End Sub

El problema es que solo entra una vez y cuando hace el primer NEXT sale del bucle. Espero haberme explicado.

Gracias de antemano.

Un saludo.


Editado por litris - 26/Julio/2017 a las 10:57
Ojos que no ven ostia que te metes
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4949
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 26/Julio/2017 a las 21:46

Es normal que solo entre una vez (es lo que le dices). Fíjate en esta línea de tu consulta:


For Each celda In Worksheets("owssvr").Range("AO" & fila)


En esencia le estás diciendo que recorra cada celda del rango que le indicas, pero... ¿Cuántas celdas le indicas en el rango?


- Dado que fila entra al bucle valiendo 2, lo que le dices es:  "¡Recorre cada celda de: Range(AO2)!", y como [AO2] es una sola celda, pues al salir de esa celda...  sale del bucle.


- For Each no funciona así como tú has hecho, esa es la sintaxis para el bucle DO - LOOP.



- En tu caso debes entrar al bucle conociendo de antemano  cual es la última fila del rango que quieres recorrer, por ejemplo:


fila = 2 '<<< si va a empezar siempre en la fila 2, esta variable no es necesaria

filaU=128 '(fila última) para que termine en la fila 128 de la hoja donde estan todos los datos
P = 0 'contador para pendientes
F = 0
'contador para finalizadas

For Each celda In Worksheets("owssvr").Range("AO2:AO"
& filaU)
.
. .

fila = fila + 1 '<<< elimina también esta



Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita litris Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Julio/2017 a las 08:49
Buenos dias AnSanVal,

Muchas gracias como siempre por tu aclaracion y ayuda. Ya he entendido como funciona el bucle y como poner el rango.
He hecho las modificaciones en el código pero hay algo que no me acaba de funcionar y es que nunca entra en el primer IF por lo que las variables F y P se quedan en 0. En la Cells(1,2) escribo el mes y en la cells(2,2) el año.

Sub FotoMes()

Dim fila&, P&, F&, filaU&
Dim celda As Range

filaU = Worksheets("owssvr").Range("A100000").End(xlUp).Row 'Se situa en la última fila

P = 0
F = 0

For Each celda In Worksheets("owssvr").Range("AO2:AO" & filaU)

'Si coincide el mes y el año luego verifico si está en pendiente o finalizada
    If Cells(1, 2) = Worksheets("owssvr").Range("AO" & filaU) & Cells(2, 2) = Worksheets("owssvr").Range("AP" & filaU) Then
   
        If Worksheets("owssvr").Range("E" & filaU) = "Pendiente" Then
   
            P = P + 1
   
        End If
   
        If Worksheets("owssvr").Range("E" & filaU) = "Finalizadas" Then
   
            F = F + 1
   
        End If
       
     End If
   
Next celda

Quizás me estoy dejando algo.

Un saludo!
Ojos que no ven ostia que te metes
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4949
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Julio/2017 a las 12:24

Es el mismo caso (error en el rango) más el «Y» condicional, que te explico aquí abajo.


Cuando indiques un rango debes asegurarte que le estás diciendo lo que realmente le quieres decir.



1º.- Interpreto que con...

If Cells(1, 2) = Worksheets("owssvr").Range("AO" & filaU) & Cells(2, 2) = _

        Worksheets("owssvr").Range("AP" & filaU) Then

... pretendiste decir...

If Cells(1, 2) = Worksheets("owssvr").Range("AO" & filaU) AND Cells(2, 2) = _

        Worksheets("owssvr").Range("AP" & filaU) Then

... pues el  caracter  &  es un caracter de concatenación, por ejemplo (suponiendo que en ("owssvr") tus datos llegan hasta la fila 300)  "AO" & filaU equivale a "AO300", pero si quieres decir  que se cumpla una cosa y otra debes usar  AND .


2º.- Aún corrigiendo el AND (y suponiendo que tus datos llegan hasta la fila 300) le estás diciendo...

if Range("B1") = Worksheets("owssvr").Range("AO300") AND Range("B2")= _

        Worksheets("owssvr").Range("AP300") Then

...  :-(  es decir; siempre comparas con [AO300] y con [AP300] pero no con la fila que estás evaluando, pues filaU siempre vale 300.


Lo correcto sería:

If Cells(1, 2) = celda.Value And Cells(2, 2) = celda.Offset(, 1).Value Then




>>> Corrige del mismo modo en las líneas que tienes debajo (en tu código).




Editado por AnSanVal - 27/Julio/2017 a las 12:27
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita litris Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Julio/2017 a las 12:56
Muchas gracias de nuevo AnSanVal. He modificado la linea tal como comentas -> If Cells(1, 2) = celda.Value And Cells(2, 2) = celda.Offset(, 1).Value Then y aunque coincidan los dos valores para poder entrar en el IF no lo hace. He ejecutado la macro paso a paso para ver si algun dato está mal escrito, acento...pero nada.

Tambien he estado revisando como funciona el offset por internet y así he hecho unos cambios en el código.

Sub FotoMes()

Dim fila&, P&, F&, filaU&
Dim celda As Range

filaU = Worksheets("owssvr").Range("A100000").End(xlUp).Row 'Se situa en la última fila

P = 0
F = 0

For Each celda In Worksheets("owssvr").Range("AO2:AO" & filaU)
   
    If Cells(1, 2) = celda.Value And Cells(2, 2) = celda.Offset(, 1).Value Then 'nunca llega a entrar aunque el AND se cumple
   
        'If Worksheets("owssvr").Range("E" & filaU) = "Pendiente" Then
        If celda.Offset(, -36).Value = "Pendiente" Then
       
            P = P + 1
   
        End If
       
        If celda.Offset(, -36).Value = "Finalizadas" Then
        'If Worksheets("owssvr").Range("E" & filaU) = "Finalizadas" Then
   
            F = F + 1
   
        End If
       
     End If
   
Next celda

Un saludo y gracias.
Ojos que no ven ostia que te metes
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4949
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Julio/2017 a las 13:35

Te lo dejo funcionando (así trabajo menos Wink):


Sub FotoMes()

Dim fila&, P&, F&, filaU&

Dim celda As Range

filaU = Worksheets("owssvr").Range("AO100000").End(xlUp).Row 'Se situa en la última fila

For Each celda In Worksheets("owssvr").Range("AO2:AO" & filaU).Cells

'Si coincide el mes y el año luego verifico si está en pendiente o finalizada

If Cells(1, 2) = celda.Value And Cells(2, 2) = celda.Offset(, 1).Value Then

If celda.Offset(, -36).Value = "Pendiente" Then

P = P + 1

ElseIf celda.Offset(, -36).Value = "Finalizadas" Then

F = F + 1

End If

End If

Next celda

'Aquí debes recuperar los valores de P y F.

End Sub


Nota: He escrito el código sin sangrar, para evitar errores al copiarlo y pegarlo (se suelen agregar «caracteres no deseados»). Para mayor claridad de lectura, le añades la sangría en tu equipo.




Si lo que pretendes es aprender VBA... ¡Vale!, es una forma de aprender, pero si lo que quieres es simplemente contar Finalizadas y Pendientes; sería más eficiente con la función integrada CONTAR.SI.CONJUNTO, o filtrando los datos, o con una tabla dinámica. En los dos últimos casos podrías saber cuantos y cuales son.





Editado por AnSanVal - 27/Julio/2017 a las 13:44
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita litris Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 28/Julio/2017 a las 08:47
Hola AnSanVal,

Me ha ido perfecto con la función integrada CONTAR.SI.CONJUNTO.

Muchas gracias como siempre.

Un saludo.
Ojos que no ven ostia que te metes
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita litris Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 28/Julio/2017 a las 11:33
Queria hacerte una consulta más. Se puede poner que coja el valor de una celda o necesariamente tengo que ponerle yo los valores. Para explicarme mejor te pongo ejemplo:

=CONTAR.SI.CONJUNTO(owssvr!$E:$E;"Pendiente";owssvr!$AO:$AO;"febrero";owssvr!$AP:$AP;"2017")

Donde pone pendiente decirle que me coja el valor que hay por ejemplo en la celda A1. Lo digo más que nada porque esta formula la tengo que poner para todos los meses y seria para hacerlo mas rápido.

Gracias.
Ojos que no ven ostia que te metes
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4949
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 28/Julio/2017 a las 12:54

Si, por supuesto (con probar lo sabrías).


 Incluso puedes emplear rangos con nombre, para las referencias a las columnas de la base de datos.



Por ejemplo:   En  Fórmulas > Nombres definidos > Administrador de nombres > ...


... Nuevo > ...

       Nombre:   mes

       Hace referencia a:   =DESREF(owssvr!$AO$1;1;0;CONTAR(owssvr!$AP:$AP))

       Aceptar.


... Nuevo > ...

       Nombre:   año

       Hace referencia a:   =DESREF(owssvr!$AP$1;1;0;CONTAR(owssvr!$AP:$AP))

       Aceptar.


... Nuevo > ...

       Nombre:   estado

       Hace referencia a:   =DESREF(owssvr!$E$1;1;0;CONTAR(owssvr!$AP:$AP))

       Aceptar > Cerrar.



Aplicación: 

Con  [B1] julio, [B2]  2017  y  [A5]  Finalizadas, la fórmula sería   =CONTAR.SI.CONJUNTO(mes;B1;año;B2;estado;A5)

Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable