ENCONTRAR=FIND ???

27/11/2007 - 04:48 por Orfao | Informe spam
Hola!!
Tengo un problemita.
en una celda de la columna BG tengo datos con cualquiera de los siguientes
formatos (texto):
NC , NC+n , NC-n , N , Nada
donde N = un entero dferente de 0
C = "CC" , "FF", "FC"
n = un entero diferente de 0
(como el formato de precedentes de MSPROJECT Ej: "3FC+2" o "25FF-20" o "34"
o "8CC" , etc. )
Luego trato de separar el numero inicial de los caracteres para lo cual
busco la posicion (si exixte) de los caracteres no numericos.
si lo hago en un rango funciona ej para la fila 6
=+SI(ESNUMERO(ENCONTRAR("F";BG6));ENCONTRAR("F";BG6);99999)
(esto es una parte de la formula donde busco luego la posicion el caracter
"C" y calculo el minimo, es decir el primero que ocurrre y de no existir
coloco 99999) y de ahi extraicgo los primeros caracteres que corresponde a
los numeros
pero cuando trato de hacderlo en VBA ussando en un modulo

Xx =
IIf(Application.WorksheetFunction.IsNumber_(Application.WorksheetFunction.Find("F",
Range("BG" & x2))),_ Application.WorksheetFunction.Find("F", Range("BG" &
x2)), 99999)

Donde x2 es la fila y 99999 indicaria que no existe el caracter.

pero... funciona si y solo si El caracter (en este caso "F") existe.
es decir que por ejemplo tenga "FF8" mientras que si por ejemplo tengo "CC4"
no funciona.
Cual es mi error??
Como puedo corregir el problema??
podrian ayudarme con el codigo??? modificarlo? corregirlo? cambiarlo?..

esta seria la linea de codigo completo
Xx =
Application.WorksheetFunction.Min(IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("C",
Range("BG" & x2))), Application.WorksheetFunction.Find("C", Range("BG" &
x2)), 99999),
IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("F",
Range("BG" & x2))), Application.WorksheetFunction.Find("F", Range("BG" &
x2)), 99999))

otra preguntica: es necesario colocar siempre
"Application.WorksheetFunction" para poder usar alguna funcion ??
Gracias.
Me alimento del conocimiento de todos

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
27/11/2007 - 08:51 | Informe spam
hola, moises !

1) con respecto de tu pregunta de si es necesario calificar completamente con "Application.WorksheetFunction..."
para poder hacer uso de funciones de hoja de calculo en codigos vba...
puedes utiizar indistintamente: Application.<xFunction> o... Application.WorksheetFunciton.<xFunction>
(solo) comentarte que "algunas" funciones tienen comportamientos diferentes si la calificacion es in/completa
-> la diferencia (basicamente) es que el metodo WorksheetFunction no devuelve valores de error "manejables" para vba

2) (por otro lado) te sugiero usar metodos menos "complicados" que la mezcla/anidacion/... de varias "WorksheetFunctions"...
si lo que necesitas es localizar si en la celda se encuentra alguno de los 3 tipos de vinculo en las tareas (CC, FF, FC)
(p.e.) cambiando el uso de las "WorksheetFunction" por algo +/- como lo siguiente:
-> OJO: asumiendo que el tipo de dato asignado a la variable Xx es de tipo Long (por aquello del 99999) <= OJO
o... puedes omitir la ultima linea y sabras que el cero (0) significa que no se encontro ningun tipo de vinculo ;)

Xx = InStr(Range("bg" & x2), "CC")
If Xx = 0 Then Xx = InStr(Range("bg" & x2), "FF")
If Xx = 0 Then Xx = InStr(Range("bg" & x2), "FC")
If Xx = 0 Then Xx = 99999

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ la consulta original __
en una celda de la columna BG tengo datos con cualquiera de los siguientes formatos (texto):
NC , NC+n , NC-n , N , Nada
donde N = un entero dferente de 0
C = "CC" , "FF", "FC"
n = un entero diferente de 0
(como el formato de precedentes de MSPROJECT Ej: "3FC+2" o "25FF-20" o "34" o "8CC" , etc. )
Luego trato de separar el numero inicial de los caracteres para lo cual busco la posicion (si exixte)
de los caracteres no numericos. si lo hago en un rango funciona ej para la fila 6
=+SI(ESNUMERO(ENCONTRAR("F";BG6));ENCONTRAR("F";BG6);99999)
(esto es una parte de la formula donde busco luego la posicion del caracter "C" y calculo el minimo
es decir el primero que ocurrre y de no existir coloco 99999)
y de ahi extraicgo los primeros caracteres que corresponde a los numeros
pero cuando trato de hacderlo en VBA usando en un modulo
Xx = IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("F", Range("BG" & x2))), _


Application.WorksheetFunction.Find("F", Range("BG" & x2)), 99999)
Donde x2 es la fila y 99999 indicaria que no existe el caracter.
pero... funciona si y solo si El caracter (en este caso "F") existe.
es decir que por ejemplo tenga "FF8" mientras que si por ejemplo tengo "CC4" no funciona.
Cual es mi error? Como puedo corregir el problema? podrian ayudarme con el codigo? modificarlo? corregirlo? cambiarlo?..

esta seria la linea de codigo completo
Xx = Application.WorksheetFunction.Min(IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("C", Range("BG" & x2))), Application.WorksheetFunction.Find("C", Range("BG" & x2)), 99999), IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("F",
Range("BG" & x2))), Application.WorksheetFunction.Find("F", Range("BG" & x2)), 99999))

otra preguntica: es necesario colocar siempre "Application.WorksheetFunction" para poder usar alguna funcion ?
Respuesta Responder a este mensaje
#2 Orfao
27/11/2007 - 17:58 | Informe spam
Muchas Gracias. Hector
Para variar y como siempre tu solucion Funciona !!.
y ahora solo por curiosidad,
Con el codigo que propuse inicialmente habria forma o manera de hacerlo para
que no generara el error ??
Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

1) con respecto de tu pregunta de si es necesario calificar completamente con "Application.WorksheetFunction..."
para poder hacer uso de funciones de hoja de calculo en codigos vba...
puedes utiizar indistintamente: Application.<xFunction> o... Application.WorksheetFunciton.<xFunction>
(solo) comentarte que "algunas" funciones tienen comportamientos diferentes si la calificacion es in/completa
-> la diferencia (basicamente) es que el metodo WorksheetFunction no devuelve valores de error "manejables" para vba

2) (por otro lado) te sugiero usar metodos menos "complicados" que la mezcla/anidacion/... de varias "WorksheetFunctions"...
si lo que necesitas es localizar si en la celda se encuentra alguno de los 3 tipos de vinculo en las tareas (CC, FF, FC)
(p.e.) cambiando el uso de las "WorksheetFunction" por algo +/- como lo siguiente:
-> OJO: asumiendo que el tipo de dato asignado a la variable Xx es de tipo Long (por aquello del 99999) <= OJO
o... puedes omitir la ultima linea y sabras que el cero (0) significa que no se encontro ningun tipo de vinculo ;)

Xx = InStr(Range("bg" & x2), "CC")
If Xx = 0 Then Xx = InStr(Range("bg" & x2), "FF")
If Xx = 0 Then Xx = InStr(Range("bg" & x2), "FC")
If Xx = 0 Then Xx = 99999

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ la consulta original __
> en una celda de la columna BG tengo datos con cualquiera de los siguientes formatos (texto):
> NC , NC+n , NC-n , N , Nada
> donde N = un entero dferente de 0
> C = "CC" , "FF", "FC"
> n = un entero diferente de 0
> (como el formato de precedentes de MSPROJECT Ej: "3FC+2" o "25FF-20" o "34" o "8CC" , etc. )
> Luego trato de separar el numero inicial de los caracteres para lo cual busco la posicion (si exixte)
> de los caracteres no numericos. si lo hago en un rango funciona ej para la fila 6
> =+SI(ESNUMERO(ENCONTRAR("F";BG6));ENCONTRAR("F";BG6);99999)
> (esto es una parte de la formula donde busco luego la posicion del caracter "C" y calculo el minimo
> es decir el primero que ocurrre y de no existir coloco 99999)
> y de ahi extraicgo los primeros caracteres que corresponde a los numeros
> pero cuando trato de hacderlo en VBA usando en un modulo
> Xx = IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("F", Range("BG" & x2))), _
Application.WorksheetFunction.Find("F", Range("BG" & x2)), 99999)
> Donde x2 es la fila y 99999 indicaria que no existe el caracter.
> pero... funciona si y solo si El caracter (en este caso "F") existe.
> es decir que por ejemplo tenga "FF8" mientras que si por ejemplo tengo "CC4" no funciona.
> Cual es mi error? Como puedo corregir el problema? podrian ayudarme con el codigo? modificarlo? corregirlo? cambiarlo?..
>
> esta seria la linea de codigo completo
> Xx = Application.WorksheetFunction.Min(IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("C", Range("BG" & x2))), Application.WorksheetFunction.Find("C", Range("BG" & x2)), 99999), IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("F",
> Range("BG" & x2))), Application.WorksheetFunction.Find("F", Range("BG" & x2)), 99999))
>
> otra preguntica: es necesario colocar siempre "Application.WorksheetFunction" para poder usar alguna funcion ?



Respuesta Responder a este mensaje
#3 Héctor Miguel
28/11/2007 - 00:44 | Informe spam
hola, moises !

y ahora solo por curiosidad
Con el codigo que propuse inicialmente habria forma o manera de hacerlo para que no generara el error ?



por el comportamiento que ya te comentaba en el mensaje anterior...
-> " la diferencia (basicamente) es que el metodo WorksheetFunction no devuelve valores de error "manejables" para vba"
y por la instruccion que utilizas para comprobar si es numero "la busqueda":
-> " IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("C", Range("BG" & x2))) "

a) cuando NO ES NUMERO (que por ende la funcion devolveria "error" al usarla en la hoja de calculo)
-> el metodo "WorksheetFunction" NO le devuelve al vba un error "manejable" (y es la causa del error que obtienes) :-((

b) si OMITES el metodo (WorksheetFunction) puedes usar en lugar de la funcion ".IsNumber(...)" la funcion ".IsError(...)"
que es "lo mismo... pero diferente" (incuso usadas directamente en la hoja de calculo) :))

c) tambien te puedes "ahorrar" tanto "tipeo" de las calificaciones (Application y/o Application.WorksheetFunction)
si metes las instrucciones dentro de un bloque With ... End With (p.e.)

With Application
Xx = .Min( _
IIf(.IsError(.Find("C", Range("bg" & x2))), 99999, .Find("C", Range("bg" & x2))), _
IIf(.IsError(.Find("F", Range("bg" & x2))), 99999, .Find("F", Range("bg" & x2))))
End With

-> incluso puedes usar el metodo Evaluate("texto de la formula en ingles") que resulta en instrucciones mas "cortas" (p.e.)

Xx = Evaluate("min(if(isnumber(find({""CC"";""FC"";""FF""},bg" & x2 & ")),find({""CC"";""FC"";""FF""},bg" & x2 & ")))")

son solo diferentes "maneras de matar pulgas" :))

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#4 Orfao
28/11/2007 - 02:19 | Informe spam
Sencillamente, GENIAL!!
mas claro no canta un gallo. Gracias de nuevo Hector.
Disculpa si es indiscrecion, pero... Tienes alguna pagina personal con temas
referentes a excel o algo por el estilo ??? sería interesante..!!
Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

> y ahora solo por curiosidad
> Con el codigo que propuse inicialmente habria forma o manera de hacerlo para que no generara el error ?

por el comportamiento que ya te comentaba en el mensaje anterior...
-> " la diferencia (basicamente) es que el metodo WorksheetFunction no devuelve valores de error "manejables" para vba"
y por la instruccion que utilizas para comprobar si es numero "la busqueda":
-> " IIf(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Find("C", Range("BG" & x2))) "

a) cuando NO ES NUMERO (que por ende la funcion devolveria "error" al usarla en la hoja de calculo)
-> el metodo "WorksheetFunction" NO le devuelve al vba un error "manejable" (y es la causa del error que obtienes) :-((

b) si OMITES el metodo (WorksheetFunction) puedes usar en lugar de la funcion ".IsNumber(...)" la funcion ".IsError(...)"
que es "lo mismo... pero diferente" (incuso usadas directamente en la hoja de calculo) :))

c) tambien te puedes "ahorrar" tanto "tipeo" de las calificaciones (Application y/o Application.WorksheetFunction)
si metes las instrucciones dentro de un bloque With ... End With (p.e.)

With Application
Xx = .Min( _
IIf(.IsError(.Find("C", Range("bg" & x2))), 99999, .Find("C", Range("bg" & x2))), _
IIf(.IsError(.Find("F", Range("bg" & x2))), 99999, .Find("F", Range("bg" & x2))))
End With

-> incluso puedes usar el metodo Evaluate("texto de la formula en ingles") que resulta en instrucciones mas "cortas" (p.e.)

Xx = Evaluate("min(if(isnumber(find({""CC"";""FC"";""FF""},bg" & x2 & ")),find({""CC"";""FC"";""FF""},bg" & x2 & ")))")

son solo diferentes "maneras de matar pulgas" :))

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.



Respuesta Responder a este mensaje
#5 Héctor Miguel
28/11/2007 - 02:33 | Informe spam
hola, moises !

... Tienes alguna pagina personal con temas referentes a excel o algo por el estilo ???



no :-(( (pero)...
-> "tengo" muchas de las que echo mano con regular frecuencia (quieres un listado ?) :))

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida