Canviar el valor de otra celda

28/08/2004 - 17:00 por marc_ | Informe spam
Hola a todos, tengo un problema que no se com solucionar. Necesito
canviar el valor de una celda, a partir de una funcion. Por ejemplo:

Si en la hoja escribo en una celda "=prueba(0,4)" y la funcion es:

Function prueba(num as double)as double
num = ActiveSheet.Cells(1,1).value
prueba = num
end Function

la funcion prueba me retorna el valor de la celda A1. Però lo que
necesito es que en la funcion se canvie el valor de la celda A1 o sea algo
asi como

Function prueba(num as double)as double
ActiveSheet.Cells(1,1).value = a
prueba = a
end Function

però el lenguaje no me deja cambiar el valor de la celda A1 desde esta
función.

Como podria hacer cambios a otra celda desde una funcion llamada de esta
forma, o se escribiendo en una celda cualquiera
"=nombre_funcion(<variables>)"

Gracias.

Preguntas similare

Leer las respuestas

#1 Adolfo
29/08/2004 - 10:39 | Informe spam
Por lo que comentas quieres poder cambiar el valor de las
celdas de una hoja desde el código de una función.

Seguidamente tienes un ejemplo.

Sub pru()
MsgBox "Valor de la Prueba: " & prueba(6)
End Sub

Function prueba(a As Byte) As Single
Dim R As Range
Set R = Range("a1.c" & a)
R.Value = Rnd
prueba = Application.WorksheetFunction.Sum(R)
End Function

No se si es algo así lo que necesitas.

Un saludo.
Adolfo
www.excelavanzado.com
Respuesta Responder a este mensaje
#2 marc_
29/08/2004 - 12:17 | Informe spam
Gracias Adolfo, peró en el ejemplo que me diste al dejar el codigo asi
(que seria como lo necesitaria)

Function prueba(a As Byte) As Single
Dim R As Range
Set R = Range("a1")
R.Value = a
prueba = a
End Function

me pasa lo mismo que en la funcion que deje escrita en el primer ejemplo,
justo en la linea "R.Value = a" el programa se para.La funcio la tendria
que llamar escriendo en la celda B5 "=prueba(6)" y me deberia escribir 6
en la celda A1 y 6 en la celda B5.

Explico más detalladamente mi problema quiza no haga falta acceder a otra
celda:

En una columna de una hoja del libro tengo escrito pseudocodigo del tipo:

REAL varX, varY, funcion;

funcion := varx^2*exp(varY)

o podria ser tambien

REAL variableX, variableY, maximo, funcion;

maximo := max(variableX, variableY)
funcion := maximo/variableX * (variableX^2+variableY+2)

vaya, que podria tener cualquier tipo de funcion escrita en la columna de
la hoja.Seguire la explicacion haciendo referencia a este segundo ejemplo
que es un poco mas amplio.

La funcion, por ejemplo de maximizacion, en VBA estaria definida de la
siguiente manera:

Function maximiza(codigoFuncion as Range)as Double
' Donde codigoFuncio seria el Rango que contiene el pseudocodigo del
segundo ejemplo
Dim variables() as String
Dim contenido() as String
Dim varAsociada() as String

Call leeCodigo(codigoFuncion, variables, contenido, varAsociada)
Call defineFuncion(variables, contenido, varAsociada)
...
...
codigo para maximizar sabiendo ya evaluar la funcion a maximizar
...
...
End Function

la funcion leeCodigo me inicializaria los vectores String como:

variables(1)="variableX"
variables(2)="variableY"
variables(3)="maximo"
variables(4)="funcion"

contenido(1)= "= max(variableX, variableY)",
contenido(2) = "= maximo/variableX * (variableX^2+variableY+2)"

varAsociada(1)="maximo"
varAsociada(2)="funcion"

'varAsociada(i) contiene la variable que es igual a contenido(i)

El problema me viene en la funcion defineFuncion! Esta funcion necesito
que me trabaje fuera de la celda que contendra el resultado, necesito que
me escriba i defina las variables en el libro.

En la celda A1 que me ponga "variableX"
En la celda A2 que me ponga "variableY"
En la celda A3 "maximo"
En la celda A4 "funcion"

Luego en la celda B3 pondra "= max(variableX, variableY)"
y en la celda B4 "= maximo/variableX * (variableX^2+variableY+2)"

una vez hecho eso me tiene que asociar los nombres de la columna A con el
contenido de la columna B. Para poder hacer substituciones en las casillas
B1 y B2 para que el programa vaya calculando los resultados de evaluar la
funcion en la celda B4.

Asi pues la funcio se llamaria escribiendo, en una celda de una hoja por
=maximiza(pseudocodigo) donde pseudocodigo tendria el valor "F1:F4" (el
rango que contiene el codigo)

No se si me he explicado con demasiada precision. Pero si has llegado
hasta aquí gracias por tu atención.

Agradeceria que alguien me ayudara para poder acceder a otras celdas
desde una funcion llamada desde una celda.

Gracias.
Respuesta Responder a este mensaje
#3 Héctor Miguel
31/08/2004 - 05:57 | Informe spam
hola, Marc !

Explico mas detalladamente mi problema quiza no haga falta acceder a otra celda:
En una columna de una hoja del libro tengo escrito pseudocodigo del tipo:
REAL varX, varY, funcion;
funcion := varx^2*exp(varY)
o podria ser tambien
REAL variableX, variableY, maximo, funcion;
maximo := max(variableX, variableY)
funcion := maximo/variableX * (variableX^2+variableY+2)



=> usando estos dos 'ejemplos' te propongo [al final] una [posible] 'solucion' usando los eventos de 'la hoja'

... podria tener cualquier tipo de funcion escrita en la columna de la hoja.
... necesito que me trabaje fuera de la celda que contendra el resultado [...]
En la celda A1 que me ponga "variableX"
En la celda A2 que me ponga "variableY"
En la celda A3 "maximo"
En la celda A4 "funcion"
Luego en la celda B3 pondra "= max(variableX, variableY)"
y en la celda B4 "= maximo/variableX * (variableX^2+variableY+2)"

... la funcion se llamaria escribiendo, en una celda de una hoja por =maximiza(pseudocodigo)
donde pseudocodigo tendria el valor "F1:F4" (el rango que contiene el codigo)



=> AQUI 'es donde' [yo] considero que esta 'el detalle' ;)
dado que 'pretendes' tener una [especie de] funcion 'multi-funcional' o 'multi-modal' [o... 'pseudocodigos'] ...
1° lo que quieres hacer: depositar un valor [o formula o funcion o etc.] en 'cierta/s celda/s' ->a 'discrecion'<-
2° como quieres hacerlo: indicando 'que' Y 'donde', ->desde<- OTRA celda 'cualquiera' ->tambien a discrecion'<-
3° de la forma que estas 'pensando': por funciones que puedan ser 'llamadas' ->desde la misma hoja de calculo<-
=> te vas a 'encontrar' con que... ¡ NO-SE-PUE-DE !!! :-(( <podria [intentar] 'explicarte' el por que NO [usando funciones de hoja de calculo ->que modifiquen 'otras' celdas<-]...
'pero'... este correo se volveria [excesivamente] mas 'extenso' :(
si no te 'incomoda' el ingles... encontraras la explicacion en: http://www.cpearson.com/excel/differen.htm

lo que te propongo es 'simular' el 'llamado' a funciones de hoja de calculo usando los eventos de la hoja...
[concretamente... el evento '_change' por 'cambios' efectuados en las celdas de 'esa' hoja]
'simulando' el llamado de una funcion de hoja de calculo y 'proveyendo' algun 'identificador' al evento [p.e.]
- que la celda que 'cambia' INICIE con 'FX ' o 'Fx ' o 'fx ' [fx seria una 'abreviacion' de 'Funcion_X'] :))
- que los 'argumentos' vayan 'separdos' por espacios [por si hay 'cambios' entre coma o punto y coma] :))
- y que las funciones esten 'numeradas' [o alguna otra forma de 'identificacion'] :))
[p.e.] suponiendo que los 'pseudocodigos' que expones en tus dos primeros ejemplos...
-> correspondieran a las funciones 'numeradas' 1 y 2 <-
-> escribirias en 'cualquier' celda... ->fx 1 rango_a_tomar_datos rango_a_poner_resultados<-
-> lo que estaria 'simulando' una funcion del tipo: =MiFuncion1(TomaDeE5:E6,PonEnA1:C2)
-> 'donde' en 'E5:E6' estarian las variables X y Y y 'A1:C2' seria el 'rango de salida'
-> SOLO estoy considerando como 'variables'... ->las variables<- el 'resto' es 'segun la funcion' :))
=> 'se supone' que la celda donde 'llames a la funcion'... ->queda FUERA de los rangos 'origen/destino'<-
=> el ejemplo que te propongo NO tiene contemplado algun 'mecanismo' de prevencion/correccion de 'errores' :-((
[supone tambien que NUNCA le vas a 'pasar' datos/rangos 'equivocados'] <= OJO
=> estoy considerando que 'se conservan' los datos 'de origen' ->en su lugar de origen<-
[si los necesitas en las celdas 'de destino'... habria que hacer unas -pocas- modificaciones en el codigo] :))
=> ejemplos finales...
para el 'pseudocogido' 1: escribes en cualquier celda ->fuera de los rangos<-... fx 1 e5:e6 a1:c2
para el 'pseudocodigo' 2: escribes en cualquier celda ->fuera de los rangos<-... fx 2 e15:e16 a10:d12
=> una nota 'final' :D ... una vez que hayas 'sobre-escrito' celdas que YA 'tenian' aplicado un 'pseudocodigo'
['deliberadamente' o por error]... -me parece que- 'entenderas' el por que 'NO por funciones de hoja de calculo' :DD

si cualquier duda o informacion adicional... ¿comentas?
saludos,
hector.
en el modulo de codigo de 'la hoja' ==Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If IsEmpty(Target) Then Exit Sub
If LCase(Left(Target, 3)) <> "fx " Then Exit Sub
Dim Celda As Integer, DeDonde As String, ADonde As String, _
VarX As String, VarY As String, Args, nArgs As Integer, Sig As Integer
n_Args = Len(Target) - Len(Application.Substitute(Target, " ", ""))
ReDim Args(n_Args): Args(0) = InStr(Target, " ")
For Sig = 1 To n_Args - 1
Args(Sig) = InStr(Args(Sig - 1) + 1, Target, " ")
Next
Select Case Mid(Target, 4, InStr(4, Target, " ") - 4)
Case 1 ' la funcion que usara el 'pseudocodigo' #1 '
DeDonde = Mid(Target, Args(1) + 1, Args(2) - 1 - Args(1))
ADonde = Mid(Target, Args(2) + 1)
VarX = Range(DeDonde).Cells(1).Address(0, 0)
VarY = Range(DeDonde).Cells(2).Address(0, 0)
With Range(ADonde)
.Cells(1) = "VarX": .Cells(4).Formula = "=" & VarX
.Cells(2) = "VarY": .Cells(5).Formula = "=" & VarY
.Cells(3) = "Función": .Cells(6).Formula = "=" & VarX & "^2*Exp(" & VarY & ")"
End With
Case 2 ' la funcion que usara el 'pseudocodigo' #2 '
DeDonde = Mid(Target, Args(1) + 1, Args(2) - 1 - Args(1))
ADonde = Mid(Target, Args(2) + 1)
VarX = Range(DeDonde).Cells(1).Address(0, 0)
VarY = Range(DeDonde).Cells(2).Address(0, 0)
With Range(ADonde)
.Cells(1) = "VarX": .Cells(5).Formula = "=" & VarX
.Cells(2) = "VarY": .Cells(6).Formula = "=" & VarY
.Cells(3) = "Máximo": .Cells(7).Formula = "=Max(" & VarX & "," & VarY & ")"
.Cells(4) = "Función"
.Cells(8).Formula = "=" & .Cells(7).Address(0, 0) & "/" & VarX & "*(" & VarX & "^2+" & VarY & "+2)"
End With
Case "hasta n_pseudocodigos"
End Select
Erase Args
End Sub
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida