Optimisation code VBA
Bonjour,
Je suis nouveau sur le forum et un mi-débutant en VBA.
Ma question est très simple.
J'ai récupéré un ficher excel qui m'intéresse sur internet (pour le calcul de structure de bâtiment 8) )
J'y ai trouvé son code vba qui permet (pour simplifier!) de calculer un résultats que je nommerai R dépendant de différentes variables V.
J'ai repris ce code pour construire mon propre tableur.
Le but de mon tableur et de calculer une multitude de valeur R pour une multitude de variables V.
Mes variables étant présentées sous forme de tableau, j'ai créé une macro qui lit ce tableau et l'ensemble de mes variables V et qui me renvoie ainsi tous les résultats R correspondant.
Mon problème est le suivant :
- le calcul est très long. Est-il possible de l'optimiser ?
- je pense que cette lenteur vient de la nature du code VBA (pas ma macro mais celle que j'ai récupéré, voir extrait ci-après). Je ne comprends pas trop ce code, étant débutant j'utilise plutôt les langages classique savec des "sub" des "integer" des "dim" etc...
Ce code est-il optimisable?
Ci-dessous, le code que j'ai récupéré.
Merci d'avance!!
A bientôt
Function ATG(N, M, N0)
Pi = 4 * Atn(1)
N1 = N - N0
If Abs(N) < 0.0001 And Abs(M) < 0.0001 Then ATG = -Pi / 2: GoTo 99
If N1 = 0 Then ATG = 0: GoTo 99
If N1 > 0 Then ATG = Pi / 2 - Atn(M / N1) Else ATG = -Atn(M / N1) - Pi / 2
99 End Function
Function procen(tabT, tabr, NEd, MEd)
' Interpolation pour le calcul du pourcentage d'acier
Dim tabN(90, 6), tabM(90, 6), MR(6), NR(6)
If Abs(MEd) + Abs(NEd) = 0 Then procen = 0: GoTo 99
NL = 80 '73
N0 = 0.5 * tabT(80, 1)
For j = 1 To 5
For i = 1 To NL
j1 = (j - 1) * 2 + 1: j2 = 2 * j
tabN(i, j) = tabT(i, j1)
tabM(i, j) = tabT(i, j2)
Next i
Next j
e = ATG(NEd, MEd, N0)
'procen = e: GoTo 99
For j = 1 To 5
For i = 2 To NL '2 to NL
N1 = tabN(i, j): M1 = tabM(i, j)
e1 = ATG(N1, M1, N0)
If e1 > e Then i1 = i: GoTo 18
Next i
GoTo 33
18 N2 = tabN(i1 - 1, j): M2 = tabM(i1 - 1, j)
e2 = ATG(N2, M2, N0)
'procen = e2: GoTo 99
k = (e - e2) / (e1 - e2)
MR(j) = M2 + (M1 - M2) * k
NR(j) = N2 + (N1 - N2) * k
33 Next j
If Abs(NEd - N0) / N0 > 0.35 Then GoTo 55
If MEd > MR(5) Then procen = 1000: GoTo 99
If MEd < MR(1) Then procen = tabr(1): GoTo 99
For j = 1 To 4
If MEd > MR(j) Then j1 = j: GoTo 51
Next j
51 j2 = j1 + 1
k = (MEd - MR(j1)) / (MR(j2) - MR(j1))
GoTo 90
55 If e < 0 And NEd > NR(1) Then procen = tabr(1): GoTo 99
If e > 0 And NEd < NR(1) Then procen = tabr(1): GoTo 99
If e < 0 And NEd < NR(5) Then procen = 1000: GoTo 99
If e > 0 And NEd > NR(5) Then procen = 1000: GoTo 99
For j = 5 To 1 Step -1
If e < 0 And NEd < NR(j) Then j1 = j: GoTo 24
If e > 0 And NEd > NR(j) Then j1 = j: GoTo 24
Next j
24 j2 = j1 + 1
k = (NEd - NR(j1)) / (NR(j2) - NR(j1))
90 procen = tabr(j1) + (tabr(j2) - tabr(j1)) * k
99 End Function
Function fsc(e, fcd, ec2, ecu2, N)
' calcul de la contrainte du béton en diagramme PR
If ecu2 > 5 Then Ecm = ecu2: ec1 = ec2: GoTo 12 'Sargin
' parabole-rectangle
If e = 0 Then s = 0: GoTo 10
If e > ec2 Then s = fcd: GoTo 10
s = fcd * (1 - (1 - e / ec2) ^ N)
GoTo 10
12 'Sargin
eta = e / ec1
k = 1.05 * Ecm / 1.2 * e / fcd
s = fcd * (k * eta - eta * eta) / (1 + (k - 2) * eta)
10 fsc = s
End Function
Function fscg(e, fcd, ec1, Ecm)
' calcul de la contrainte du béton en diagramme Sargin
If e = 0 Then s = 0: GoTo 10
k = 1.05 * Ecm / 1.2 * ec1 / fcd
eta = e / ec1
s = fcd * (k * eta - eta * eta) / (1 + (k - 2) * eta)
10 fscg = s
End Function