BDContara pero para filas que se repiten en base a ciertas columna

19/10/2006 - 19:55 por CSICMEL Portales y Páginas Web | Informe spam
Como muchos sabrán, las funciones BDContar y BDContara de Excel, cuentas
columnas que coinciden entre sí con algún criterio en particular, pero yo,
que siempre ando al revés que muchos, necesito contar registros o filas que
coincidan en algún campo o columna. Ejemplo:

A B C D E F
Req SI SI NO SI SI

4 100 HH JJ 1/1/6 GRACIAS
3 101 JJ 2/1/5 POR
3 102 HJ JI LA
4 103 KK 3/7/6 AYUDA


Entonces quiero contar las filas que coincidan en el registro inicial REQ
(Requerido), con SI, esto lo colocaría al comienzo de cada fila, para saber
si llenó todos los campos requeridos. ¿Se entiende?

Por ejemplo en el registro 100, se observa un 4 al comienzo, porque de los
campos obligatorios, ha llenado 4, aunque en la realidad ha llenado todos.
En el registro 101, aunque llenó 4 campos, uno no es obligatorio, por lo que
en realidad tiene 3 campos obligatorios llenados.

Entonces la función BDContara no me sirve porque cuenta columnas y no filas,
o por lo menos eso he probado.

Intenté poniendo TRASPUESTA en la matriz, pero da error, por lo que no pude.

Al final cree una pequeña función en la hoja así:

Function ContarFila(FilaRango, Criterio)
If ActiveSheet.ProtectContents = True Then
ActiveSheet.Unprotect
Flag = True
Else
Flag = False
End If
LargoRango = FilaRango.Columns.Count
LargoCriterio = Criterio.Columns.Count
FilaRango.Select
Selection.Copy
Range("IR8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:= _
False, Transpose:=True
Criterio.Select
Selection.Copy
Range("IS8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:= _
False, Transpose:=True
Range("IQ7").Value = "Req"
Range("IR7").Value = "Datos"
Range("IS7").Value = "Req"
Range("IQ8").Value = "SI"
Range("IQ9").Select
Formula = "ÜOUNTA(R[-2]C[1]:R[" & LargoRango - 1 &
"]C[2],""Datos"",R[-2]C:R[-1]C)"
ActiveCell.FormulaR1C1 = Formula
ContarFila = Range("IQ9").Value
If Flag = True Then
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:= _
True, AllowSorting:=True, AllowFiltering:=True
End If
End Function

Funciona, porque lo que hace es pescar la fila a contar y la copia
traspuesta a un espacio en blanco de la hoja, luego, copia la fila de
criterio al lado de la otra, también traspuesta, y coloco un criterio al lado
para la función BDcontara, entonces, pongo la formula y recogo el resultado,
esto lo devuelvo y podría eventualmente borrar la zona de cálculo. El
problema es que se nota el efecto de copiar los registros a otro lado y crea
una sensación fea cuando llenas la base de datos.

Me gustaría saber si alguien caperuzo, ha ideado otra forma, quizás con el
uso de Array pueda ser, no he probado aún, pero después como hago para contar
con criterio, no sé la expresión o función de Visual que me sirva como
BDContar.

Gracias por cualquier sugerencia...

Nos vemos en la cumbre...

www.assalamo-alaikum.com
Muchísimas Gracias por vuestra ayuda.

CSICMEL Portales y Páginas web
www.assalamo-alaikum.com
www.aquiopinoyo.cl

Preguntas similare

Leer las respuestas

#1 David
19/10/2006 - 21:49 | Informe spam
Si lo que quieres es solamente determinar cuántos datos obligatorios de cada
fila se han ingresado, creo que la función que usas no es la adecuada, (Si
hay algo más, nos comentas), y yo te propondría cualquiera de las siguientes
dos formas:

En un principio, supongamos que tus datos se encuentran distribuidos de la
siguiente manera:

A B C D E F
1 Req SI SI NO SI SI
2 4 100 hh JJ 38718 GRACIAS
3 3 101 JJ 38719 POR
4 3 102 HJ JI LA
5 4 103 KK 38901 AYUDA


1. Usando la función SumaProducto( )
Para mí, el método más rápido de calcular, pero dificultoso si vas a estar
escribiendo fórmulas constantemente. Podrías ingresar en A2 la siguiente
fórmula:

=SUMAPRODUCTO(($B$1:$F$1="SI")*1,NO(ESBLANCO(B2:F2))*1)

Si no funciona, cambia las comas por punto y coma...


2. Usando una función personalizada
Será un poco más lento de calcular, pero crear la fórmula será mucho más
sencillo. Prueba el siguiente código:

Function Verificar(Rango_Datos As Range, Rango_Criterios As Range)
Dim F, C, N As Integer
F = Rango_Criterios.Row
N = 0
For Each celda In Rango_Datos.Cells
If UCase(Cells(F, celda.Column)) = "SI" Then
If Len(celda.Value) > 0 Then N = N + 1
End If
Next celda
Verificar = N
End Function

y en la celda A2, ingresa la siguiente fórmula:

=Verificar(B2:F2,$B$1:$F$1)

y si no funciona, cambia las comas por punto y coma...

Siempre comentas cómo te fue.

Saludos.



"CSICMEL Portales y Páginas Web" escribió:

Como muchos sabrán, las funciones BDContar y BDContara de Excel, cuentas
columnas que coinciden entre sí con algún criterio en particular, pero yo,
que siempre ando al revés que muchos, necesito contar registros o filas que
coincidan en algún campo o columna. Ejemplo:

A B C D E F
Req SI SI NO SI SI

4 100 HH JJ 1/1/6 GRACIAS
3 101 JJ 2/1/5 POR
3 102 HJ JI LA
4 103 KK 3/7/6 AYUDA


Entonces quiero contar las filas que coincidan en el registro inicial REQ
(Requerido), con SI, esto lo colocaría al comienzo de cada fila, para saber
si llenó todos los campos requeridos. ¿Se entiende?

Por ejemplo en el registro 100, se observa un 4 al comienzo, porque de los
campos obligatorios, ha llenado 4, aunque en la realidad ha llenado todos.
En el registro 101, aunque llenó 4 campos, uno no es obligatorio, por lo que
en realidad tiene 3 campos obligatorios llenados.

Entonces la función BDContara no me sirve porque cuenta columnas y no filas,
o por lo menos eso he probado.

Intenté poniendo TRASPUESTA en la matriz, pero da error, por lo que no pude.

Al final cree una pequeña función en la hoja así:

Function ContarFila(FilaRango, Criterio)
If ActiveSheet.ProtectContents = True Then
ActiveSheet.Unprotect
Flag = True
Else
Flag = False
End If
LargoRango = FilaRango.Columns.Count
LargoCriterio = Criterio.Columns.Count
FilaRango.Select
Selection.Copy
Range("IR8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:= _
False, Transpose:=True
Criterio.Select
Selection.Copy
Range("IS8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:= _
False, Transpose:=True
Range("IQ7").Value = "Req"
Range("IR7").Value = "Datos"
Range("IS7").Value = "Req"
Range("IQ8").Value = "SI"
Range("IQ9").Select
Formula = "ÜOUNTA(R[-2]C[1]:R[" & LargoRango - 1 &
"]C[2],""Datos"",R[-2]C:R[-1]C)"
ActiveCell.FormulaR1C1 = Formula
ContarFila = Range("IQ9").Value
If Flag = True Then
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:= _
True, AllowSorting:=True, AllowFiltering:=True
End If
End Function

Funciona, porque lo que hace es pescar la fila a contar y la copia
traspuesta a un espacio en blanco de la hoja, luego, copia la fila de
criterio al lado de la otra, también traspuesta, y coloco un criterio al lado
para la función BDcontara, entonces, pongo la formula y recogo el resultado,
esto lo devuelvo y podría eventualmente borrar la zona de cálculo. El
problema es que se nota el efecto de copiar los registros a otro lado y crea
una sensación fea cuando llenas la base de datos.

Me gustaría saber si alguien caperuzo, ha ideado otra forma, quizás con el
uso de Array pueda ser, no he probado aún, pero después como hago para contar
con criterio, no sé la expresión o función de Visual que me sirva como
BDContar.

Gracias por cualquier sugerencia...

Nos vemos en la cumbre...

www.assalamo-alaikum.com
Muchísimas Gracias por vuestra ayuda.

CSICMEL Portales y Páginas web
www.assalamo-alaikum.com
www.aquiopinoyo.cl
Respuesta Responder a este mensaje
#2 CSICMEL Portales y Páginas Web
20/10/2006 - 00:07 | Informe spam
La primera opción es muy útil, intenté hacerlo con sumaproducto pero me daba
#valor y no sabía porqué, ahora veo que lo multiplicaste por 1 y ello cambia
el resultado.

La probé y hasta ahora funciona super bien.

La segunda no la he probado, pero me quedo con la primera.

Estoy haciendo una Plantilla que emula una base de datos que hasta ahora
funciona muy bien, y me gustaría cuando esté lista, subirla aquí si a alguien
le sirve.

Muchísimas Gracias nuevamente.
Muchísimas Gracias por vuestra ayuda.

CSICMEL Portales y Páginas web
www.assalamo-alaikum.com
www.aquiopinoyo.cl


"David" wrote:

Si lo que quieres es solamente determinar cuántos datos obligatorios de cada
fila se han ingresado, creo que la función que usas no es la adecuada, (Si
hay algo más, nos comentas), y yo te propondría cualquiera de las siguientes
dos formas:

En un principio, supongamos que tus datos se encuentran distribuidos de la
siguiente manera:

A B C D E F
1 Req SI SI NO SI SI
2 4 100 hh JJ 38718 GRACIAS
3 3 101 JJ 38719 POR
4 3 102 HJ JI LA
5 4 103 KK 38901 AYUDA


1. Usando la función SumaProducto( )
Para mí, el método más rápido de calcular, pero dificultoso si vas a estar
escribiendo fórmulas constantemente. Podrías ingresar en A2 la siguiente
fórmula:

=SUMAPRODUCTO(($B$1:$F$1="SI")*1,NO(ESBLANCO(B2:F2))*1)

Si no funciona, cambia las comas por punto y coma...


2. Usando una función personalizada
Será un poco más lento de calcular, pero crear la fórmula será mucho más
sencillo. Prueba el siguiente código:

Function Verificar(Rango_Datos As Range, Rango_Criterios As Range)
Dim F, C, N As Integer
F = Rango_Criterios.Row
N = 0
For Each celda In Rango_Datos.Cells
If UCase(Cells(F, celda.Column)) = "SI" Then
If Len(celda.Value) > 0 Then N = N + 1
End If
Next celda
Verificar = N
End Function

y en la celda A2, ingresa la siguiente fórmula:

=Verificar(B2:F2,$B$1:$F$1)

y si no funciona, cambia las comas por punto y coma...

Siempre comentas cómo te fue.

Saludos.



"CSICMEL Portales y Páginas Web" escribió:

> Como muchos sabrán, las funciones BDContar y BDContara de Excel, cuentas
> columnas que coinciden entre sí con algún criterio en particular, pero yo,
> que siempre ando al revés que muchos, necesito contar registros o filas que
> coincidan en algún campo o columna. Ejemplo:
>
> A B C D E F
> Req SI SI NO SI SI
>
> 4 100 HH JJ 1/1/6 GRACIAS
> 3 101 JJ 2/1/5 POR
> 3 102 HJ JI LA
> 4 103 KK 3/7/6 AYUDA
>
>
> Entonces quiero contar las filas que coincidan en el registro inicial REQ
> (Requerido), con SI, esto lo colocaría al comienzo de cada fila, para saber
> si llenó todos los campos requeridos. ¿Se entiende?
>
> Por ejemplo en el registro 100, se observa un 4 al comienzo, porque de los
> campos obligatorios, ha llenado 4, aunque en la realidad ha llenado todos.
> En el registro 101, aunque llenó 4 campos, uno no es obligatorio, por lo que
> en realidad tiene 3 campos obligatorios llenados.
>
> Entonces la función BDContara no me sirve porque cuenta columnas y no filas,
> o por lo menos eso he probado.
>
> Intenté poniendo TRASPUESTA en la matriz, pero da error, por lo que no pude.
>
> Al final cree una pequeña función en la hoja así:
>
> Function ContarFila(FilaRango, Criterio)
> If ActiveSheet.ProtectContents = True Then
> ActiveSheet.Unprotect
> Flag = True
> Else
> Flag = False
> End If
> LargoRango = FilaRango.Columns.Count
> LargoCriterio = Criterio.Columns.Count
> FilaRango.Select
> Selection.Copy
> Range("IR8").Select
> Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
> SkipBlanks:= _
> False, Transpose:=True
> Criterio.Select
> Selection.Copy
> Range("IS8").Select
> Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
> SkipBlanks:= _
> False, Transpose:=True
> Range("IQ7").Value = "Req"
> Range("IR7").Value = "Datos"
> Range("IS7").Value = "Req"
> Range("IQ8").Value = "SI"
> Range("IQ9").Select
> Formula = "ÜOUNTA(R[-2]C[1]:R[" & LargoRango - 1 &
> "]C[2],""Datos"",R[-2]C:R[-1]C)"
> ActiveCell.FormulaR1C1 = Formula
> ContarFila = Range("IQ9").Value
> If Flag = True Then
> ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
> Scenarios:= _
> True, AllowSorting:=True, AllowFiltering:=True
> End If
> End Function
>
> Funciona, porque lo que hace es pescar la fila a contar y la copia
> traspuesta a un espacio en blanco de la hoja, luego, copia la fila de
> criterio al lado de la otra, también traspuesta, y coloco un criterio al lado
> para la función BDcontara, entonces, pongo la formula y recogo el resultado,
> esto lo devuelvo y podría eventualmente borrar la zona de cálculo. El
> problema es que se nota el efecto de copiar los registros a otro lado y crea
> una sensación fea cuando llenas la base de datos.
>
> Me gustaría saber si alguien caperuzo, ha ideado otra forma, quizás con el
> uso de Array pueda ser, no he probado aún, pero después como hago para contar
> con criterio, no sé la expresión o función de Visual que me sirva como
> BDContar.
>
> Gracias por cualquier sugerencia...
>
> Nos vemos en la cumbre...
>
> www.assalamo-alaikum.com
> Muchísimas Gracias por vuestra ayuda.
>
> CSICMEL Portales y Páginas web
> www.assalamo-alaikum.com
> www.aquiopinoyo.cl
Respuesta Responder a este mensaje
#3 CSICMEL Portales y Páginas Web
20/10/2006 - 00:57 | Informe spam
Tengo ahora otra pregunta relacionada.

Intenté hacer dinámicos los rangos con esta expresión:

=DIRECCION(FILA(B7);COLUMNA(E7))& ":" & DIRECCION(FILA(E7);COLUMNA(E7)+$B$7-1)

Lo que me arroja el rango $E$7:$G$7 que es el que me interesa calcular,
entonces puse en la expresión que me diste, en vez de B2:F2 lo siguiente:
indirecto(DIRECCION(FILA(E7);COLUMNA(E7))& ":" &
DIRECCION(FILA(E7);COLUMNA(E7)+$B$7-1))

Pero nuevamente obtengo #valor

Sin embargo, si calculo la referencia en otra celda y en la expresión
sumaproducto coloco el indirecto a esa celda, me funciona, entonces, no sé
porqué no se puede, si se supone que Excel ejectuta desde el nivel más
adentro hasta afuera.

En E7 empiezan mis datos es el primer registro, primer campo.

En B7 tengo el conteo de cuantos campos son, entonces, la formula me permite
si agrego más campos, cambiar dinámicamente el rango y así completar el
cálculo, pero tuve que separar en dos celdas la verificación.

¿Estaré haciendo algo mal nuevamente?

Gracias.

Por lo demás con esa salvedad, funciona de maravillas...
Muchísimas Gracias por vuestra ayuda.

CSICMEL Portales y Páginas web
www.assalamo-alaikum.com
www.aquiopinoyo.cl


"David" wrote:

> Si lo que quieres es solamente determinar cuántos datos obligatorios de cada
> fila se han ingresado, creo que la función que usas no es la adecuada, (Si
> hay algo más, nos comentas), y yo te propondría cualquiera de las siguientes
> dos formas:
>
> En un principio, supongamos que tus datos se encuentran distribuidos de la
> siguiente manera:
>
> A B C D E F
> 1 Req SI SI NO SI SI
> 2 4 100 hh JJ 38718 GRACIAS
> 3 3 101 JJ 38719 POR
> 4 3 102 HJ JI LA
> 5 4 103 KK 38901 AYUDA
>
>
> 1. Usando la función SumaProducto( )
> Para mí, el método más rápido de calcular, pero dificultoso si vas a estar
> escribiendo fórmulas constantemente. Podrías ingresar en A2 la siguiente
> fórmula:
>
> =SUMAPRODUCTO(($B$1:$F$1="SI")*1,NO(ESBLANCO(B2:F2))*1)
>
> Si no funciona, cambia las comas por punto y coma...
>
>
> 2. Usando una función personalizada
> Será un poco más lento de calcular, pero crear la fórmula será mucho más
> sencillo. Prueba el siguiente código:
>
> Function Verificar(Rango_Datos As Range, Rango_Criterios As Range)
> Dim F, C, N As Integer
> F = Rango_Criterios.Row
> N = 0
> For Each celda In Rango_Datos.Cells
> If UCase(Cells(F, celda.Column)) = "SI" Then
> If Len(celda.Value) > 0 Then N = N + 1
> End If
> Next celda
> Verificar = N
> End Function
>
> y en la celda A2, ingresa la siguiente fórmula:
>
> =Verificar(B2:F2,$B$1:$F$1)
>
> y si no funciona, cambia las comas por punto y coma...
>
> Siempre comentas cómo te fue.
>
> Saludos.
>
>
>
> "CSICMEL Portales y Páginas Web" escribió:
>
> > Como muchos sabrán, las funciones BDContar y BDContara de Excel, cuentas
> > columnas que coinciden entre sí con algún criterio en particular, pero yo,
> > que siempre ando al revés que muchos, necesito contar registros o filas que
> > coincidan en algún campo o columna. Ejemplo:
> >
> > A B C D E F
> > Req SI SI NO SI SI
> >
> > 4 100 HH JJ 1/1/6 GRACIAS
> > 3 101 JJ 2/1/5 POR
> > 3 102 HJ JI LA
> > 4 103 KK 3/7/6 AYUDA
> >
> >
> > Entonces quiero contar las filas que coincidan en el registro inicial REQ
> > (Requerido), con SI, esto lo colocaría al comienzo de cada fila, para saber
> > si llenó todos los campos requeridos. ¿Se entiende?
> >
> > Por ejemplo en el registro 100, se observa un 4 al comienzo, porque de los
> > campos obligatorios, ha llenado 4, aunque en la realidad ha llenado todos.
> > En el registro 101, aunque llenó 4 campos, uno no es obligatorio, por lo que
> > en realidad tiene 3 campos obligatorios llenados.
> >
> > Entonces la función BDContara no me sirve porque cuenta columnas y no filas,
> > o por lo menos eso he probado.
> >
> > Intenté poniendo TRASPUESTA en la matriz, pero da error, por lo que no pude.
> >
> > Al final cree una pequeña función en la hoja así:
> >
> > Function ContarFila(FilaRango, Criterio)
> > If ActiveSheet.ProtectContents = True Then
> > ActiveSheet.Unprotect
> > Flag = True
> > Else
> > Flag = False
> > End If
> > LargoRango = FilaRango.Columns.Count
> > LargoCriterio = Criterio.Columns.Count
> > FilaRango.Select
> > Selection.Copy
> > Range("IR8").Select
> > Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
> > SkipBlanks:= _
> > False, Transpose:=True
> > Criterio.Select
> > Selection.Copy
> > Range("IS8").Select
> > Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
> > SkipBlanks:= _
> > False, Transpose:=True
> > Range("IQ7").Value = "Req"
> > Range("IR7").Value = "Datos"
> > Range("IS7").Value = "Req"
> > Range("IQ8").Value = "SI"
> > Range("IQ9").Select
> > Formula = "ÜOUNTA(R[-2]C[1]:R[" & LargoRango - 1 &
> > "]C[2],""Datos"",R[-2]C:R[-1]C)"
> > ActiveCell.FormulaR1C1 = Formula
> > ContarFila = Range("IQ9").Value
> > If Flag = True Then
> > ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
> > Scenarios:= _
> > True, AllowSorting:=True, AllowFiltering:=True
> > End If
> > End Function
> >
> > Funciona, porque lo que hace es pescar la fila a contar y la copia
> > traspuesta a un espacio en blanco de la hoja, luego, copia la fila de
> > criterio al lado de la otra, también traspuesta, y coloco un criterio al lado
> > para la función BDcontara, entonces, pongo la formula y recogo el resultado,
> > esto lo devuelvo y podría eventualmente borrar la zona de cálculo. El
> > problema es que se nota el efecto de copiar los registros a otro lado y crea
> > una sensación fea cuando llenas la base de datos.
> >
> > Me gustaría saber si alguien caperuzo, ha ideado otra forma, quizás con el
> > uso de Array pueda ser, no he probado aún, pero después como hago para contar
> > con criterio, no sé la expresión o función de Visual que me sirva como
> > BDContar.
> >
> > Gracias por cualquier sugerencia...
> >
> > Nos vemos en la cumbre...
> >
> > www.assalamo-alaikum.com
> > Muchísimas Gracias por vuestra ayuda.
> >
> > CSICMEL Portales y Páginas web
> > www.assalamo-alaikum.com
> > www.aquiopinoyo.cl
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida