OVH Cloud OVH Cloud

Degré de compilation de VBA

1 réponse
Avatar
Stéphane Santon
Bonjour,

Une question qui me turlupine depuis un mois que j'ai remis les pieds
dans VBA :

Quel est le degré de compilation de VBA ?
Est-ce seulement une pré-interprétation ou bien une réelle compilation ?

Un exemple de code ci-dessous de fonction matricielle complémentaire :
( recherche du nom de chaque cellule un peu avant dans la liste et
calcul des écarts dans une autre colonne)

les noms de variables de boucles et les noms de fonctions restent-ils
dans le code, ou bien les appels sont-ils déjà compulés et codés ?
Quel gain si je refais cette formule répétitive dans une DLL externe ?

Function EvolutionCycleMat(arPostes As Range, arEvenements As Range,
arValeurs As Range)
'Extrait le nombre de cycles écoulés entre 2 événements (en général 1
cycle)

Dim laPostes, laEvenements, laValeurs, laResults
Dim liLen&, i&, r&, lsEventName$, liThisValue&, liPrevValue&,
liValeur&

laPostes = arPostes
laEvenements = arEvenements 'Copie dans variant pour bcp plus rapide
laValeurs = arValeurs
laResults = arValeurs 'Prépare format du résultat, garde valeurs
origines par défaut

For r = 1 To UBound(laEvenements) 'Balaye toute la colonne de
matrice

lsEventName = laEvenements(r, 1) 'Récupère l'évenement en cours
de traitement

If Left(lsEventName, 4) = "Qte." Then 'Si à ajouter ...
'laResults(r, 1) = laValeurs(r, 1)

ElseIf Left(lsEventName, 4) = "Cpt." Then 'Si à compter ...
For i = r - 1 To 1 Step -1 'Scrute en arrière
If (laPostes(i, 1) = laPostes(r, 1)) And
(laEvenements(i, 1) = lsEventName) Then ' Si trouvé précédent ...
liThisValue = laValeurs(r, 1) 'Récupère valeur
courante
liPrevValue = laValeurs(i, 1) 'Récupère valeur
précédente
liValeur = liThisValue - liPrevValue 'Calcule
l'écart
If (liThisValue < 0) And (liPrevValue > 0) Then
liValeur = 65536 + liValeur
laResults(r, 1) = liValeur
Exit For
End If
Next i
End If
Next r

EvolutionCycleMat = laResults
End Function


--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime

1 réponse

Avatar
Frédéric Sigonneau
Bonsoir,

VBA n'est pas un langage compilé, seulement interprété. Il sait par contre faire
appel à des fonctions exposées dans du code compilé (dll système ou "maison",
ou, format propre à Excel, xll).
L'utilisation de code compilé augmente bien sûr significativement la vitesse
d'exécution.
Aller fouiller un peu à cette adresse pourrait t'intéresser :

http://longre.free.fr

FS
---
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour,

Une question qui me turlupine depuis un mois que j'ai remis les pieds
dans VBA :

Quel est le degré de compilation de VBA ?
Est-ce seulement une pré-interprétation ou bien une réelle compilation ?

Un exemple de code ci-dessous de fonction matricielle complémentaire :
( recherche du nom de chaque cellule un peu avant dans la liste et
calcul des écarts dans une autre colonne)

les noms de variables de boucles et les noms de fonctions restent-ils
dans le code, ou bien les appels sont-ils déjà compulés et codés ?
Quel gain si je refais cette formule répétitive dans une DLL externe ?

Function EvolutionCycleMat(arPostes As Range, arEvenements As Range,
arValeurs As Range)
'Extrait le nombre de cycles écoulés entre 2 événements (en général 1
cycle)

Dim laPostes, laEvenements, laValeurs, laResults
Dim liLen&, i&, r&, lsEventName$, liThisValue&, liPrevValue&,
liValeur&

laPostes = arPostes
laEvenements = arEvenements 'Copie dans variant pour bcp plus rapide
laValeurs = arValeurs
laResults = arValeurs 'Prépare format du résultat, garde valeurs
origines par défaut

For r = 1 To UBound(laEvenements) 'Balaye toute la colonne de
matrice

lsEventName = laEvenements(r, 1) 'Récupère l'évenement en cours
de traitement

If Left(lsEventName, 4) = "Qte." Then 'Si à ajouter ...
'laResults(r, 1) = laValeurs(r, 1)

ElseIf Left(lsEventName, 4) = "Cpt." Then 'Si à compter ...
For i = r - 1 To 1 Step -1 'Scrute en arrière
If (laPostes(i, 1) = laPostes(r, 1)) And
(laEvenements(i, 1) = lsEventName) Then ' Si trouvé précédent ...
liThisValue = laValeurs(r, 1) 'Récupère valeur
courante
liPrevValue = laValeurs(i, 1) 'Récupère valeur
précédente
liValeur = liThisValue - liPrevValue 'Calcule
l'écart
If (liThisValue < 0) And (liPrevValue > 0) Then
liValeur = 65536 + liValeur
laResults(r, 1) = liValeur
Exit For
End If
Next i
End If
Next r

EvolutionCycleMat = laResults
End Function