Volatile

12/03/2007 - 03:26 por Orfao | Informe spam
tengo una funcion personalizada que repito en hoja1! desde a1 hasta a50
y an b1 +suma(a1:a50)
el problema es gue cuando hago referencia a b1 desde otra hoja del libro
las formulas personalizadas de la hoja1 no estan actualizadas y generan o un
0 (cero) o #valor
esto a pesar de que tienen la instrccion application.volatile
solo se actualizan si paso a la hoja1 e introduzco un valor en cualquier
celda y luego vuelvo a la hoja actual (todo esto en vba) por que ?


Me alimento del conocimiento de todos

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
12/03/2007 - 06:36 | Informe spam
hola, moises !

tengo una funcion personalizada que repito en hoja1! desde a1 hasta a50 y an b1 +suma(a1:a50)
el problema es gue cuando hago referencia a b1 desde otra hoja del libro
las formulas personalizadas de la hoja1 no estan actualizadas y generan o un 0 (cero) o #valor
esto a pesar de que tienen la instrccion application.volatile
solo se actualizan si paso a la hoja1 e introduzco un valor en cualquier celda y luego vuelvo a la hoja actual
(todo esto en vba) por que ?



1) [generalmente] no es necesaria la instruccion 'volatile' en una funcion personalizada...
si alguna de las referencias que le son pasadas como argumentos se modifica, la funcion actualiza su resultado
sin 'perjuicio' a otras celdas donde tambien se use la funcion [pero] que no hayan modificado sus argumentos ;)
a menos, que estes manejando otras propiedades que no sean 'detectables' por los eventos 'naturales' de la aplicacion
[como formatos, colores, bordes, en las celdas, etc.] -?-

2) [probablemente] el valor de 0 y/o el valor de error #valor" se deba a...
o... que esta siendo 'heredado' en alguna de las celdas-argumento de la funcion...
o... que los tipos de datos en el manejo de la fucion no es del tipo 'adecuado'...
o... que alguna formula 'matricial' se haya modificado SIN terminarla con cttl+mayus+enter...
o... algunas otras causas y/o combinacion de... [incluyendo a las anteriores] -???-

comentas [si encuentras] algun detalle mas... 'significativo' ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Orfao
12/03/2007 - 07:13 | Informe spam
Gracias de nuevo Miguel
logre hacer que funcionara la funcion que me enviaste inclusive la sglobal3
sustituyendo el 9 por el 6 en subtotales pero se puso mucho mas pesado y
lento el programa por lo que vuelvo con las macros
pero como te dije antes esta funcion no se actualiza liego que desde otra
hoja cambie los valores en la hoja donde estan los datos (tablas agrupadas de
a 15 filas c/u) aunque recalcule todo el libro
solo lo logro si vuelvo a la primera hoja donde estan las funciones sglobal
e introduzco algun dato en alguna celda por que???? como corrij esto????
ahi te envio de nuevo la funcion

Function SGLOBAL1(A As Range, B As Range, C As Integer, D As Range)
Aplication.volatile
Dim X As Integer
Dim Y As Integer
SGLOBAL1 = 0
X = A.Count
For Y = 0 To X - 1
If Cells(A.Row + Y, A.Column) <> "" Then
SGLOBAL1 = SGLOBAL1 + Application.WorksheetFunction.VLookup(Cells(A.Row + Y,
A.Column), B, C, 0) * Cells(D.Row + Y, D.Column)
End If
Next

End Function


Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

> tengo una funcion personalizada que repito en hoja1! desde a1 hasta a50 y an b1 +suma(a1:a50)
> el problema es gue cuando hago referencia a b1 desde otra hoja del libro
> las formulas personalizadas de la hoja1 no estan actualizadas y generan o un 0 (cero) o #valor
> esto a pesar de que tienen la instrccion application.volatile
> solo se actualizan si paso a la hoja1 e introduzco un valor en cualquier celda y luego vuelvo a la hoja actual
> (todo esto en vba) por que ?

1) [generalmente] no es necesaria la instruccion 'volatile' en una funcion personalizada...
si alguna de las referencias que le son pasadas como argumentos se modifica, la funcion actualiza su resultado
sin 'perjuicio' a otras celdas donde tambien se use la funcion [pero] que no hayan modificado sus argumentos ;)
a menos, que estes manejando otras propiedades que no sean 'detectables' por los eventos 'naturales' de la aplicacion
[como formatos, colores, bordes, en las celdas, etc.] -?-

2) [probablemente] el valor de 0 y/o el valor de error #valor" se deba a...
o... que esta siendo 'heredado' en alguna de las celdas-argumento de la funcion...
o... que los tipos de datos en el manejo de la fucion no es del tipo 'adecuado'...
o... que alguna formula 'matricial' se haya modificado SIN terminarla con cttl+mayus+enter...
o... algunas otras causas y/o combinacion de... [incluyendo a las anteriores] -???-

comentas [si encuentras] algun detalle mas... 'significativo' ?
saludos,
hector.



Respuesta Responder a este mensaje
#3 Héctor Miguel
12/03/2007 - 07:44 | Informe spam
hola, moises !

__ 1 __
logre hacer que funcionara la funcion que me enviaste inclusive la sglobal3 sustituyendo el 9 por el 6 en subtotales
pero se puso mucho mas pesado y lento el programa por lo que vuelvo con las macros



1) te puse una 'sugerencia' en la consulta anterior con relacion a la 'lentitud' en el re/calculo de los modelos en excel...
[no la pierdas de vista] :D

__ 2 __
... como... dije antes esta funcion no se actualiza liego que desde otra hoja cambie los valores en la hoja donde estan los datos
(tablas agrupadas de a 15 filas c/u) aunque recalcule todo el libro
solo lo logro si vuelvo a la primera hoja donde estan las funciones sglobal e introduzco algun dato en alguna celda por que????
como corrij esto???? ahi te envio de nuevo la funcion



2) en el codigo de la funcion, utilizas 'referencias' a las celdas del tipo: "If Cells(A.Row + Y, A.Column) <> "" Then" [...]
-> toma nota de lo siguiente:

a) usar la propiedad 'Cells' como 'objeto en si mismo'... SIN hacer referencia a una hoja 'especifica'...
-> equivale a estar haciendo referencia a la propiedad 'Cells' [pero] -> de la hoja 'activa' [por lo cual]...
-> sin ese 'calificador'... NO es [por obligacion] la misma hoja que contiene los rangos pasados a la funcion [A As Range, etc.]

b) para +/- 'asegurarte' que te estas 'moviendo' dentro del mismo rango [y hoja] 'pasado' como argumento a la funcion...
-> cambia la 'forma' del bucle: -> For Y = 0 To X - 1
-> a una variable de tipo rango -> For Each Celda in A [necesitas declarar previamente la variable... Dim Celda As Range]

-> revisa/modifica/... el resto de las instrucciones/referencias a la propiedad 'Cells' y...
[te insisto]... no pierdas de vista la sugerencia a tu consulta anterior :D

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ el codigo expuesto __
Function SGLOBAL1(A As Range, B As Range, C As Integer, D As Range)
Aplication.volatile
Dim X As Integer
Dim Y As Integer
SGLOBAL1 = 0
X = A.Count
For Y = 0 To X - 1
If Cells(A.Row + Y, A.Column) <> "" Then
SGLOBAL1 = SGLOBAL1 + Application.WorksheetFunction.VLookup(Cells(A.Row + Y, A.Column), B, C, 0) * Cells(D.Row + Y, D.Column)
End If
Next
End Function
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida