MACRO contar. Si. Conjunto con 2 condiciones y valores únicos

Espero si me ayuden por favor!

Tengo un libro del cual en la col B tengo las fechas que van ala par con la col C los folios y en QUE las incidencias según la fecha entonces quiero contar cuantos veces esta la incidencia "PENDIENTE"

Supongamos:

COL B                                              COL C                                                       COL K

15/03                                                    92                                                 pendiente                                                     

15/03                                                    92                                                pendiente                                                

15/03                                                     92                                               pendiente                                      

16/03                                                     92                                                entregado    

con esta macro

res = Application.WorksheetFunction.CountIfs(Range("B2:B20"), Range("B20"), Range("K2:K20"), Range("K20"))

      el folio 92 me cuanta 3 veces "pendiente"      cuando en realidad solo es una vez,

¿Hay alguna macro para realizar lo que busco? Si son tan amables de decirme si tampoco existe :C para que lo de por perdido y contiene... También lo valorare saludos!                            

1 Respuesta

Respuesta
1

No entendí tu ejemplo.

En el ejemplo que pusiste no se ven las filas, supongo que el último registro de tu ejemplo:

16/03                                                     92                                                entregado    

Está en la fila 20

Tu macro

res = WorksheetFunction.CountIfs(Range("B2:B20"), Range("B20"), Range("K2:K20"), Range("K20"))

Lo que hace es contar del b2 al b20 cuáles fechas son iguales a b20 (16/03) y que también de k2 a k20 cuáles son iguales a K20 (entregado)

El resultado es 1.

Pero en tu explicación dices:

"el folio 92 me cuanta 3 veces "pendiente" cuando en realidad solo es una vez"

Eso es lo que ya no entiendo, en la fórmula estás contando lo que tenga "entregado" pero en tu explicación quieres contar lo que está en "pendiente"


La fórmula está bien, pero no sé qué quieres contar.

¿Podrías poner una imagen donde se vean las filas y las columnas de excel y con algún color indicar qué quieres contar?


Nota: Podrías cambiar la pregunta de "Anónimo", finalmente tu usuario puede ser un seudónimo, de esa forma me es más fácil darle seguimiento a la respuesta.

Ok mira:

En la columna B tengo las fechas, C los folios Y en QUE las incidencias entre ellas puede ser:

Entregado y no entregado

Su poniendo que yo aplico la macro (contar. Si. Conjunto) que puse arriba :

res = WorksheetFunction.CountIfs(Range("B2:B20"), Range("B20"), Range("K2:K20"), Range("K20"))

El result ado me arrojara 2 como “pendientes” y es correcto, pero viendo la columna C corresponde al mismo folio 93 osea que en realidad solo hay 1 pendiente (esto quiere decir que se duplica)

Ahora si yo aplico la misma macro pero ahora en:

res = WorksheetFunction.CountIfs(Range("B2:B20"), “lunes 13/marzo/17”, Range("K2:K20"), “pendiente”)  

Este me arrojara 6 pero si nos vamos a col C “folio” solo hay 2 folios alo que debería ponerme que solo 2 “pendientes” hay el día lunes 13 de marzo/17

Por otra parte en caso de aplicar la misma macro:

res = WorksheetFunction.CountIfs(Range("B2:B20"), “lunes 13/marzo/17”, Range("K2:K20"), “pendiente”)  

Este me debería arrojar ahora solo 1 porque volviendo a la col C “folios” son 2 pero solo 1 de ellos cumple con la condición de “pendiente” ya que el otro es “Entregado” entonces es algo así que necesito para saber cuantos folios del día TAL están pendientes por entregar.

NOTA: lo puse anónimo porque creí que este seria una macro fácil que estoy complicándome

ah, y pues si me preguntas por que realice mi tabla es porque me sugeriste una base de datos más o menos así.

Entonces te falta la condición del folio:

Tienes que buscar en el rango las fechas = 15/mar, los folios = 93 y la incidencia = "Pendiente"

En tu ejemplo tienes 2 registros del 15 de marzo, con folio 93 y "Pendiente"

La macro con las 3 condiciones:

res = WorksheetFunction.CountIfs(Range("B2:B20"), Range("B20"), _
                                 Range("C2:C20"), Range("C20"), _
                                 Range("K2:K20"), Range("K20"))

En tu imagen se ven 2 registros que tienen esas coincidencias, no sé por qué dices que solamente debería haber 1 y que te lo está duplicando. No está duplicando nada, en realidad tienes 2 registros.

Nota aparte, tampoco entiendo por qué en el mismo rango de criterios incluyes el criterio. Tienes el rango de B2 a B20 y el criterio está en la misma celda B20

En tal caso si no quieres incluir el registro de la celda 20 entonces el rango debería ser de B2 a B19:

res = WorksheetFunction.CountIfs(Range("B2:B19"), Range("B20"), _
                                 Range("C2:C19"), Range("C20"), _
                                 Range("K2:K19"), Range("K20"))

Y entonces sí, ahora solamente te cuenta un registro.


chin sigo sin explicarme bien :C lo siento

Es que realmente si son dos veces que se repiten los folios, pero es un mismo CLIENTE el folio 93 es el numero de la nota, cuando yo lo "consulte" este me debería decir que la nota 93 esta pendiente, supongamos que tengo el folio 94 que se repite 5 veces, el numero de veces que se repite es porque llevo 5 productos el mismo cliente pero no quiere decir que fueron 5 folios 94 por cada producto.

Mira te enseño como o consulto

La información la consulto así, si te das cuenta son dos productos que llevo el cliente pero la nota (parte de arriba) sigue siendo el mismo folio ... ES AQUÍ cuando quisiera que por medio de una macro (saber cuantos servicios hay el día 15 de marzo como pendiente y cuantos hay como entregados) porque si aplico la macro tal como esta me estará diciendo que el día 15 de marzo hay 2 pendiente por entregar cuando en realidad solo fue una sola nota que fue la 93, NO se cambia la "incidencia" por cada producto se cambia por folio, en este caso si le doy incidencia entregado este me pone entregado en los dos productos por que es solo una nota.

Y es como decía: si la nota 94 hay 5 productos efectivamente me pondrá 5 "pendientes" pero en realidad es solo la nota 94 con 5 productos como "pendiente"

Pido una disculpa si no estoy siendo entendible, gracias espero tenga solución

Y yo sigo sin entender, ¿la nota 93 pertenece a un cliente o puede pertenecer a varios clientes?

Si solamente pertenece a un cliente, entonces solamente tienes que buscar la nota 93 y ver su incidente si está "entregado" o "pendiente". Porque todos los registros de la nota 93 van a decir lo mismo en incidente; o puedes tener la nota 93, un registro con "pendiente" y otro "entregado"

Busca por nota y el primer registro que encuentres toma su incidente.

:C la nota con folio 1... 93 quiere decir que son 93 servicios, estoy realizando un archivo para servicio a domicilio, lo que viste era un "historial de servicios" por ejemplo hoy 16/03/2017 voy a tomar 2 servicios supongamos que para cada servicio tendremos un numero de folio

Para juan tendremos el folio 1

Para pepe 2

Entonces supongamos que el servicio de juan

Llevo 3 productos, entonces el folio 1 se repetirá 3 veces con cada uno de los productos que llevo (porque al crear la base de datos se crea así "tu me lo mostraste que así debería ser una base de datos") la incidencia para ese folio por default sera "pendiente".

Ahora tomo un segundo servicio del cual ahora pepe pide 4 productos para eso el "foliador" brinca al numero 2 y este pasa al "historial (base de datos)" el folio 2 se repetirá 4 veces porque 4 productos se llevo de igual forma este saldrá con "PENDIENTE"

Si aplicamos la macro de arriba me dirá que: son 7 servicios "PENDIENTES" pero en realidad son 2 el folio 1 y el folio 2

YO quisiera algo así: que me diga que en el día (según fecha que elija) hay un cierto numero servicios pendientes por entregar

No te desesperes pido una disculpa si no me logro explicar, gracias por tu ayuda

Con ese ejemplo hubieras empezado.

Tienes que sacar los registros únicos de folio, filtrando por fecha e Incidencia.

Adapta el siguiente código a tu formulario:

Lo que hace es revisar el textbox2 (en el textbox2 debes tener una fecha válida), contra la fecha de la columna B y también revisa que en la columna K diga "pendiente", si las 2 condiciones se cumplen, busca el folio en la hoja "temp"; si no existe, copia el folio a temp, si ya existe no lo copia. De esa forma en la hoja temp solamente tendrás 2 registros, ahora sí, solamente cuenta el número de registros de la hoja temp de la columna A

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Set h1 = Sheets("history")
    Set h2 = Sheets("temp")
    h2.Cells.Clear
    j = 2
    For i = 2 To h1.Range("B" & Rows.Count).End(xlUp).Row
        If h1.Cells(i, "B") = CDate(TextBox2) And _
           LCase(h1.Cells(i, "K")) = "pendiente" Then
           folio = h1.Cells(i, "C")
           Set b = h2.Columns("A").Find(folio, lookat:=xlWhole)
           If b Is Nothing Then
                h2.Cells(j, "A") = folio
                j = j + 1
            End If
        End If
    Next
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    res = WorksheetFunction.Count(h2.Range("A2:A" & u))
End Sub

En la variable "res" tendrás la cantidad de registros.

Ufff. Sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas