Visual Basic para Aplicaciones - Objeto para formulas

Life is soft - evento anual de software empresarial
 
Vista:

Objeto para formulas

Publicado por Juan (9 intervenciones) el 26/01/2006 05:04:42
Dentro de una macro que abre y consulta varios archivos necesito realizar ciertas operaciones con fórmulas de excel con los mismos.
El problema se me da con las fórmulas de excel, ya que para funcionar necesitan estar asociadas a un Object. Actualmente utilizo una celda (objeto) donde guardar el valor, y después guardarlo en una matriz; pero éste método es muy lento.
Quisiera saber de que forma podría guardar el valor de la operación directamente a la matriz:

Lo que hago ahora es:
....
dim valorform(10) as array
.....

activecell.formula="=sumif(........)" 'o la fórmula que sea
.....
windows(libro).activate
.....
valorform(a)=activecell.value
....

La acción de cambiar de libro demora mucho el proceso. Hay algún artilugio para que las fórmulas de excel me devuelvan el resultado dentro de la macro, evitando que tener que asociarla a un objeto como lo es la celda y así poder guardar el valor calculado en una variable o matriz más rápidamente.

Agradecería su colaboración.

PD: otra duda, estoy buscando hace mucho tiempo las líneas de código para evitar que durante la ejecución de una macro la pantalla de excel siga los cambios que se van haciendo, y quede fija hasta el final de la ejecución. No recuerdo donde lo vi y menos aún lo he vuelto a encontrar.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Objeto para formulas

Publicado por JuanC (243 intervenciones) el 26/01/2006 14:45:59
No termino de entender lo que necesitás...
Por favor pasame los archivos y explicame con detalles
lo que querés hacer y vemos cómo resolverlo.
De paso veo cómo puedo incrementar la velocidad del proceso...

Lo que buscas es Application.ScreenUpdating = False ó True

Saludos y buena suerte, desde Buenos Aires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Objeto para formulas

Publicado por Juan (9 intervenciones) el 26/01/2006 22:03:27
Gracias por la ayuda Juan. Me sirvieron las sentencias que me pasaste, hace un montón que las venía buscando.
Lamentablemente los archivos en cuestión los tengo en mi trabajo. Los voy a buscar y te los envío.
Quizás no se entendió lo que quise hacer, lo explico más claramente:
La macro que tengo, busca y calcula datos de varios libros. La misma macro va abriendo libro por libro y realiza operaciones y cálculos mediante algunas fórmulas de excel (ej: contar.si, sumar.si básicamente) en distintos rangos de celdas según el libro en cuestión.
La macro funciona bien, pero su ejecución no es rápida y se debe a la utilización de las fórmulas de excel (contar.si, sumar.si o todas).
Para usar las fórmulas de excel en VBA se lo hace de la siguiente manera por ejemplo de una que utiliza la macro:

activecell.formula="=sumif(......)/countif(.......)"

Aca me pega la fórmula en la celda que yo desee y una vez calculada la fórmula lo que hago es tomar el este valor y guardarlo en una matriz; continuando así con el proceso. Recién al final de la macro pego los datos almacenados en la matriz en la hoja de mi elección.

La operación de pasar los datos a la matriz la hago:
...--
resulformula(a)=activecell.value
.... 'Donde "a" es el valor de un contador

Lo que quisiera es evitar tener que usar un objeto del tipo "activecell" o un "range" en la declaración de la fórmula. Esto me obliga a tener que cambiarme de libro cada vez que realizo un cálculo (en mi caso a la hoja donde después voy a pegar los datos calculados).
Lo ideal sería poder usar las fórmulas de excel dentro de la macro misma, que calcule el resultado y lo pueda almacenar en una matriz sin tener que recurrir a una hoja para pegarlo y recién obtenerlo.
Tenés idea de como hacerlo?

PD: mientras escribía esto me di cuenta que la operación que demora la ejecución de la macro que es la de cambiar de libro constantemente la puedo evitar. Voy a hacer que la macro pegue la fórmula en determinada celda del archivo que estoy analizando y al final lo cierro sin guardar los cambios. Simple, probaré si es efectiva.

De todos modos el interrogante anterior sigue en pie.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Objeto para formulas

Publicado por JuanC (243 intervenciones) el 27/01/2006 00:03:46
Se me ocurrió lo siguiente; no sé
si servirá...
Usar sólo una celda para poner todas
las fórmulas, una por vez!
e ir guardando los resultados... ;-)

Sub prueba()
Dim cell As Excel.Range
Dim i%
Dim sFormula(10) As String

On Error Resume Next

Erase sFormula

Application.ScreenUpdating = False

sFormula(0) = "=$A$4+$A$10"
sFormula(1) = "=$A$4-$A$10"

Set cell = [A1]

For i = LBound(sFormula) To UBound(sFormula)
cell.Formula = sFormula(i)
resulformula(i) = cell.Value
Next

Application.ScreenUpdating = True

Set cell = Nothing
End Sub

PD: contame si te sirve e igualmente enviame los archivos

Saludos, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Objeto para formulas

Publicado por Juan (9 intervenciones) el 28/01/2006 18:18:52
Está bueno el método anterior. Después te envío el archivo junto a algún archivo de ejemplo que trabajo.
Te hago una pregunta: trabajo con unos archivos CSV y sucede que si uno los abre eligiendolos desde el "explorador de windows", el excel te ordena las columnas y queda bien.
Si los abris dentro del mismo excel o con una macro, tenés que definirle el tipo de separado y un montón de cosas.
Lo que quisiera hacer es realizar la operación que hace el "explorador de windows" para abrir el archivo con el excel, ya que es mucho más rápido.
Fijandome en "tipos de archivo" donde te muestra las extensiones y los programas que están asociados encontre la manera en que el explorador maneja y ordena abrir cada archivo.
Utiliza la forma DDE (no se que signfifica), pero dentro del VBA es posible hacerlo también, todavía no lo logré.
Probe usando el Shell para abrirlo pero no hacía lo que yo quería.

Con el DDEinitiate es algo asi:

channelNumber = Application.DDEInitiate( _

app:="Excel", _
topic:="C:\elcsv.csv")

Application.DDEExecute channelNumber, "[open]"

Application.DDETerminate channelNumber

Se que tiene que ser algo muy parecido a ésto.

El explorador los abre poniendo:
ruta del office\excel \e

opciones DDE
[open("%1")]
tema: system

Saludos y ya te van a llegar los archivos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Objeto para formulas

Publicado por JuanC (243 intervenciones) el 29/01/2006 14:23:29
DDE significa Dynamic Data Exchange (Intercambio
Dinámico de Datos) y es un protocolo de Microsoft
para el intercambio de datos entre aplicaciones
por medio de mensajes. Se trata de "conversaciones"
entre dos aplicaciones (Cliente/Servidor) acerca
de un tema específico (topic).

Digamos que es un tema un poco complejo y largo...
Un ejemplo práctico de DDE es cuando pegás un
vínculo en Excel u otra aplicación Office.
Estás creando un "enlace" entre Excel y la otra
aplicación... para que "conversen"!!

Pasame si querés el archivo csv y decime qué
querés hacer con él. Una macro no tiene problemas
para abrir cualquier archivo...

Saludos y hasta cualquier momento...

JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Objeto para formulas

Publicado por CRISTIAN (1 intervención) el 09/02/2006 17:07:17
Viejo yo te recomendaria que en ves de seguir utilizando esa metodologia de utilizar las formulas de excel en excel, las utilizaras en Visual Basic directamente, esto se logra mediante una sentencia que pone a tu disposicion las funciones mas importantes de Excel para que sean Utilizadas en VBA y de esta forma poder almacenar directamente el resultado de las operaciones en una variable determinada, es asi:

Variable X = Application.worksheetfunction.Sum ( Argumentos)
ó
Variable X = Application.worksheetfunction.Sum .Find ( Argumentos)
ó
Variable X = Application.worksheetfunction.Sum.Cos ( Argumentos)

creo que asi se entidiende, espero que te sea mas util y de seguro que te funciona mas rapido porque al no tener que seleccionar celdas o libros, el computador no tiene que hacer resfrecos de pantalla ni nada por el estilo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Objeto para formulas

Publicado por Juan (9 intervenciones) el 29/03/2006 08:47:23
Gracias por la respuesta. SI tenés razón en que en VB es más rápido, no dispongo del soft en el trabajo por eso de buscarle la vuelta con el VBA.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Objeto para formulas

Publicado por Juan (9 intervenciones) el 03/09/2006 18:45:46
Gracias por la ayuda JuanC, me sirvió la respuestas. Una consulta. Se puden utilizar fórmulas matriciales con la sentencia "application.worksheetfunction". No he podido hacer eso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

formulas

Publicado por carlos (1 intervención) el 15/04/2009 02:20:59
una formula para uqe se pueda mover una imagen en visual basic
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar