Secuencia Binaria --> 1101010001010 (la secuencia la tengo en una
columna no en forma de fila)
Ceros agrupados de 1 --> 3
Ceros agrupados de 2 --> 0
Ceros agrupados de 3 --> 1
De forma analoga se hace con los unos solo que no debo coger los
digitos de los extremos.
He intentado con la funcion contar.si pero no me sale
¿alguna sugerencia?
�alguna sugerencia?
-----------------
Hola xorge,
Empleando dos columnas auxiliares y otra para el resultado.
Si tienes tu n�mero binario en A1, prueba a realizar esto:
En C1 escribe 0 (es el n�mero que vas a buscar)
En D1 escribe =LARGO($A$1)-FILA(1:1)
representa el n�mero de veces que se repite el n�mero buscado�
En E1 escribe =SUSTITUIR($A$1;D1;"")
En E2 escribe =SUSTITUIR($E1;REPETIR($C$1;D2);"")
representa el n�mero binario sin el n�mero de grupos que hay en el n�mero
original sin los grupos de C1
En F1 escribe =(LARGO($A$1)-LARGO($E1))/LARGO(REPETIR($C$1;D1))
En F2 escribe =(LARGO($E1)-LARGO($E2))/LARGO(REPETIR($C$1;D2))
cuenta la ocurrencia de ese grupo por diferencia de las cadenas de n�meros
Extiende estas f�rmulas hasta que en la columna D llegues a 1
Cambiando en C1 el 0 por D1 el 1, el resultado ser� la cuenta de los grupos
de unos.
Por cierto que ceros agrupados de 1 hay 4 en tu n�mero original.
Un saludo,
Juan
He visto la solucion que me has planteado, pero lo asumes como si toda
la secuencia la tuviera en una celda, cuando en realidad cada 1 y 0
ocupa una celda de una columna.
Por cierto no conte el ultimo cero porque los digitos primero y ultimo
no se cuentan
saludos
__ este mensaje __
> He visto la solucion que me has planteado, pero lo asumes como si toda la secuencia la tuviera en una celda
> cuando en realidad cada 1 y 0 ocupa una celda de una columna.
> Por cierto no conte el ultimo cero porque los digitos primero y ultimo no se cuentan
__ consulta original __
>> ... tengo una columna, en Excel, llena de unos y ceros
>> lo que quiero hacer es contar esos unos y ceros agrupandolos de uno en uno o de dos en dos por ejemplo:
>> Secuencia Binaria --> 1101010001010 (la secuencia la tengo en una columna no en forma de fila) ...
OJO: esto que comentas en este mensaje NO corresponde con lo que indicaste en tu consulta original...
donde en forma (aparentemente) "clara" dices: -> "... tengo UNA COLUMNA ... (no en forma de fila) ... "
que y como tendria que hacer alguien (desde este lado del mensaje) para REcrear un modelo de trabajo "igual al tuyo" ?
saludos,
hector.
Columna
1 (no tener en cuenta)
1
0
1
0
1
0
0
0
1
0
1
0 (no tener en cuenta)
�Es asi?
Gabriel
xorge escribi�:
Si asi es, de forma vertical
Nada f�cil con funciones... no veo como...
Aun no le he intentado con VBA (macros), pero se me hace que puede ser
mas sencillo...
Comenta si te sirve una UDF, seguro que es una de esas cosas que gustan
a muchos.
Gabriel
xorge escribi�:
> On 25 sep, 15:53, Gabriel Raigosa <Ing.Raig...@gmail.com> wrote:
>> Yo entend� esto desde el principio.
suponiendo que los 13 valores de tu ejemplo estuvieran en el rango [B2:B14] (B2 y B14 no entran en el juego) -?????-
1) escribe los identificadores del procedimiento (p.e.) en el rango [D1:D3] -> numero, veces, cuenta
2) escribe en [E1] el numero que se buscara (p.e. 0 o 1)
3) escribe en [E2] el consecutivo (veces) que debera cumplirse (p.e. 1, 2, 3...)
4) escribe en [E3] la siguiente formula: =contar.si(c2:c14,verdadero)
5) para que se pueda usar la formula en la celda [E3] deberas agregar la siguiente formula en el rango [C3:C134] iniciando en [C3]:
=sumaproducto(subtotales(9,desref(b2,fila(indirecto("1:"&e$2+2)),))*10^((1+e$2)-(fila(indirecto("1:"&e$2+2))-1)))=--((1-e$1)&repetir(e$1,e$2)&(1-e$1))
esta formula al copias/arrastras/extiedes/... hasta la celda [C13]
solo comprueba/corrije si tu separador de argumentos es diferende al de mi sistema (coma)
notaras que este prcedimiento solo permite "consultar" UNA secuencia y numero por vez
(por si necesitaras incluir todas las posibilidades, habria que utilizar una columna auxiliar y sus variables para cada caso)
saludos,
hector.
>> Yo entendi esto desde el principio.
>>
>> Columna
>> 1 (no tener en cuenta)
>> 1
>> 0
>> 1
>> 0
>> 1
>> 0
>> 0
>> 0
>> 1
>> 0
>> 1
>> 0 (no tener en cuenta)
>>
>> Es asi?
>
http://sites.google.com/site/misitioexcel/Excel/archivos-para-el-foro/Consulta.xlsx?attredirects=0
no me funciona bien con los unos (1)
Mientas leia la respuesta de Hector, yo tenia un modelo similar, en
distribuci�n, pero no tenia ( ni tengo idea ) de que funci�n construir
para lograr el objetivo.
No me funciona correctamente.
Gabriel
H�ctor Miguel escribi�:
> Paso a paso he seguido la consulta,
> http://sites.google.com/site/misitioexcel/Excel/archivos-para-el-foro/Consulta.xlsx?attredirects=0
> no me funciona bien con los unos (1)
> ...
> No me funciona correctamente.
habras notado que la consulta y las condicionantes planteadas tienen sus... "casos especiales" (p.e.)
- en tu archivo indicas que la cantidad de unos (con los datos del ejemplo) "debiera" ser 5
pero... ya analizaste "cuales" son los 4 (en lugar de 5) que devuelve el procedimiento ?
- observa que para poder "cumplir" con las otras condiciones, el uno (una vez) se busca "entre" dos ceros
razon por la que el primer uno en [B3] no esta siendo acumulado :-(
supongo que este seria uno -quiza/espero el unico- de los casos donde se deja "desprotegido uno... por la mayoria" ?
claro, a reserva de darle una "crecidita" a la formula o de plano buscar soluciones por vba (?)
saludos,
hector.
__ OP __
>> suponiendo que los 13 valores de tu ejemplo estuvieran en el rango [B2:B14] (B2 y B14 no entran en el juego) -?????-
>>
>> 1) escribe los identificadores del procedimiento (p.e.) en el rango [D1:D3] -> numero, veces, cuenta
>> 2) escribe en [E1] el numero que se buscara (p.e. 0 o 1)
>> 3) escribe en [E2] el consecutivo (veces) que debera cumplirse (p.e. 1, 2, 3...)
>> 4) escribe en [E3] la siguiente formula: =contar.si(c2:c14,verdadero)
>>
>> 5) para que se pueda usar la formula en la celda [E3] deberas agregar la siguiente formula en el rango [C3:C134] iniciando en [C3]:
>> =sumaproducto(subtotales(9,desref(b2,fila(indirecto("1:"&e$2+2)),))*10^((1+e$2)-(fila(indirecto("1:"&e$2+2))-1)))=--((1-e$1)&repetir(e$1,e$2)&(1-e$1))
>>
>> esta formula al copias/arrastras/extiedes/... hasta la celda [C13]
>>
>> solo comprueba/corrije si tu separador de argumentos es diferende al de mi sistema (coma)
>>
>> notaras que este prcedimiento solo permite "consultar" UNA secuencia y numero por vez
>> (por si necesitaras incluir todas las posibilidades, habria que utilizar una columna auxiliar y sus variables para cada caso)...
Gabriel
H�ctor Miguel escribi�:
Hola Hector
he probado tu metodo y hay unas cosas que no entiendo, se supone que
el contar.si cuenta todos los verdaderos, pero he visto que varios
VERDADEROS estan al costado de "1" no cuneta los "1" tambien ¿Cual es
la logica q has empleado?
> ... hay unas cosas que no entiendo, se supone que contar.si cuenta todos los verdaderos
> pero he visto que varios VERDADEROS estan al costado de "1" no cuneta los "1" tambien
> Cual es la logica q has empleado?
mas que saber si esta al costado de un uno o de un cero...
- al contar de los verdaderos le importa mas "como" fue que se obtuvo el verdadero
- el verdadero se cumple cuando se comprueba la condicion dentro de un "determinado" numero/grupo de celdas
- el grupo de celdas lo dicta el numero de repeticiones (celda E2) que se pide del numero MAS DOS (una antes y una despues)
observa la parte de la formula donde dice: -> fila(indirecto("1:"&e$2+2))
- esto ocasiona que el verdadero se presente al inicio de cada "grupo" de celdas (no importa que numero esta "al costado")
- la "cadena" de busqueda la forma la parte final de la formula: -> --((1-e$1)&repetir(e$1,e$2)&(1-e$1))
- (1-e$1) establece lo contrario del numero buscado en E1 (buscas 1 ?... empieza por 0 -y viceversa-)
- repetir(e$1,e$2) construye el numero buscado en E1 tantas veces/repeticiones/... como se indique en D2
- al final se repita la construccion del inicio (el contrario del numero buscado): -> (1-e$1)
+/- por ahi va "la logica" :))
saludos,
hector.
__ la formula propuesta __
No funciones
Gabriel
xorge escribi�:
> On 25 sep, 22:51, "H�ctor Miguel" <NOhemiordiS...@PLShotmail.com>
> wrote:
>> hola, Gabriel 1
>>
>>> Paso a paso he seguido la consulta,
>>> http://sites.google.com/site/misitioexcel/Excel/archivos-para-el-foro...
>>> no me funciona bien con los unos (1)
>>> ...
>>> No me funciona correctamente.
>> habras notado que la consulta y las condicionantes planteadas tienen sus.... "casos especiales" (p.e.)
Gabriel
H�ctor Miguel escribi�:
> Me gustaria Invitar a KL, es de los temas que a el y por supuesto a ti, les gusta
> pero sigo insistiendo, el VBA, nos puede resolver este problema...
esperemos que KL llegue a ver/visitar/... esta consulta (?), en via de mientras...
- ya tienes el escenario: "... yo tengo una columna, en Excel, llena de unos y ceros ..."
- ya tienes las restricciones: "... no debo coger los digitos de los extremos ..."
- ya tienes un ejemplo: "ver consulta inicial de OP"
(claro que terminos como "una columna... LLENA de unos y ceros..." presenta mas de dos "imponderables")
- ya tienes algunas ideas sobre la mejor posible alternativa de algoritmo ?
- bucle celda-a-celda durante "n_filas" ?... cuantas ?... y los grupos ?... ??'
- prevencion/correccion/... de (posibles) errores del usuario ?
- flexibilidad para sustituir cualquiera de las variables ?
- etc. (???)
saludos,
hector.
para determinar cuantos digitos tenemos que usar para la solucion.
Gabriel
H�ctor Miguel escribi�:
Saludos
Gabriel Raigosa tiene razon no funciona bien con los "unos", en la
secuencia existen 5 y solo cuenta 4, la verdad no se me ocurre nada
ojala puedan ayudarme
> Gabriel Raigosa tiene razon no funciona bien con los "unos", en la secuencia existen 5 y solo cuenta 4
> la verdad no se me ocurre nada ojala puedan ayudarme
tampoco funciona "bien" con los ceros (depende de la "secuencia binaria" que pongas en "el rango") :-(
la "restriccion" que pones de no considerar ni el primero ni el ultimo en "el rango"...
OBLIGA a convertir en "lo contrario" del numero buscado dichos extremos (el primero y el ultimo), ademas...
se necesita hacer "avances" uno-por-uno para evitar la discriminacion de cualquiera "encontrado" (previamente)
el siguiente ejemplo de funcion personalizada NO contempla prevencion/correccion/... de (posibles) errores en su uso
(p.e. asume que "el rango" sera SIEMPRE vertical, o sea, varias celdas CONTINUAS en la misma columna)
minimo xl2000 en adelante, haz pruebas y... si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Function Continuos(Binario As Range, Num As Byte, Rep As Byte) As Byte
Dim Base As String, Cadena As String, Serie As String, n As Byte
Base = IIf(Num = 1, "0", "1")
Cadena = Base & String(Rep, CStr(Num)) & Base
With Binario
Serie = Base & _
Join(Application.Transpose(.Offset(1).Resize(.Rows.Count - 2).Value), "") & Base
End With
Continuos = 0
For n = 1 To Len(Serie) - (Rep + 1)
Continuos = Continuos - (Mid(Serie, n, Len(Cadena)) = Cadena)
Next
End Function
Sub continuos()
Dim repes(1, 7) As Integer, _
cuenta%, _
fila%, _
n%, _
resultado$, _
anterior As Range
cuenta = -1
Set anterior = Range("A2")
resultado = " 0 1" & vbCr & vbCr
For fila = 3 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(fila, 1) = anterior Then
cuenta = (cuenta) - 1 * (anterior.Address <> "$A$2")
Else
If anterior.Address <> "$A$2" Then repes(anterior.Value, _
cuenta - 1) = repes(anterior.Value, cuenta - 1) + 1
Set anterior = Cells(fila, 1)
cuenta = 1
End If
Next fila
For n = 0 To 7
resultado = resultado & n + 1 & " Rep. = " & repes(0, n) & " " & repes(1, n) & vbCr
Next n
Set anterior = Nothing
MsgBox resultado
End Sub
Admite 8 valores continuos (repetidos), pero es facilmente modificable.
Saludos: Antonio.
Aunque no participo del foro me agrada revisarlo frecuentemente y este post
me llamo la atención y me parece que esta fórmula pudiera funcionar.
Rango de datos en: [B2:B4] / Digito a contar en:[E1] / Veces consecutivas
en:[E2]
Esta fórmula en C3 y copiar hasta C13.
=Y(SI(FILAS($B$3:B3)=1,1,B2<>$E$1),CONTAR.SI(B3:INDICE($B$3:$B$13,MIN(FILAS($B$3:$B$13),1+$E$2*FILAS($B$3:B3))),$E$1)=$E$2,SI(FILA(B3)=FILA($B$13),1,INDICE($B$3:$B$13,MIN(FILAS($B$3:$B$13),1+$E$2*FILAS($B$3:B3)))<>$E$1))*1
Ahora en E3 para obtener el total:
=SUMA(C3:C13)
Saludos.
> Aunque no participo del foro me agrada revisarlo frecuentemente y este post me llamo la atencion
> y me parece que esta formula pudiera funcionar.
> Rango de datos en: [B2:B4] / Digito a contar en:[E1] / Veces consecutivas en:[E2]
> Esta formula en C3 y copiar hasta C13.
> =Y(SI(FILAS($B$3:B3)=1,1,B2<>$E$1),CONTAR.SI(B3:INDICE($B$3:$B$13,MIN(FILAS($B$3:$B$13),1+$E$2*FILAS($B$3:B3))),$E$1)=$E$2,SI(FILA(B3)=FILA($B$13),1,INDICE($B$3:$B$13,MIN(FILAS($B$3:$B$13),1+$E$2*FILAS($B$3:B3)))<>$E$1))*1
> Ahora en E3 para obtener el total: =SUMA(C3:C13)
(segun pruebas) esta formula tambien presenta fallas (p.e.) cuando en la secuencia se busca 0 (cero) 2 o mas veces "consecutivas"
incluso (segun los datos del ejemplo) "encuentra" secuencias con dos o tres "unos" (que NO existen) -???-
y habria que considerar un -posible- consumo adicional de recursos al utilizar n_cedas "auxiliares" para dos o mas "secuencias binarias" (???)
saludos,
hector.
> Yo habia montado el siguiente codigo, suponiendo que la secuencia est� en la columna A y empieza en la fila 2:
(creo que) presenta la misma "falla" de la que se "queja" OP: solo cuenta 4 unos y requiere contar 5 (?)
saludos,
hector.
__ el codigo expuesto __
> (segun pruebas) esta formula tambien presenta fallas (p.e.) cuando en la secuencia se busca 0 (cero) 2 o mas veces "consecutivas"
> incluso (segun los datos del ejemplo) "encuentra" secuencias con dos o tres "unos" (que NO existen) -???-
> y habria que considerar un -posible- consumo adicional de recursos al utilizar n_cedas "auxiliares" para dos o mas "secuencias binarias" (???)
>
Sin duda que el rendimiento del archivo no sería el mejor si se emplea este
tipo de formulas para determinar varias secuencias. Sin embargo para no cesar
en el intento de hacerla funcionar, aquí dejo la modificación.
=Y(SI(FILAS($B$3:B3)=1,1,B2<>$E$1),CONTAR.SI(B3:INDICE(B3:$B$13,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$13),1,$E$2)),$E$1)=$E$2,SI(FILA(B3)=FILA($B$13),1,INDICE(B3:$B$13,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$13),1,$E$2+1))<>$E$1))*1
Saludos
(casi... pero) todavia no... (p.e.)
- si buscas [E1]->1 con repeticiones de [E2]->3
- y CAMBIAS la secuencia final de: 1010 a 1110
la formula devuelve 0 (cero) cuando debiera devolver 1 (uno) -???-
saludos,
hector.
__ OP __
> Sin duda que el rendimiento del archivo no seria el mejor
> si se emplea este tipo de formulas para determinar varias secuencias.
> Sin embargo para no cesar en el intento de hacerla funcionar, aqui dejo la modificacion.
>
> =Y(SI(FILAS($B$3:B3)=1,1,B2<>$E$1),CONTAR.SI(B3:INDICE(B3:$B$13,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$13),1,$E$2)),$E$1)=$E$2,SI(FILA(B3)=FILA($B$13),1,INDICE(B3:$B$13,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$13),1,$E$2+1))<>$E$1))*1
__ previos __
=Y(SI(FILAS($B$3:B3)=1,1,B2<>$E$1),CONTAR.SI(B3:INDICE(B3:$B$14,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$14),1,$E$2)),$E$1)=$E$2,SI(FILA(B3)=FILA($B$13),1,INDICE(B3:$B$14,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$14),1,$E$2+1))<>$E$1))*1
Saludos Elias
> Gracias por las pruebas, haber si ahora le pego.
> =Y(SI(FILAS($B$3:B3)=1,1,B2<>$E$1),CONTAR.SI(B3:INDICE(B3:$B$14,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$14),1,$E$2)),$E$1)=$E$2,SI(FILA(B3)=FILA($B$13),1,INDICE(B3:$B$14,SI(FILAS($B$3:B3)+$E$2>FILAS($B$3:$B$14),1,$E$2+1))<>$E$1))*1
gracias a ti, por (atreverte a) exponer (tu nombre y) la formula :))
ahora parece funcionar como se espera (a reserva de que OP la pruebe bajo SUS condiciones "reales" ?)
saludos,
hector.
Yo habia (mal) interpretado que habia que ignorar las SECUENCIAS de los extremos y NO s�lo el primer y �ltimo valor.
:-(
De cualquier modo, debemos aceptar el veredicto del comit� de evaluaci�n ;-)
Aqu� va la modificaci�n:
Sub continuos()
Dim repes(1, 7) As Integer, _
cuenta%, _
fila%, _
n%, _
resultado$, _
anterior As Range
cuenta = 1
Set anterior = Range("A3")
resultado = "Valores : 0 1" & vbCr & vbCr
For fila = 4 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(fila, 1) = anterior Then
cuenta = (cuenta) - 1 * (anterior.Address <> "$A$2")
Else
repes(anterior.Value, cuenta - 1) = repes(anterior.Value, cuenta - 1) + 1
Set anterior = Cells(fila, 1)
cuenta = 1
End If
Next fila
For n = 0 To 7
resultado = resultado & n + 1 & " Rep. = " & repes(0, n) & " " & repes(1, n) & vbCr
Next n
Set anterior = Nothing
MsgBox resultado
End Sub
Saludos desde Tenerife: Antonio.
*******************************************
"H�ctor Miguel" <NOhemio...@PLShotmail.com> escribi� en el mensaje news:Obi6QruQ...@TK2MSFTNGP04.phx.gbl...
Hola
Prueben esro !
P5=Veces consecutivas
P7=Valor/Texto a buscar
T3:T23=Valores/Texto (Rango donde buscar)
en cualquie celda
=+SUMAPRODUCTO(SI(CONTAR.SI(INDIRECTO(DIRECCION(SI(+FILA($T$3:$T$23)-
FILA($T$3)-$P$5>0;FILA($T$3:$T$23)-$P$5-1;FILA($T$3));COLUMNA($T$3:$T
$23);4));$P$7);0;1)*SI(CONTAR.SI(INDIRECTO(DIRECCION(SI(+FILA($T$3:$T
$23)-FILA($T$3)-$P$5>0;FILA($T$3:$T$23);FILA($T$3));COLUMNA($T$3:$T
$23);4));$P$7);0;1)*SI(CONTAR.SI(DESREF(INDIRECTO(DIRECCION(SI(+FILA($T
$3:$T$23)-FILA($T$3)-$P$5>0;FILA($T$3:$T$23)-$P$5;FILA($T$3));COLUMNA
($T$3:$T$23);4));0;0;$P$5;1);$P$7)=$P$5;1;0))
(En Forma Matricial).
Y...Listo ,Resuelto...(Creo)
Saludos a Todos. Orfao.
buena ! (creo que vale para las intenciones de OP -hasta donde se sabe-)
habra que trabajar a partir de tu formula para tratar de optimizarla (llamadas a 32 funciones)
saludos,
hector.
__ OP __
Prueben esro !
P5=Veces consecutivas
P7=Valor/Texto a buscar
T3:T23=Valores/Texto (Rango donde buscar)
en cualquie celda
=+SUMAPRODUCTO(SI(CONTAR.SI(INDIRECTO(DIRECCION(SI(+FILA($T$3:$T$23)-FILA($T$3)-$P$5>0;FILA($T$3:$T$23)-$P$5-1;FILA($T$3));COLUMNA($T$3:$T$23);4));$P$7);0;1)*SI(CONTAR.SI(INDIRECTO(DIRECCION(SI(+FILA($T$3:$T$23)-FILA($T$3)-$P$5>0;FILA($T$3:$T$23);FILA($T$3));COLUMNA($T$3:$T$23);4));$P$7);0;1)*SI(CONTAR.SI(DESREF(INDIRECTO(DIRECCION(SI(+FILA($T$3:$T$23)-FILA($T$3)-$P$5>0;FILA($T$3:$T$23)-$P$5;FILA($T$3));COLUMNA($T$3:$T$23);4));0;0;$P$5;1);$P$7)=$P$5;1;0))
En el otro post relacionado al tema mejore esta formula, pero... aun
faltan algunas cositas y...desde luego que espero contar con tu
ayuda.
http://groups.google.com/group/microsoft.public.es.excel/browse_thread/thread/3a33c1e715bfe237?hl=es
Saludos a Todos. Orfao.