Re: Alternativa a SUSTITUIR() 30 veces.

25/12/2005 - 22:16 por javier99 | Informe spam
Gracias, KL

A esta cadena de texto, siempre la misma cadena
12345678

quería hacerle desaparecer cualquiera de los caracteres variables que pueden estar repetidos (no siguen ningun orden, la cadena puede ser de longitud variable, hasta 30 caracteres máximo), y que estarían en una columna. Como en este ejemplo

147
3783
6981
3689

12312312312311111312312322222

Siempre son números, el "0" no entra
Lo he dejado mas simple, pero en realidad la cadena sería de unos 30 caracteres como máximo. Como en el último ejemplo. El resulado que busco no le afecta.


El resultado correcto debería quedaría así

3568
12456
2345
124

45678

Andaba con un "SODOKU" e intentaba plantearlo de alguna forma que me sirviera para hallar una solución

Sebeis de alguan función o formula para conseguir ese resultado que busco??


También probé concatenando así:
=CONCATENAR(K16;L16;M16;N16;O16)
y despues trataba de SUSTITUIR()

=SUSTITUIR(123456789;CONCATENAR(K16;L16;M16;N16;O16);""

Pero así no me daba el resultado correcto...
Era mejor no componer esa cadena y aplicar SUSTITUIR() 30 veces... entonces SÍ conseguía lo que busco. Pero me parece exagerado hacerlo así

=SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(F$11;K16;"");L16;"");M16;"");N16;"");O16;""

Si lo ve algun amigo mio se echaría a reir. :))

Es un juego. Gracias.
Saludos.

javie

javier99

Ver este tema: http://www.softwaremix.net/viewtopic-468599.htm

Enviado desde http://www.softwaremix.net

Preguntas similare

Leer las respuestas

#1 KL
26/12/2005 - 18:50 | Informe spam
Hola javier99,

Lo unico que se me ocurre es:
1) usar la funcion SUSTITUIR hasta 7 veces (el limite de anidaciones) en una celda y luego seguir en otra
2)usar una funcion personalizada en VBA, algo asi:

Public Function MSUSTITUIR(txt As String, busc, _
sust As String) As String
On Error GoTo ManejoErr
For Each i In busc
txt = Replace(txt, i, sust)
Next i
MSUSTITUIR = txt
Exit Function
ManejoErr:
MSUSTITUIR = Replace(txt, busc, sust)
End Function

copias el codigo en un modulo estandar (que no sea de hoja, ThisWorkbook o UserForm) y llamas la formula desde una celda de esta
manera:

=MSUSTITUIR(A1;F1:J1;"")

donde:

A1 - contiene la cadena de texto inicial
F1:J1 - es el rango horizontal o vertical o matriz fija que contiene los caracteres a sustituir
"" - es el caracter que sustituye los anteriores.

3) Tambien mira a ver estos ejemplos de como resolver los sudoku

Andy Pope: http://andypope.info/fun/SuDoku.zip
Dan Cory: http://office.microsoft.com/en-us/t...21033.aspx

Saludos,
KL


"javier99" wrote in message news:

Gracias, KL:

A esta cadena de texto, siempre la misma cadena:
123456789

quería hacerle desaparecer cualquiera de los caracteres variables que pueden estar repetidos (no siguen ningun orden, la cadena
puede ser de longitud variable, hasta 30 caracteres máximo), y que estarían en una columna. Como en este ejemplo:

1472
37833
69818
36895

123123123123111113123123222222

Siempre son números, el "0" no entra.
Lo he dejado mas simple, pero en realidad la cadena sería de unos 30 caracteres como máximo. Como en el último ejemplo. El
resulado que busco no le afecta.



El resultado correcto debería quedaría así:

35689
124569
23457
1247

456789


Andaba con un "SODOKU" e intentaba plantearlo de alguna forma que me sirviera para hallar una solución.

Sebeis de alguan función o formula para conseguir ese resultado que busco??




También probé concatenando así:
=CONCATENAR(K16;L16;M16;N16;O16)
y despues trataba de SUSTITUIR():

=SUSTITUIR(123456789;CONCATENAR(K16;L16;M16;N16;O16);"")

Pero así no me daba el resultado correcto...
Era mejor no componer esa cadena y aplicar SUSTITUIR() 30 veces... entonces SÍ conseguía lo que busco. Pero me parece exagerado
hacerlo así:

=SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(F$11;K16;"");L16;"");M16;"");N16;"");O16;"")

Si lo ve algun amigo mio se echaría a reir. :)))

Es un juego. Gracias.
Saludos.

javier


javier99


Ver este tema: http://www.softwaremix.net/viewtopic-468599.html

Enviado desde http://www.softwaremix.net


Respuesta Responder a este mensaje
#2 Héctor Miguel
27/12/2005 - 02:12 | Informe spam
hola, javier !

si lo que necesitas es 'devolver' los numeros [1-9] que NO 'aparecen' en la celda/cadena/... donde se busca...
[creo que] podria simplificarse la funcion personalizada a algo +/- como la siguiente:
en un modulo de codigo 'normal' ==Function Numeros_Faltantes(ByVal Donde) As String
Dim Numero As Byte, Faltan As String
For Numero = 1 To 9
If InStr(Donde, Numero) = 0 Then Faltan = Faltan & Numero
Next
Numeros_Faltantes = Faltan
End Function

-> despues usas la funcion para 'devolver' los que falten [p.e. en 'A1'] de la siguiente forma:
[B1] =Numeros_Faltantes(A1)
o... si necesitas que el resultado sea 'numerico': -> =--Numeros_Faltantes(A1)

-> cabria la posibilidad de hacerlo de otra forma, [sin macros, PERO] definiendo nombres
... [de los que SI resultan 'pelgrosos' al copiar las celdas que los usan a otros libros] :-(

si los supuestos anteriores son equivocados... comentas algun detalle adicional ?
saludos,
hector.

A esta cadena de texto, siempre la misma cadena: 123456789
... hacerle desaparecer cualquiera de los caracteres... repetidos
(no siguen ningun orden, la cadena puede ser de longitud variable, hasta 30 caracteres maximo)... ejemplo:
1472
37833
69818
36895
123123123123111113123123222222
Siempre son numeros, el "0" no entra... El resultado correcto... quedaria asi:
35689
124569
23457
1247
456789
Andaba con un "SODOKU" e intentaba plantearlo de alguna forma que me sirviera para hallar una solucion.
... funcion o formula para conseguir ese resultado que busco?
Tambien probe concatenando asi: =CONCATENAR(K16;L16;M16;N16;O16) y despues trataba de SUSTITUIR():
=SUSTITUIR(123456789;CONCATENAR(K16;L16;M16;N16;O16);"")
Pero asi no me daba el resultado correcto...
Era mejor no componer esa cadena y aplicar SUSTITUIR() 30 veces
... entonces SI conseguía lo que busco. Pero me parece exagerado hacerlo asi:
=SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(F$11;K16;"");L16;"");M16;"");N16;"");O16;"")
Si lo ve algun amigo mio se echaria a reir. :)))
Es un juego. Gracias.
Respuesta Responder a este mensaje
#3 KL
30/12/2005 - 12:38 | Informe spam
Hola chicos,

"Héctor Miguel" wrote in message
-> cabria la posibilidad de hacerlo de otra forma, [sin macros, PERO] definiendo nombres



Solo para no dejarlo en en cajon y enganchandome de esta y otras varias ideas que Hector Miguel me ha facilitado via e-mail
privado, aqui va una solucion por formula usando nombres y funciones estandar de Excel:

1) Definimos un nombre (puramente para la brevedad de la formula):
- menu Insertar>Nombre>Definir...
- nombre: Numeros
- se refiere a: ={1,2,3,4,5,6,7,8,9}
- Aceptar

2) Suponiendo que
a/ en la celda [A1] esta uno de los numeros (o cadenas de texto) que menciona Javier en su descripcion de la muestra
b/ se buscan los numeros entre 1 y 9 que falten de la cadena en [A1]

la siguiente formula haria el truco:

=--SUSTITUIR(SUMAPRODUCTO(Numeros;--ESERROR(HALLAR(Numeros;A2));10^(10-Numeros));0;"")

Y si no importa que el resultado sea una cadena de texto ordenada de forma descendiente, aqui va mi favorita que hace 10 operaciones
menos (una pijada [jejeje] ya que la diferencia en velocidad seria muy dificil de notar en todo caso, asi que es perfeccionismo
puro):

=SUSTITUIR(SUMAPRODUCTO(Numeros;--ESERROR(HALLAR(Numeros;A1));10^Numeros);0;"")

Saludos,
KL
Respuesta Responder a este mensaje
#4 KL
30/12/2005 - 12:50 | Informe spam
fe de erratas:

=--SUSTITUIR(SUMAPRODUCTO(Numeros;--ESERROR(HALLAR(Numeros;A2));10^(10-Numeros));0;"")



deberia leer:

=--SUSTITUIR(SUMAPRODUCTO(Numeros;--ESERROR(HALLAR(Numeros;A1));10^(10-Numeros));0;"")

Saludos,
KL
Respuesta Responder a este mensaje
#5 Héctor Miguel
30/12/2005 - 21:58 | Informe spam
hola, chicos !

KL escribio en el mensaje ...
1) Definimos un nombre (puramente para la brevedad de la formula):
- menu Insertar>Nombre>Definir...
- nombre: Numeros
- se refiere a: ={1,2,3,4,5,6,7,8,9}
- Aceptar
2) Suponiendo que
a/ en la celda [A1] esta uno de los numeros (o cadenas de texto) que menciona Javier en su descripcion de la muestra
b/ se buscan los numeros entre 1 y 9 que falten de la cadena en [A1]
Y si no importa que el resultado sea... texto... de forma descendiente... hace 10 operaciones menos
=SUSTITUIR(SUMAPRODUCTO(Numeros;--ESERROR(HALLAR(Numeros;A1));10^Numeros);0;"")



o... definir 'otro' nombre [a la inversa del 'normal'], considerando que de todas modos en cada formula los nombre se evaluan 3 veces...
-> nombre: Inv -> se refiere a: ={9,8,7,6,5,4,3,2,1} -> la formula que devuelve 'ordenados' los numeros que faltan...
-> =sustituir(sumaproducto(numeros,--eserror(hallar(numeros,a1)),10^inv),0,"")

saludos,
hector.

p.d. la formula [la sencilla y elegante]... ES de KL ;)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida