"Posiciones"

20/12/2003 - 16:29 por Luis | Informe spam
Hola a todos.

Hay alguna manera de hacer en Excel lo siguiente:

Tengo un rango de datos numéricos en [A1:A27] y quiero
saber cual de ellos es el que no ha aparecido o en su
defecto las celdas que hace que no ha salido teniendo en
cuenta el los números 1 al 9. Ejemplo:

Supongamos que el rango [A1:A27] es el siguiente:

8-7-1-1-3-3-2-9-3-2-1-1-4-6-4-1-6-1-9-5-2-3-2-1-6-9-5

pues se observa que están todos los valores del 1 al 9,
pero el que hace mas casillas que no aparece es el 8.

Lo ideal seria que me los diese ordenados de menor a
mayor "posición", o sea sería:

8 - 7 - 4 - 9 - 3 - 2 - 1 - 6 - 5

Alguna idea?

Gracias anticipadas y Felices Fiestas.

Preguntas similare

Leer las respuestas

#11 Héctor Miguel
29/12/2003 - 10:54 | Informe spam
hola, Luis !

... rango de datos numericos en [A1:A27] ... saber ... el que no ha aparecido ... teniendo en cuenta ... 1 al 9. Ejemplo:
... el rango [A1:A27] es ... 8-7-1-1-3-3-2-9-3-2-1-1-4-6-4-1-6-1-9-5-2-3-2-1-6-9-5
... el que hace mas ... que no aparece es el 8 ... ordenados de menor a mayor "posicion", o sea sería:
8 - 7 - 4 - 9 - 3 - 2 - 1 - 6 - 5 [...]



como [yo] 'lo veo'... se necesitan 3 'pasos' para 'contar', 'ordenar' y 'devolver' la 'frecuencia' y 'secuencia' de numeros.
[por lo cual...] tuve que 'hechar a perder' [usar] 3 rangos/columnas [y una 'matriz fija'] para lo siguiente:
1.- en 'B1:B10', 'contar' las veces que se repite cada numero
1 al 9 [MAS el 0 en la 'posicion' # 10, solo por mantener una 'secuencia' -¿inversamente?- 'logica' :))]
2.- en 'C1:C10', 'ordenar' [hacer un 'ranking' descendente] de la posicion que ocupan las 'repeticiones' en el rango
considerando la posibilidad de 'empates' y una forma [arbitraria] de 'des-empatar' en descendente
=> 'ese' des-empate requiere el uso de rangos 'flexibles' con un 'inicio fijo' < [es 'la razon' por la que use 3 columnas, ya que -de momento- NO encontre funciones con esa 'flexibilidad'] :((
3.- en 'D1:D10', 'devolver' [por indices] los numeros de menos a mas [frecuentemente] 'repetidos'

=> toma nota que 'mi' separador de argumentos es la coma ',' NO punto y coma ';' <las formulas son las siguientes => 'observa' que hay algunas referencias 'absolutas' y otras 'relativas' <[B1] =Indice(Contar.Si($a$1:$a$27,{1\2\3\4\5\6\7\8\9\0}),Fila())
[C1] -(Jerarquia(b1,$b$1:$b$10)+Contar.Si($b$1:b1,b1))+2
[D1] =Indice({1\2\3\4\5\6\7\8\9\0},Coincidir(Fila(),$c$1:$c$10,0))
'extiende' las formulas hasta la fila 10 [B1:D10] y la columna 'D' te 'dara' la secuencia que necesitas :))

saludos,
hector.

p.d. si NO quieres 'hechar a perder' 3 rangos/columnas, podrias utilizar una funcion 'personalizada' +/- como la siguiente:
[da algunos 'problemas' con los 'des-empates' :(( pero... -creo que- 'funciona' bastante bien] :))
'llamala' como una funcion 'normal' de excel, p.e. =Freq_Seq(A1:A27)
en un modulo de codigo 'normal' ==Option Base 1
Public Freq As Variant, Seq As Variant
Function Freq_Seq(Datos As Range) As String
Dim Tmp, Sig As Integer
Seq = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
Freq = Application.CountIf(Datos, Seq)
Tmp = Sort_Seq(Freq, Seq)
For Sig = 10 To 1 Step -1
If Freq_Seq <> "" Then Freq_Seq = Freq_Seq & ", "
Freq_Seq = Freq_Seq & Seq(Sig)
Next
End Function
Private Function Sort_Seq(ByVal Mx1 As Variant, ByVal Mx2 As Variant) As Variant
Dim fVar As Variant, sVar As Variant, Prv As Variant, Sig As Long, _
fMen(32) As Long, fMay(32) As Long, sMen(32) As Long, sMay(32) As Long, _
fPri As Long, fUlt As Long, sPri As Long, sUlt As Long, _
f1 As Long, f2 As Long, s1 As Long, s2 As Long
fPri = 1: fUlt = 10: Sig = 2: fMen(Sig) = fPri: fMay(Sig) = fUlt
sPri = 1: sUlt = 10: Sig = 2: sMen(Sig) = sPri: sMay(Sig) = sUlt
Do
If fUlt > fPri Then
Prv = Mx1(fUlt): f1 = fPri - 1: f2 = sUlt: s1 = sPri - 1: s2 = sUlt
Do
Do: f1 = f1 + 1: s1 = s1 + 1: Loop Until Mx1(f1) <= Prv
Do: f2 = f2 - 1: s2 = s2 - 1: Loop Until f2 = fPri Or Mx1(f2) >= Prv
fVar = Mx1(f1): Mx1(f1) = Mx1(f2): Mx1(f2) = fVar
sVar = Mx2(s1): Mx2(s1) = Mx2(s2): Mx2(s2) = sVar
Loop Until f2 <= f1
fVar = Mx1(f2): Mx1(f2) = Mx1(f1): Mx1(f1) = Mx1(fUlt): Mx1(fUlt) = fVar: Sig = Sig + 1
sVar = Mx2(s2): Mx2(s2) = Mx2(s1): Mx2(s1) = Mx2(sUlt): Mx2(sUlt) = sVar
If (f1 - fPri) > (fUlt - f1) Then
fMen(Sig) = fPri: fMay(Sig) = f1 - 1: fPri = f1 + 1
sMen(Sig) = sPri: sMay(Sig) = s1 - 1: sPri = s1 + 1
Else
fMen(Sig) = f1 + 1: fMay(Sig) = fUlt: fUlt = f1 - 1
sMen(Sig) = s1 + 1: sMay(Sig) = sUlt: sUlt = s1 - 1
End If
Else
fPri = fMen(Sig): fUlt = fMay(Sig)
sPri = sMen(Sig): sUlt = sMay(Sig): Sig = Sig - 1
If Sig = 0 Then Exit Do
End If: Loop: Seq = Mx2
End Function
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida