Espero se pueda mejorar este codigo...

Solo consultas sobre macros y código VBA Excel.

Reglas del Foro
1. Antes de hacer tu pregunta intenta con el buscador de este foro (muchas preguntas ya fueron respondidas antes!)
2. Si haces una nueva pregunta, es muy recomendable que adjuntes el ejemplo Excel para poder comprenderla mejor!
3. Realiza tu pregunta de forma clara, explicando bien cada paso de lo que haces y tendrás más probabilidad de respuesta!
Compartir en:
     

Espero se pueda mejorar este codigo...

Notapor jarturo » 23 Ago 2006 21:08

Que tal compañeros de nueva cuenta quiero pedir apoyo a ver si es posible mejorar la siguiente rutina: :oops:

Código: Seleccionar todo
Function DepuraCadenas(xxAsunto As String) As String
Dim Temporal As String
    Temporal = Replace(xxAsunto, "'", "", 1)        ''
    Temporal = Replace(Temporal, ".", "", 1)        '.
    Temporal = Replace(Temporal, Chr$(34), "", 1)   '"
    Temporal = Replace(Temporal, Chr$(42), "", 1)   '*
    Temporal = Replace(Temporal, Chr$(47), "", 1)   '/
    Temporal = Replace(Temporal, Chr$(58), ";", 1)  ':
    Temporal = Replace(Temporal, Chr$(60), "", 1)   '<
    Temporal = Replace(Temporal, Chr$(62), "", 1)   '>
    Temporal = Replace(Temporal, Chr$(63), "", 1)   '?
    Temporal = Replace(Temporal, Chr$(92), "", 1)   '\
    Temporal = Replace(Temporal, Chr$(124), ")", 1) '|

Temporal = Left(Temporal, 40)
DepuraCadenas = Temporal
End Function

Esta rutina trabaja bien, reemplaza ciertos caracteres que no permiten la creacion de un nombre valido para un archivo pero resulta que por la cantidad de nombres es una rutina muy lenta, ademas que deseo ampliar el numero de caracteres a sustituir, no se si de alguna manera se pueda que en vez de ir linea a linea revisando si existe un caracter no deseado estos puedan ir en una matriz y por consiguiente optimizar la depuracion de caracteres. (Espero haberme explicado :? )

De antemano gracias y saludos desde México D.F.
* Te recomendamos estos productos Excel: Manual de Macros | Manual de Funciones | Nuevas Funciones | ddTraDa
Avatar de Usuario
jarturo
Miembro Frecuente
Miembro Frecuente
 
Registrado: 03 Mar 2005 13:33
Ubicación: México D.F.

Re: Espero se pueda mejorar este codigo...

Notapor p@li » 24 Ago 2006 08:00

Hola a mi, se me ocurren dos ideas
1.- No crear una variable temporal

Function DepuraCadenas(byval xxAsunto As String) As String
xxAsunto = Replace(xxAsunto, "'", "", 1) ''
xxAsunto = Replace(xxAsunto , ".", "", 1) '.
xxAsunto = Replace(xxAsunto , Chr$(34), "", 1) '"
xxAsunto = Replace(xxAsunto , Chr$(42), "", 1) '*
xxAsunto = Replace(xxAsunto , Chr$(47), "", 1) '/
xxAsunto = Replace(xxAsunto , Chr$(58), ";", 1) ':
xxAsunto = Replace(xxAsunto , Chr$(60), "", 1) '<
xxAsunto = Replace(xxAsunto , Chr$(62), "", 1) '>
xxAsunto = Replace(xxAsunto , Chr$(63), "", 1) '?
xxAsunto = Replace(xxAsunto , Chr$(92), "", 1) '\
xxAsunto = Replace(xxAsunto , Chr$(124), ")", 1) '|
xxAsunto = Left(xxAsunto , 40)
DepuraCadenas = xxAsunto
End Function

2.- Poner Un Replace dentro de otro, no es muy prolijo

Function DepuraCadenas(ByVal xxAsunto As String) As String
DepuraCadenas = Left(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(xxAsunto, "'", "", 1), ".", "", 1), Chr$(34), "", 1), Chr$(42), "", 1), Chr$(47), "", 1), Chr$(58), ";", 1), Chr$(60), "", 1), Chr$(62), "", 1), Chr$(63), "", 1), Chr$(92), "", 1), Chr$(124), ")", 1), 40) '.
End Function


Saludos.
* Te recomendamos estos productos Excel: Manual de Macros | Manual de Funciones | Nuevas Funciones | ddTraDa
Avatar de Usuario
p@li
Miembro Frecuente
Miembro Frecuente
 
Registrado: 04 Oct 2005 16:55
Ubicación: Argentina

Re: Espero se pueda mejorar este codigo...

Notapor jarturo » 24 Ago 2006 10:34

Que tal P@li,

Gracias son dos buenos ejemplos, ya los aplique pero como son diferentes longitudes de cadenas y con diferentes caracteres que pienso aumentar la rutina aún así­ es muy lenta y ayer navegando por esta pagina encontre este codigo para que detecta si tienes caracteres no validos
Código: Seleccionar todo
    Dim CarInvalidos As Variant, I As Long
    CarInvalidos = Array(":", "\", "/", "?", "*", "[", "]")
    For I = 0 To UBound(CarInvalidos)
        If InStr(Nombre, CarInvalidos(I)) Then
            MsgBox "El nombre """ & Nombre _
                & """ contiene caracteres invalidos: """ _
                    & CarInvalidos(I) & """."
            NombreValido = False
            Exit Function
        End If
    Next I
    NombreValido = True


No se si esta rutina se pueda utilizar con el array y aplicar a lo que necesito, de antemano gracias por tu apoyo y que tengan todos un buen dí­a!!! :D
* Te recomendamos estos productos Excel: Manual de Macros | Manual de Funciones | Nuevas Funciones | ddTraDa
Avatar de Usuario
jarturo
Miembro Frecuente
Miembro Frecuente
 
Registrado: 03 Mar 2005 13:33
Ubicación: México D.F.

Re: Espero se pueda mejorar este codigo...

Notapor p@li » 24 Ago 2006 10:39

Seguramente se puede usar con array, pero eso no va a acelerar la función, es más yo creo q va a tardar el mismo o más tiempo que la función original que diste.

Saludos
* Te recomendamos estos productos Excel: Manual de Macros | Manual de Funciones | Nuevas Funciones | ddTraDa
Avatar de Usuario
p@li
Miembro Frecuente
Miembro Frecuente
 
Registrado: 04 Oct 2005 16:55
Ubicación: Argentina

Re: Espero se pueda mejorar este codigo...

Notapor KL » 24 Ago 2006 12:04

Hola chicos,
jarturo";p="30388 escribió:encontre este codigo para que detecta si tienes caracteres no validos

Dim CarInvalidos As Variant, I As Long
CarInvalidos = Array(":", "", "/", "?", "*", "[", "]")
For I = 0 To UBound(CarInvalidos)
If InStr(Nombre, CarInvalidos(I)) Then
MsgBox "El nombre """ & Nombre _
& """ contiene caracteres invalidos: """ _
& CarInvalidos(I) & """."
NombreValido = False
Exit Function
End If
Next I
NombreValido = True


Je je je!!! Me suena el codigo ;-)

A ver esto:

Código: Seleccionar todo
Function LimpiarNombre(Texto As String)
    Dim RegExp As Object
    Set RegExp = CreateObject("vbscript.regexp")
    With RegExp
        .Pattern = "['.""*/:<>?\\|]"
        .Global = True
        LimpiarNombre = .Replace(Texto, "")
    End With
End Function


Para mas informacion sobre Expresiones Regulares:

http://support.microsoft.com/kb/818802/es
http://msdn.microsoft.com/library/defau ... 6a7353.asp
http://www.tmehta.com/regexp/
* Te recomendamos estos productos Excel: Manual de Macros | Manual de Funciones | Nuevas Funciones | ddTraDa
KL
Miembro Frecuente
Miembro Frecuente
 
Registrado: 18 Mar 2006 13:57
Ubicación: Madrid

Re: Espero se pueda mejorar este codigo...

Notapor jarturo » 25 Ago 2006 15:34

P@li, Gracias por tu interes en mis preguntas :wink: , KL me dio un código muy interesante y creo que el código en el que querí­a apoyarme es de él :oops: , nuevamente gracias y espero seguir contando con tu ayuda más adelante :wink: .

KL tu código trabaja de pelos!!! y gracias por los links ya tengo tarea para leer y aprender algo más.

Gracias a todos los que crean y hacen posible este excelente foro de aprendisaje, Saludos a todosss!!! :lol: :lol: :lol:
* Te recomendamos estos productos Excel: Manual de Macros | Manual de Funciones | Nuevas Funciones | ddTraDa
Avatar de Usuario
jarturo
Miembro Frecuente
Miembro Frecuente
 
Registrado: 03 Mar 2005 13:33
Ubicación: México D.F.


Compartir en:
     

  • Anuncio
Manual Excel avanzado

Volver a Macros

¿Quién está conectado?

Usuarios navegando por este Foro: Inti, joseA y 10 invitados