Programación General > Visual Basic 6.0 e inferiores
Lentitud Ejecución
(1/1)
pepo:
Hola amigos,
Tengo una tabla en excel, con datos de volumen en función de Presión y Temperatura . Aquí muestro un pedazo.
Tª 0,01 0,02 0,03 ..............
P
0,01 0,0010002 0,0010002 0,0010002
10 130,58 0,0010003 0,0010003
20 135,22 67,570 0,0010018
30 139,85 69,891 46,572
.
.
Necesito hacer un programa en vb que escoja datos de la tabla en función de unas Presiones y temperaturas dadas, por lo que hay que interpolar. El programilla que he hecho funciona en vba sin problemas, pero desde vb va lentísimo. Por favor, que alguien me ayude.
Aquí abajo dejo el programa.
Pepo
Hola amigos,
Tengo una tabla en excel, con datos de volumen en función de Presión y Temperatura . Aquí muestro un pedazo.
Tª 0,01 0,02 0,03 ..............
P
0,01 0,0010002 0,0010002 0,0010002
10 130,58 0,0010003 0,0010003
20 135,22 67,570 0,0010018
30 139,85 69,891 46,572
.
.
Necesito hacer un programa en vb que escoja datos de la tabla en función de unas Presiones y temperaturas dadas, por lo que hay que interpolar. El programilla que he hecho funciona en vba sin problemas, pero desde vb va lentísimo. Por favor, que alguien me ayude.
Aquí abajo dejo el programa.
Pepo
--- Código: Text --- Private Sub Command1_click()' dada una presión y una temperatura de referencia, el programa selecciona' un rango de celdas dentro de la tabla, que corresponden a valores para interpolar' entre dicha presión y temperatura de referenciaDim ap As New Excel.Application ap.Workbooks.Open "d:\Pepo\Proyecto VB\tabla para pruebas.xls" ap.Worksheets("volumen").SelectDim i As IntegerDim j As Integer' Como datos tenemos Tref y PrefTref = 0.025Pref = 35.5' i es el índice de filas y j el de columnasFor j = 2 To 55 For i = 4 To 79' Selecciona los datos de la tabla cuyos valores sean los ' inmediatamente inferiores a Pref y Tref With Range("A1:BC79") If .Cells(3, j).Value < Tref Then If .Cells(i, 1).Value < Pref Then Set T1 = .Cells(3, j) Set T2 = .Cells(3, j + 1) Set P1 = .Cells(i, 1) Set P2 = .Cells(i + 1, 1) Set v11 = .Cells(i, j) Set v12 = .Cells(i, j + 1) Set v21 = .Cells(i + 1, j) Set v22 = .Cells(i + 1, j + 1) End If End If End With Next iNext j ' Interpola el volúmen específico "v" entre los valores de temperatura y los de presión va = v12 - (v12 - v11) * (T2 - Tref) / (T2 - T1)vc = v22 - (v22 - v21) * (T2 - Tref) / (T2 - T1)v = vc - (vc - va) * (P2 - Pref) / (P2 - P1)' muestra en pantalla el valor intermpolado, correspondiente a los datos de Pref y TrefTxtCeldas.Text = vap.QuitSet ap = Nothing
Brroz:
Hola pepo.
Ante lo que cuentas y el código que posteas se podrían hacer varias consideraciones.
1 - La ejecución siempre será más rápida usando vba desde el propio libro, por el mismo motivo que siempre será más rápido el acceso a una variable local que a una propiedad encapsulada en una clase dentro del mismo ejecutable, que a su vez será más rápido que el acceso a otra propiedad de otra clase en algun otro servidor.
2 - En lugar de setear variables de objeto de la clase cell (cosa que supongo, porque no veo la declaración... seguramente sean variant si es que no hay un Option Explicit por ahí) será mucho más efectivo almacenar los valores en variables double, por ejemplo.
3 - Utiliza como índices para las celdas distintas variables: unas con el valor de la variable del bucle + 1 y otras con -1, para evitar realizar varias sumas y restas en cada iteración (es decir, si tienes 'i + 1' tres veces en el bucle, usa una variable asignándole el valor i +1 y utiliza la variable en lugar de la operación.
Sólo con observar los puntos 2 y 3 supongo que verás como va mejorando el rendimiento del método.
Chao.
pepo:
Gracias por tu amable explicación. Voy a probarlo a ver qué tal va.
Un saludo.
pepo:
Hola Brroz,
He seguido tus indicaciones, pero sigue yendo lentísimo, y cuando digo lento es que tarda más de 30 segundos en realizar la operación, que me parece una pasada, independientemente del punto que quiera calcular.
Puede ser que me falte activar en vb alguna opción que tenga que ver con el excel?
Navegación
Ir a la versión completa