Discussion:
BDContara pero para filas que se repiten en base a ciertas columna
(demasiado antiguo para responder)
CSICMEL Portales y Páginas Web
2006-10-19 17:55:03 UTC
Permalink
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 = "=DCOUNTA(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
David
2006-10-19 19:49:02 UTC
Permalink
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.

- - - - - -
Post by CSICMEL Portales y Páginas Web
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
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.
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 = "=DCOUNTA(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
CSICMEL Portales y Páginas Web
2006-10-19 22:07:02 UTC
Permalink
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
Post by David
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
En un principio, supongamos que tus datos se encuentran distribuidos de la
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
=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
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
=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.
- - - - - -
Post by CSICMEL Portales y Páginas Web
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
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.
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 = "=DCOUNTA(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
CSICMEL Portales y Páginas Web
2006-10-19 22:57:01 UTC
Permalink
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
Post by David
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
En un principio, supongamos que tus datos se encuentran distribuidos de la
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
=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
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
=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.
- - - - - -
Post by CSICMEL Portales y Páginas Web
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
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.
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 = "=DCOUNTA(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
Loading...