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
 

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

Preguntas similares