Saltar al contenido

Recommended Posts

publicado

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.

publicado

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

publicado

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.

publicado

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

publicado

Hola DRAMIDOM:

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

Saludos. Antoni.

publicado
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.

publicado

El merito es de Never, que fue quien me indicó como.

¡ Ah ! mucha suerte para hoy, que si ganais, nos ahorramos 15 millones de euros en primas a los jugadores.

Salu2. Antoni.

publicado

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

publicado

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.

Conéctate para comentar

Podrás dejar un comentario después de conectarte



Conéctate ahora
  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      189
    • Comentarios
      99
    • Revisiones
      29

  • Crear macros Excel

  • Mensajes

    • Hola Buenas Noches, Me podrán ayudar a resolver un problema con una planilla que tengo, les comento brevemente. Tengo un archivo que cuenta con 2 hojas, la primera se llama "Movimientos" que básicamente muestra los productos con quiebres que se presentan y la hoja "Producción" que como su nombre lo dice son las producciones de cada producto según fecha de creación. Lo que necesito es lo siguiente: Cada vez que agregue una producción en la hoja "producción", debo ingresar el código creado su cantidad y lote respetivamente, además de la fecha en que se realiza la producción, en caso que sea mayor a las 12:00 se considera PM sino AM. Lo complejo es acá en la otra hoja llamada Movimientos: Esta hoja contiene una columna que se llama "Saldo", que básicamente es la diferencia de lo producido vs el quiebre en esa fecha. Una columna llamada "Cumple", que significa que ese pedido lleva si o no el producto con quiebre. Y una columna "Se preparo", que es si el pedido se preparo o no. Lo complicado viene acá es que si la fecha de la producción que ingrese en la hoja "Produccion", se hace después de la fecha de la hoja movimientos no me debe contar esa producción para efecto de la columna Saldos, si la fecha es igual o menor si se considera y ese saldo que queda disponible se puede ocupar para futuros ingresos de pedidos. Otra conducción es que las producciones siempre se deben asignar al pedido más antiguo de ese código salvo que la fecha de entrega ya haya pasado. La columna "Cumple" es básicamente para poder generar un KPI donde me indique cuales producciones se cumplieron con el plazo y cuales No. Espero me puedan ayudar ya que tengo la siguiente formula pero no sirve ya que me toma las unidades totales y no cumple con la restricción del horario. =SUMAR.SI(Produccion!A:A; $A2; Produccion!C:C) - SUMAR.SI.CONJUNTO($E$2:$E2; $A$2:$A2; A2)) Muchas gracias. Ejemplo..xlsx
    • Hola a ambos, Prueba con: =BYROW(G5:G6;LAMBDA(x;UNIRCADENAS(" - ";1;FILTRAR(E5:E10;B5:B10=x)))) Saludos,
    • Si tienes office 365 puedes usar algo como FILTER ó TEXTJOIN y si no tienes, entonces se puede jugar con las formulas, pero no te recomiendo mucho si son muchos datos, de todas maneras te dejo una fórmula y en vba, ya tu decides cual ocupar, vale Saludos BUSCAR.xlsm
    • Buenos días mis estimados Familia ayudaexcel,  Favor quisiera solicitar su gentil soporte con lo siguiente: Necesito una formula que al buscar encuentre el valor inicial de busqueda y dea todo los resultados encontrado en una celda como ejemplo. si este producto tienes 4 cantidades esta al hacer una formula de busqueda me dea el resultado de las 4 en una celda, dejo el adjunto a espera de su gran soporte.   BUSCAR.xlsx
    • Saludos Sr @Israel Cassales espero este bien quise verificar bien su solución y que las modificaciones que hice funcionarán adecuadamente y al respecto debo decir que su aporte es excelente ya que no solo me ayudo a resolver lo que necesitada sino que también me ayudo a solventar dos cosas más por lo cual estoy muy agradecido 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.