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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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