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
 

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 ?

Preguntas similares