Macro reemplazar Formula

07/07/2005 - 08:31 por mbergaretxe | Informe spam
Hola grupo, especialmente a ti KL que tanto me has ayudado.

Creo saber donde se produce el problema (pero no la solución).

Vuelvo a explicarlo (a ver si esta vez más claramente). Utilizo el
procedimiento que KL me pasó como ejemplo:

Sub Test2()


If ActiveCell.HasFormula Then
ActiveCell.Replace _
What:="CALL(G2,", _
Replacement:="AnguloARadiens(G2,", _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False
End If
End Sub





Estas líneas de código están dentro de un bucle (de 0 hasta 8). Los datos
de búsqueda (de 0 a 8) los tengo en un array y los de reemplazo en otro.

El problema está en que cuando se produce uno de los 8 posibles reemplazos
(la celda aún está sin reemplazar del todo), Excel evalua la formula como
no válida.

Mi código es algo así:

for I = 0 to 8
If ActiveCell.HasFormula Then
ActiveCell.Replace _
What:=ListaBusqueda(I), _
Replacement:=ListaReemplazo(I), _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False
End If
Next I

donde ListaBusqueda(0) = "Funcion1("
donde ListaBusqueda(1) = "Funcion2("
donde ListaBusqueda(2) = "Funcion3("
...

y
ListaReemplazo(0) = "FuncionAntigua1("
ListaReemplazo(1) = "FuncionAntigua2("
ListaReemplazo(2) = "FuncionAntigua3("

..

Así al realizar un reemplazo de la siguiente Celda:

X1 por ejemplo
=FuncionAntigua1(...;FuncionAntigua2(...;FuncionAntigua5(...)
serían necesarios 3 pasos correctos del bucle, cuando terminase el mismo,
la celda quedaría con los valores
=Funcion1(...;Funcion2(...;Funcion5(...), pero no realiza ninguno de los 3
cambios necesarios aunq ListaBusqueda(I) tiene el valor correcto que se
busca (lo he trazado, paso por la línea de replace pero no lo hace).

No se si habrá quedado muy claro. Espero que si. La hoja no la puedo
exponer porque es de un cliente y debería pedirlo permiso, etc etc

Gracias por toda vuestra ayuda. Mikel

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
07/07/2005 - 08:53 | Informe spam
hola, Mikel !

... lineas de codigo... dentro de un bucle (de 0 hasta 8)
... datos de busqueda... en un array y los de reemplazo en otro.
for I = 0 to 8
If ActiveCell.HasFormula Then
ActiveCell.Replace _
What:=ListaBusqueda(I), _
Replacement:=ListaReemplazo(I), _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False
End If
Next I
donde ListaBusqueda(0) = "Funcion1("
donde ListaBusqueda(1) = "Funcion1("
donde ListaBusqueda(2) = "Funcion3("
...
ListaReemplazo(0) = "FuncionAntigua1("
ListaReemplazo(1) = "FuncionAntigua2("
ListaReemplazo(2) = "FuncionAntigua3("
..
... al realizar un reemplazo de la siguiente Celda: X1 por ejemplo
=FuncionAntigua1(...;FuncionAntigua2(...;FuncionAntigua5(...)
serian necesarios 3 pasos correctos del bucle, cuando terminase el mismo, la celda quedaría con los valores
=Funcion1(...;Funcion2(...;Funcion5(...)
... no realiza ninguno de los 3 cambios... aunq ListaBusqueda(I) tiene el valor correcto que se busca [...]



[segun se 'aprecia' de la exposicion anterior]... me parece que SOLO tienes 'invertidas' las matrices/arrays y los argumentos :))
-> el parametro 'What:=ListaBusqueda(I)'
esta buscando los valores_textos que [se supone] EXISTEN ACTUALMENTE en las celdas ["Funcion1(", "Funcion2(", etc.]
-> el parametro 'Replacement:=ListaReemplazo(I)'
'deja/cambia/sustituye/...' los valores anteriores [si los encuentra] ->por los 'nuevos'<- ["FuncionAntigua1(", "FuncionAntigua2(", etc.]

-> invierte la matriz asignada a los parametros What y Replacement ;)

saludos,
hector.
Respuesta Responder a este mensaje
#2 mbergaretxe
07/07/2005 - 10:24 | Informe spam
Ojala fuese tan fácil Hector, no es lo que tu me dices (aunque lo he
probado por sea caso), el caso el que sigue dejando celdas (unas 40) con
formulas como la siguiente:

=LLAMAR(G2;2*(ATAN(SENO((LLAMAR(G3;D114)+LLAMAR(G3;D115))/2)/(COS((LLAMAR(G3;D114)-LLAMAR(G3;D115))/2)*(TAN((LLAMAR(G3;D129)+LLAMAR(G3;D95))/2))))))

En las que hubieran sido necesarios 2 únicos reemplazos, el de LLAMAR(G2;
y LLAMAR(G3; (ambos se encuentran en el array ListaBusqueda(I)).

Creo que el Kit de la cuestión es que cuando realiza el primero de los
reemplazos del bucle, (el que reemplazatía todas las ocurrencias de
LLAMAR(G2;), Excel se encuentra con una fórmula no válida y no realiza ni
el primero ni el seguno de los reemplazos necesarios (la prueba está en
que en otras celdas, dichos reemplazos funcionan correctamente).

Creo que me podriais ayudar si me dicis cómo tratar dichas celdas que
contienen fórmulas como textos, realizar la conversión completa y asignar
a la celda la nueva fórmula resultante (no se cómo hacer ésto).

Gracias por vuestro tiempo. Mikel
Héctor Miguel wrote:

hola, Mikel !

> ... lineas de codigo... dentro de un bucle (de 0 hasta 8)
> ... datos de busqueda... en un array y los de reemplazo en otro.
> for I = 0 to 8
> If ActiveCell.HasFormula Then
> ActiveCell.Replace _
> What:=ListaBusqueda(I), _
> Replacement:=ListaReemplazo(I), _
> LookAt:=xlPart, _
> SearchOrder:=xlByRows, _
> MatchCase:=False
> End If
> Next I
> donde ListaBusqueda(0) = "Funcion1("
> donde ListaBusqueda(1) = "Funcion1("
> donde ListaBusqueda(2) = "Funcion3("
> ...
> ListaReemplazo(0) = "FuncionAntigua1("
> ListaReemplazo(1) = "FuncionAntigua2("
> ListaReemplazo(2) = "FuncionAntigua3("
> ..
> ... al realizar un reemplazo de la siguiente Celda: X1 por ejemplo
> =FuncionAntigua1(...;FuncionAntigua2(...;FuncionAntigua5(...)
> serian necesarios 3 pasos correctos del bucle, cuando terminase el mismo,


la celda quedaría con los valores
> =Funcion1(...;Funcion2(...;Funcion5(...)
> ... no realiza ninguno de los 3 cambios... aunq ListaBusqueda(I) tiene el


valor correcto que se busca [...]

[segun se 'aprecia' de la exposicion anterior]... me parece que SOLO tienes


'invertidas' las matrices/arrays y los argumentos :))
-> el parametro 'What:=ListaBusqueda(I)'
esta buscando los valores_textos que [se supone] EXISTEN ACTUALMENTE en


las celdas ["Funcion1(", "Funcion2(", etc.]
-> el parametro 'Replacement:=ListaReemplazo(I)'
'deja/cambia/sustituye/...' los valores anteriores [si los encuentra]


->por los 'nuevos'<- ["FuncionAntigua1(", "FuncionAntigua2(", etc.]

-> invierte la matriz asignada a los parametros What y Replacement ;)

saludos,
hector.
Respuesta Responder a este mensaje
#3 Héctor Miguel
07/07/2005 - 10:39 | Informe spam
hola, Mikel !

... sigue dejando celdas (unas 40) con formulas como la siguiente: [...]
... como tratar dichas celdas que contienen formulas como textos [...]



otra 'posibilidad' [que 'me salta' al revisar el codigo expuesto] es...
-> dentro del bucle estas haciendo la referencia a 'la celda' como la celda 'activa'...
> for I = 0 to 8
> If ActiveCell.HasFormula Then
> ActiveCell.Replace _
> What:=ListaBusqueda(I), _
> Replacement:=ListaReemplazo(I), _
> LookAt:=xlPart, _
> SearchOrder:=xlByRows, _
> MatchCase:=False
> End If
> Next I





'eso' significa que [por codigo] la celda 'activa' [supongo que son las que tengan formulas]
-> esta siendo ->seleccionada<- en cada paso del bucle -?-

'serviria' si expones 'que hay' de instrucciones en el codigo ANTES [y despues] del bucle for I = 0 to 8
comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#4 mbergaretxe
07/07/2005 - 10:50 | Informe spam
Hola Hector,

Mas o menos esta sería la función de la macro que realiza los reemplazos
en 30 columnas de las hojas del libro (en algunas lo hace bien y en otras
no hace nada):

For Each HojaActual In LibroActual.Worksheets
HojaActual.Unprotect
HojaActual.Activate
For NumeroColumna = 1 To 29
Contador = 1
CaracterCelda = ListaCeldas(NumeroColumna - 1)
CeldaActual = CaracterCelda + CStr(Contador)
Range(CeldaActual).Select
Do
If ActiveSheet.Range(CeldaActual).Locked Then
ActiveSheet.Range(CeldaActual).Locked = False
End If
If ActiveCell.HasFormula Then
For I = 0 To 7
ActiveCell.Replace _
What:=ListaReemplazo(I), _
Replacement:=ListaBusqueda(I), _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False
ActiveCell.Replace _
What:=ListaReemplazo(I), _
Replacement:=ListaBusquedaDolar(I), _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False
Next I
End If
Contador = Contador + 1
CeldaActual = CaracterCelda + CStr(Contador)
Range(CeldaActual).Select
Loop While Not Contador > 300
Next NumeroColumna
HojaActual.Protect
Next HojaActual

Héctor Miguel wrote:

hola, Mikel !

> ... sigue dejando celdas (unas 40) con formulas como la siguiente: [...]
> ... como tratar dichas celdas que contienen formulas como textos [...]

otra 'posibilidad' [que 'me salta' al revisar el codigo expuesto] es...
-> dentro del bucle estas haciendo la referencia a 'la celda' como la celda


'activa'...
>> > for I = 0 to 8
>> > If ActiveCell.HasFormula Then
>> > ActiveCell.Replace _
>> > What:=ListaBusqueda(I), _
>> > Replacement:=ListaReemplazo(I), _
>> > LookAt:=xlPart, _
>> > SearchOrder:=xlByRows, _
>> > MatchCase:=False
>> > End If
>> > Next I

'eso' significa que [por codigo] la celda 'activa' [supongo que son las que


tengan formulas]
-> esta siendo ->seleccionada<- en cada paso del bucle -?-

'serviria' si expones 'que hay' de instrucciones en el codigo ANTES [y


despues] del bucle for I = 0 to 8
comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#5 KL
07/07/2005 - 10:50 | Informe spam
Hola Mikel,

Apartemos por momento el tema de las matrices con diferentes funciones. Lo
que me sorprende es que en mi sistema los siguientes codigos (que te habia
puesto antes) funcionen perfectamente con cada uno de tus ejemplos y todos
ellos a la vez:

Sub Test3()
Dim rng as Range
On Error Resume Next
Set rng = _
ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas)
If rng Is Nothing Then Exit Sub
rng.Replace "CALL(", "AnguloARadiens(", , , False
End Sub

Sub Test2()
If ActiveCell.HasFormula Then
ActiveCell.Replace _
What:="CALL(", _
Replacement:="AnguloARadiens(", _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False
End If
End Sub

Mi pregunta es: ?has probado el primer macro que te pongo aqui con solo una
funcion, sin bucles? ?No te ha funcionado?

Me preocupa, que hayas abierto ya 3 hilos diferentes con el mismo tema, pero
no he tenido claridad en este punto tan basico :-)

Saludos,
KL



"Mikel" wrote in message
news:
Ojala fuese tan fácil Hector, no es lo que tu me dices (aunque lo he
probado por sea caso), el caso el que sigue dejando celdas (unas 40) con
formulas como la siguiente:

=LLAMAR(G2;2*(ATAN(SENO((LLAMAR(G3;D114)+LLAMAR(G3;D115))/2)/(COS((LLAMAR(G3;D114)-LLAMAR(G3;D115))/2)*(TAN((LLAMAR(G3;D129)+LLAMAR(G3;D95))/2))))))

En las que hubieran sido necesarios 2 únicos reemplazos, el de LLAMAR(G2;
y LLAMAR(G3; (ambos se encuentran en el array ListaBusqueda(I)).

Creo que el Kit de la cuestión es que cuando realiza el primero de los
reemplazos del bucle, (el que reemplazatía todas las ocurrencias de
LLAMAR(G2;), Excel se encuentra con una fórmula no válida y no realiza ni
el primero ni el seguno de los reemplazos necesarios (la prueba está en
que en otras celdas, dichos reemplazos funcionan correctamente).

Creo que me podriais ayudar si me dicis cómo tratar dichas celdas que
contienen fórmulas como textos, realizar la conversión completa y asignar
a la celda la nueva fórmula resultante (no se cómo hacer ésto).

Gracias por vuestro tiempo. Mikel
Héctor Miguel wrote:

hola, Mikel !



> ... lineas de codigo... dentro de un bucle (de 0 hasta 8)
> ... datos de busqueda... en un array y los de reemplazo en otro.
> for I = 0 to 8
> If ActiveCell.HasFormula Then
> ActiveCell.Replace _
> What:=ListaBusqueda(I), _
> Replacement:=ListaReemplazo(I), _
> LookAt:=xlPart, _
> SearchOrder:=xlByRows, _
> MatchCase:=False
> End If
> Next I
> donde ListaBusqueda(0) = "Funcion1("
> donde ListaBusqueda(1) = "Funcion1("
> donde ListaBusqueda(2) = "Funcion3("
> ...
> ListaReemplazo(0) = "FuncionAntigua1("
> ListaReemplazo(1) = "FuncionAntigua2("
> ListaReemplazo(2) = "FuncionAntigua3("
> ..
> ... al realizar un reemplazo de la siguiente Celda: X1 por ejemplo
> =FuncionAntigua1(...;FuncionAntigua2(...;FuncionAntigua5(...)
> serian necesarios 3 pasos correctos del bucle, cuando terminase el
> mismo,


la celda quedaría con los valores
> =Funcion1(...;Funcion2(...;Funcion5(...)
> ... no realiza ninguno de los 3 cambios... aunq ListaBusqueda(I) tiene
> el


valor correcto que se busca [...]

[segun se 'aprecia' de la exposicion anterior]... me parece que SOLO
tienes


'invertidas' las matrices/arrays y los argumentos :))
-> el parametro 'What:=ListaBusqueda(I)'
esta buscando los valores_textos que [se supone] EXISTEN ACTUALMENTE
en


las celdas ["Funcion1(", "Funcion2(", etc.]
-> el parametro 'Replacement:=ListaReemplazo(I)'
'deja/cambia/sustituye/...' los valores anteriores [si los encuentra]


->por los 'nuevos'<- ["FuncionAntigua1(", "FuncionAntigua2(", etc.]

-> invierte la matriz asignada a los parametros What y Replacement ;)



saludos,
hector.




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