Jump to content
Sign in to follow this  
Antoni

Que pasaría si no existieran las funciones de cadena

Recommended Posts

Hola a todos:

Estoy siguiendo una serie, no recuerdo bien, pero creo que en National Geographic, que se titula,"La Tierra sin nosotros", en la que se relata como sería el mundo si desapareciera la raza humana, pues bien, yo os propongo lo siguiente:

Que pasaría, si de repente, en nuestras macros, no pudieramos utilizar las funciones de cadena.

Como sería una "simple instrucción" tal que:

Libro = Mid(Right(Fichero, Len(Fichero) - Len(ThisWorkbook.Path) + 1))
[/CODE]

En primer lugar, desde dentro hacia fuera, necesitamos averiguar la longitud de Fichero y de ThisWorkbook.Path.

He desarrollado esta función, con la inestimable colaboración de [b]neverdelimon1[/b], para hallar la longitud de un texto, no pretendo que sea, ni la única, ni la mejor, ni la mas rápida, por lo que se agradece de antemano cualquier modificación.

[b][size=4]FUNCION LEN[/size][/b]

[CODE]Function xLen(Texto As Variant)
On Error GoTo Salida
Dim Cadena() As Byte, UboundCadena As Integer
'Obtenemos la longitud del texto
'-------------------------------
Cadena = Texto
While UboundCadena = UboundCadena
If Cadena(UboundCadena) > 0 Then xLen = xLen + 1
UboundCadena = UboundCadena + 1
Wend
Salida:
End Function
[/CODE]

Algunos os preguntareis, ¿Y para que?, pues en primer lugar, por pura diversión y en segundo lugar, para que los que empiezan ahora, que no han tenido la suerte de tener que empezar a programar desde abajo, vean que en cada instrucción de un lenguaje de alto nivel, se esconde un montón de código que es transparente para ellos.

Os animo a que participeis y envieis vuestras versiones de Left, Right, Mid, Split, Replace,........

¡ Ah ! Recordad que no podeis usar ninguna función de cadena en vuestras aportaciones (excepto Chr y similares).

Salu2 a to2222222222 to 22222222.

Antoni.

Share this post


Link to post
Share on other sites

Antoni muy buena tu propuesta, gracias por compartirla y con tu permiso modifico ligeramente tu UDF para que haga referencia a una celda [porque segun lo que revise solo funciona cuando se ingresa el texto directamente "xLen("gerson") ]

Function xLen2(Texto As Range)
On Error GoTo Salida
Dim Cadena() As Byte, UboundCadena As Integer
'Obtenemos la longitud del texto
'-------------------------------
Cadena = Texto
While UboundCadena = UboundCadena
If Cadena(UboundCadena) > 0 Then xLen2 = xLen2 + 1
UboundCadena = UboundCadena + 1
Wend
Salida:
End Function[/PHP]

Saludos desde Honduras

Share this post


Link to post
Share on other sites

Hola Gerson:

La forma de llamar a la función dentro de una macro, sería:

Longitud = xLen(Texto)[/CODE]

Pero el aporte no está pensado para ser usado, si no para ilustrar lo que nos ahorramos de escribir con la función LEN de VBA, que por supuesto, será infinitamente mas simple y mas rápida.

Salu2. Antoni.

Share this post


Link to post
Share on other sites

Mas simple, si valen errores y contadores de array, quedaria asi:

Public Function zLen(rango() As Byte)
On Error GoTo output
For i = 1 To 2 ^ 15: rango(i) = 0: Next
output:
MsgBox i / 2
End Function[/CODE]

En realidad esto tendria sentido si estuvieramos hablando de C#, en VB hay muchisimo mas detras, al asignar la cadena al array es cuando se crea el valor de Len e incluso si este no se usa seguira existiendo como valor del propio objeto, y aun que no lo uses manualmente en el codigo el bucle si que lo usa por que si no, ¿Como demonios iba a saber de que longitud tiene que crear el array?

Realmente lo que se esta haciendo aqui es, usar LEN (disimuladamente) para asignar su valor a la longitud de un array, recorrer todo el array y capturar el error que se produce cuando se intenta escribir fuera de ese rango. Si lo piensas bien, esto no tiene mucho sentido. Pero bueno, mejor que hacer un sudoku no?, Parece que no soy el unico que se aburre ...ja...ja..

Saludos

Share this post


Link to post
Share on other sites
Hola DRAMIDOM:

Llegarás, no te preocupes, si sabemos mas no es por listos, si no por viejos, o porqué empezamos antes.

Saludos. Antoni.

Si ya se, es como el niño que empieza gateando y ya pretente correr jeje... Pero bien solo observo a modo de aprender del conocimiento de los demas.

Share this post


Link to post
Share on other sites

Hola

Desde luego que todo el merito es para el master Antoni (porque a mi ni se me hubiera ocurrido jejejejejej).

Y ya que estamos entrando en el pasado y puesto que no estamos tomando en cuenta el rendimiento ni nada por el estilo, que tal un bucle simulado, de los primeros que nos permitia VB de hace ya muchos antaños.

 Function xLen(Texto As Variant) As Integer
0 On Error Resume Next
1 Dim Cadena() As Byte, UboundCadena As Integer
2 'Obtenemos la longitud del texto
3 '-------------------------------
4 Cadena = Texto
5 Cadena(UboundCadena) = Cadena(UboundCadena)
6 If Err.Number = 0 Then
7 If Cadena(UboundCadena) > 0 Then xLen = xLen + 1
8 UboundCadena = UboundCadena + 1
9 GoTo 5 'bucle simulado
10 End If
11 End Function
Sub test()
0 ' Para probar la funcion anterior
1 Dim a As Integer
2 a = xLen("Hola Antoni")
3 MsgBox "Número de caracteres: " & a, vbInformation
4 End Sub[/CODE]

Saludos cordiales

Share this post


Link to post
Share on other sites

Hola a todos:

Hoy en que pasaría si no existiera,..... la función:

Find

Dim Celda, Desde As Long, Hasta As Long, Fila As Long, x As Integer
Sub Buscar(Valor)

'Solo admitimos selecciones de 1 Area y 1 Columna
If Selection.Areas.Count > 1 Or _
Selection.Columns.Count > 1 Then Exit Sub

'Inicializamos variables
Desde = 100000
Hasta = 0

'Buscamos 1ª celda y última celda
For Each Celda In Selection
If Celda.Row > Hasta Then Hasta = Celda.Row
If Celda.Row < Desde Then Desde = Celda.Row
Next

'Busqueda dicotómica
While Hasta - Desde > 1
Fila = Desde + Int((Hasta - Desde) / 2)
If ActiveSheet.Cells(Fila, ActiveCell.Column) = Valor Then
ActiveSheet.Cells(Fila, ActiveCell.Column).Select
Exit Sub
End If
If ActiveSheet.Cells(Fila, ActiveCell.Column) < Valor Then
Desde = Fila
Else
Hasta = Fila
End If
Wend

End Sub
[/CODE]

Este procedimiento busca un valor en una rango de celdas seleccionado, [b]ORDENADO DE MENOR A MAYOR[/b].

Proporciona solamente una coincidencia, seleccionando la celda.

En caso de muchas coincidencias, no se puede garantizar cual será el seleccionado.

Sea cual sea la cantidad de celdas del rango, se garantiza que el numero de iteraciones hasta conseguir o no la coincidencia, será menor de [b]Logaritmo en base 2 del numero de celdas que contenga el rango + 1[/b], así por ejemplo, una búsqueda entre 12.000 celdas se realizará en un máximo de 20 iteraciones.

Salu2. Antoni.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

INFORMACIÓN BÁSICA SOBRE PROTECCIÓN DE DATOS

Responsable: Sergio Andrés Celemín

Finalidad: Moderar y responder comentarios de usuarios. Recuerda que la información que facilites es pública, y los datos que incluyas los leerá cualquier visitante de esta web, así como el avatar que poseas.

Legitimación: Consentimiento del interesado.

Destinatarios: Hetzner Online GmbH.

Derechos: Puedes ejercitar en cualquier momento tus derechos de acceso,
rectificación, supresión, oposición y demás derechos legalmente establecidos a
través del email sergio@ayudaexcel.com.

Información adicional: Encontrarás más información en la política de privacidad.

Sign in to follow this  



×
×
  • Create New...

Important Information

Privacy Policy