• Jueves 14 de Noviembre de 2024, 17:02

Autor Tema:  Lentitud Ejecución  (Leído 1476 veces)

pepo

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Lentitud Ejecución
« en: Miércoles 16 de Marzo de 2005, 20:33 »
0
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
  1.  Private Sub Command1_click()
  2. ' dada una presión y una temperatura de referencia, el programa selecciona
  3. ' un rango de celdas dentro de la tabla, que corresponden a valores para interpolar
  4. ' entre dicha presión y temperatura de referencia
  5. Dim ap As New Excel.Application
  6.     ap.Workbooks.Open "d:\Pepo\Proyecto VB\tabla para pruebas.xls"
  7.     ap.Worksheets("volumen").Select
  8. Dim i As Integer
  9. Dim j As Integer
  10. ' Como datos tenemos Tref y Pref
  11. Tref = 0.025
  12. Pref = 35.5
  13. ' i es el índice de filas y j el de columnas
  14. For j = 2 To 55
  15.     For i = 4 To 79
  16. ' Selecciona los datos de la tabla cuyos valores sean los
  17. ' inmediatamente inferiores a Pref y Tref
  18.         With Range("A1:BC79")
  19.             If .Cells(3, j).Value < Tref Then
  20.                 If .Cells(i, 1).Value < Pref Then
  21.                     Set T1 = .Cells(3, j)
  22.                     Set T2 = .Cells(3, j + 1)
  23.                     Set P1 = .Cells(i, 1)
  24.                     Set P2 = .Cells(i + 1, 1)
  25.                     Set v11 = .Cells(i, j)
  26.                     Set v12 = .Cells(i, j + 1)
  27.                     Set v21 = .Cells(i + 1, j)
  28.                     Set v22 = .Cells(i + 1, j + 1)
  29.                 End If
  30.             End If
  31.         End With
  32.     Next i
  33. Next j
  34.  
  35. '   Interpola el volúmen específico "v" entre los valores de temperatura y los de presión
  36.  
  37. va = v12 - (v12 - v11) * (T2 - Tref) / (T2 - T1)
  38. vc = v22 - (v22 - v21) * (T2 - Tref) / (T2 - T1)
  39. v = vc - (vc - va) * (P2 - Pref) / (P2 - P1)
  40. ' muestra en pantalla el valor intermpolado, correspondiente a los datos  de Pref y Tref
  41. TxtCeldas.Text = v
  42. ap.Quit
  43. Set ap = Nothing
  44.  

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Lentitud Ejecución
« Respuesta #1 en: Jueves 17 de Marzo de 2005, 15:15 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Lentitud Ejecución
« Respuesta #2 en: Jueves 17 de Marzo de 2005, 19:27 »
0
Gracias por tu amable explicación. Voy a probarlo a ver qué tal va.

Un saludo.

pepo

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Lentitud Ejecución
« Respuesta #3 en: Jueves 17 de Marzo de 2005, 21:00 »
0
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?