[VBA] comment accélérer mon programme
Résolu/Fermé
Msylvain
Messages postés
10
Date d'inscription
jeudi 28 avril 2011
Statut
Membre
Dernière intervention
19 mai 2011
-
18 mai 2011 à 16:25
ed - 19 mai 2011 à 21:12
ed - 19 mai 2011 à 21:12
A voir également:
- [VBA] comment accélérer mon programme
- Accelerer windows 10 - Guide
- Programme demarrage windows 10 - Guide
- Accelerer une video - Guide
- Comment mettre en veille un programme sous windows 10 - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
3 réponses
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 313
18 mai 2011 à 16:56
18 mai 2011 à 16:56
Bonjour
Déjà utilise
Application.screenupdating=False
qui te fera gagner du temps et du confort pour tes yeux.
si tu copies des données
Sheets("feuil3").Cells(w, 2 + 3 * (x - 1))=Sheets("feuil1").Range("B" & y).value
et peut-être
Sheets("feuil3").range(Cells(w, 2 + 3 * (x - 1)),Cells(w, 3 + 3 * (x - 1)))=range(cells(y,"B"),cells(y,"C").value
il ya + rapide mais j'ai du mal à piger le but du truc surtout avec de variables à 1 lettre peu explicites pour la maintenance et la modificattion d'une appli...
heu, au passage: tu es sûr de de dim v as single puisque v=1000*n et que n est déclaré en integer?
Déjà utilise
Application.screenupdating=False
qui te fera gagner du temps et du confort pour tes yeux.
si tu copies des données
Sheets("feuil3").Cells(w, 2 + 3 * (x - 1))=Sheets("feuil1").Range("B" & y).value
et peut-être
Sheets("feuil3").range(Cells(w, 2 + 3 * (x - 1)),Cells(w, 3 + 3 * (x - 1)))=range(cells(y,"B"),cells(y,"C").value
il ya + rapide mais j'ai du mal à piger le but du truc surtout avec de variables à 1 lettre peu explicites pour la maintenance et la modificattion d'une appli...
heu, au passage: tu es sûr de de dim v as single puisque v=1000*n et que n est déclaré en integer?
Msylvain
Messages postés
10
Date d'inscription
jeudi 28 avril 2011
Statut
Membre
Dernière intervention
19 mai 2011
Modifié par Msylvain le 18/05/2011 à 17:20
Modifié par Msylvain le 18/05/2011 à 17:20
Pour ce qui est du v il peut être beaucoup plus important c'est pour ça que j'ai mis single.
Le but de mon programme est le suivant:
je dispose de données de la forme suivante:
libellé | val 1 | val 2
1 | xxx | xxx
1 | xxx | xxx
1 | xxx | xxx
1 | xxx | xxx
2 | xxx | xxx
2 | xxx | xxx
2 | xxx | xxx
2 | xxx | xxx
3 | xxx | xxx
3 | xxx | xxx
3 | xxx | xxx
3 | xxx | xxx
. | xxx | xxx
. | xxx | xxx
. | xxx | xxx
n | xxx | xxx
n | xxx | xxx
n | xxx | xxx
n | xxx | xxx
Et moi pour les traiter il me faut ceci :
............1......| ......... 2 ..... | ......... 3 ..... |...| ......... n
val 1 | val 2 | val 1 | val 2 | val 1 | val 2 |...| val | val 2
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
voila pourquoi je veux faire ça.
en espérant que je sois assez clair.
Sylvain
Le but de mon programme est le suivant:
je dispose de données de la forme suivante:
libellé | val 1 | val 2
1 | xxx | xxx
1 | xxx | xxx
1 | xxx | xxx
1 | xxx | xxx
2 | xxx | xxx
2 | xxx | xxx
2 | xxx | xxx
2 | xxx | xxx
3 | xxx | xxx
3 | xxx | xxx
3 | xxx | xxx
3 | xxx | xxx
. | xxx | xxx
. | xxx | xxx
. | xxx | xxx
n | xxx | xxx
n | xxx | xxx
n | xxx | xxx
n | xxx | xxx
Et moi pour les traiter il me faut ceci :
............1......| ......... 2 ..... | ......... 3 ..... |...| ......... n
val 1 | val 2 | val 1 | val 2 | val 1 | val 2 |...| val | val 2
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
xxxx | xxxx | xxxx | xxxx | xxxx | xxxxx |...| xxxx |xxx
voila pourquoi je veux faire ça.
en espérant que je sois assez clair.
Sylvain
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 313
18 mai 2011 à 17:36
18 mai 2011 à 17:36
Pour ce qui est du v il peut être beaucoup plus important c'est pour ça que j'ai mis single.
!!!!!
Regarde donc la définition de single...
essaies déjà ce que je t'ai donné
pour l'instant je ne bouge pas car si n=4 on boucle 4 fois(x=1 to n) donc sur 2* 4000 cellules (y=1 to v) avec v=1000*n, ce qui parait bizarre 64000 cellules à affecter (source et cible)...
t'es sûr ?
!!!!!
Regarde donc la définition de single...
essaies déjà ce que je t'ai donné
pour l'instant je ne bouge pas car si n=4 on boucle 4 fois(x=1 to n) donc sur 2* 4000 cellules (y=1 to v) avec v=1000*n, ce qui parait bizarre 64000 cellules à affecter (source et cible)...
t'es sûr ?
Msylvain
Messages postés
10
Date d'inscription
jeudi 28 avril 2011
Statut
Membre
Dernière intervention
19 mai 2011
Modifié par Msylvain le 19/05/2011 à 10:19
Modifié par Msylvain le 19/05/2011 à 10:19
Bonjour,
Désolé je ne suis pas retourné sur internet dans la soirée.
J'ai essayé ce que tu m'as mis dans ton 1er poste cela fonctionne très bien est c'est très rapide j'avais pensé faire ça un moment aussi mais je l'avais mal écris du coup ça n'avait pas fonctionné ^^.
Pour ce qui est de la variable v au lieu de dire ça de cette façon
Regarde donc la définition de single...
Dis moi plutôt où il y a un problème et ce qui ne va pas je suis pas expert en VBA et je suis la pour apprendre donc des erreurs je pense qu'il est normal d'en faire.
Voici le nouveau code qui est plus rapide:
En tout cas merci pour l'autre réponse et en attente de la suivante.
Cdt
Sylvain
Désolé je ne suis pas retourné sur internet dans la soirée.
J'ai essayé ce que tu m'as mis dans ton 1er poste cela fonctionne très bien est c'est très rapide j'avais pensé faire ça un moment aussi mais je l'avais mal écris du coup ça n'avait pas fonctionné ^^.
Pour ce qui est de la variable v au lieu de dire ça de cette façon
Regarde donc la définition de single...
Dis moi plutôt où il y a un problème et ce qui ne va pas je suis pas expert en VBA et je suis la pour apprendre donc des erreurs je pense qu'il est normal d'en faire.
Voici le nouveau code qui est plus rapide:
Application.ScreenUpdating = False For x = 1 To n w = 2 For y = 1 To v If Sheets("feuil1").Range("A" & y) = x Then Sheets("feuil3").Cells(w, 2 + 3 * (x - 1)) = Sheets_ ("feuil1").Cells(y, "B").Value Sheets("feuil3").Cells(w, 3 + 3 * (x - 1)) = Sheets_ ("feuil1").Cells(y, "C").Value w = w + 1 End If Next y Next x
En tout cas merci pour l'autre réponse et en attente de la suivante.
Cdt
Sylvain
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 313
19 mai 2011 à 10:28
19 mai 2011 à 10:28
Extrait de l'aide XL (si,si, ca sert en appuyant sur F1)
tu imprimes ce laïus et tu le gardes sous le coude
Byte :
utilisé pour stocker des nombres entiers positifs compris entre 0 et 255.
Les variables de type Byte sont stockées sous la forme de nombres uniques codés sur 8 bits (1 octet), sans signe .
Boolean :
données pouvant prendre exclusivement les valeurs True (-1) et False (0).
Les variables Boolean sont stockées sous la forme de nombres codés sur 16 bits (2 octets).
Integer :
données contenant des nombres entiers stockés sous forme d'entiers de 2 octets compris entre -32 768 et 32 767.
Le type de données Integer permet également de représenter des valeurs énumérées. Dans Visual Basic, le signe % est le caractère de déclaration du type Integer .
Long :
Nombre entier codé sur 4 octets(32 bits) et dont la valeur est comprise entre -2 147 483 648 et 2 147 483 647.
Dans Visual Basic, le signe et commercial (&) est le caractère de déclaration du type Long.
Currency :
données stockées sous la forme de nombres de 64 bits (8 octets) au format entier, dont la plage de valeurs s'étend de -922 337 203 685 477,5808 à 922 337 203 685 477,5807.
Ce type de données est utilisé dans les calculs monétaires ou dans les calculs à virgule fixe pour lesquels une grande précision est requise. Le signe @ est le caractère de déclaration du type Currency.
Single :
Type de données qui regroupe des variables à virgule flottante en simple précision
sous forme de nombres à virgule flottante codés sur 32 bits (4 octets),dont la valeur est comprise entre -3,402823E38 et -1,401298E-45 pour les valeurs négatives ,et entre 1,401298E-45 et 3,402823E38 pour les valeurs positives.
Dans Visual Basic, le point d'exclamation (!) est le caractère de déclaration du type Single.
Double :
Type de données stockant sur 64 bits les nombres à virgule flottante en double précision compris entre -1,79769313486231E308 et -4,94065645841247E-324 pour les valeurs négatives, et entre 4,94065645841247E-324 et 1,79769313486232E308 pour les valeurs positives.
Dans Visual Basic, le signe dièse (#) est le caractère de déclaration du type Double.
Date :
Type de données utilisé pour stocker les dates et les heures sous la forme d'un nombre réel codé sur 64 bits (8 octets). La partie située à gauche du séparateur décimal représente la date, et la partie droite l'heure.
String :
Type de données composé d'une séquence de caractères contigus interprétés en tant que caractères et non en tant que valeurs numériques.
Une donnée de type String peut inclure lettres, nombres, espaces et signes de ponctuation.
Le type de données String peut stocker des chaînes de longueur fixe dont la longueur est comprise entre 0 et environ 63 Ko de caractères et des chaînes dynamiques dont la longueur est comprise entre 0 et environ 2 milliards de caractères.
Dans Visual Basic, le signe dollar ($) est le caractère de déclaration du type String.
Object :
Type de données représentant toute référence Object. Les variables Object sont stockées sous forme d'adresses codées sur 32 bits (4 octets) faisant référence à des objets.
Variant :
Type de données particulier pouvant contenir des données numériques, des chaînes ou des dates, des types définis par l'utilisateur ainsi que les valeurs spéciales Empty et Null.
Le type de données Variant est doté d'une taille de stockage numérique de 16 octets et peut contenir la même plage de données que le type Decimal, ou d'une taille de stockage de caractère de 22 octets (plus la longueur de la chaîne) ; dans ce dernier cas, il peut stocker tout texte.
IMPORTANT :
Toutes les variables sont converties en type Variant si aucun autre type de données n'est explicitement déclaré.
TRES IMPORTANT :
En cas de déclaration de plusieurs variables avec le meme Dim , il faut indiquer le type de donnee pour chaque variable .
Si pour definir les variables Xld1 , Xld2 et Xld3 vous écrivez par exemple :
Dim Xld1 , Xld2 , Xld3 As String
Dans ce cas Xld1 et Xld2 seront de type Variant . Pour y remédier Il faut écrire :
Dim Xld1 As String , Xld2 As String , Xld3 As String
Option Explicit
Inserez l'instruction Option Explicit en tout début de procédure .
Grâce à cette instruction, vous aurez un message d'erreur pour toute variable non définie, ou mal orthographiée.
Il est conseillé d'avoir une majuscule dans la variable déclarée : Ensuite lors de la saisie de la variable dans la macro , celle-ci reprendra automatiquement la majuscule : cela permet de vérifier les fautes d'orthographe éventuelles .
tu imprimes ce laïus et tu le gardes sous le coude
Byte :
utilisé pour stocker des nombres entiers positifs compris entre 0 et 255.
Les variables de type Byte sont stockées sous la forme de nombres uniques codés sur 8 bits (1 octet), sans signe .
Boolean :
données pouvant prendre exclusivement les valeurs True (-1) et False (0).
Les variables Boolean sont stockées sous la forme de nombres codés sur 16 bits (2 octets).
Integer :
données contenant des nombres entiers stockés sous forme d'entiers de 2 octets compris entre -32 768 et 32 767.
Le type de données Integer permet également de représenter des valeurs énumérées. Dans Visual Basic, le signe % est le caractère de déclaration du type Integer .
Long :
Nombre entier codé sur 4 octets(32 bits) et dont la valeur est comprise entre -2 147 483 648 et 2 147 483 647.
Dans Visual Basic, le signe et commercial (&) est le caractère de déclaration du type Long.
Currency :
données stockées sous la forme de nombres de 64 bits (8 octets) au format entier, dont la plage de valeurs s'étend de -922 337 203 685 477,5808 à 922 337 203 685 477,5807.
Ce type de données est utilisé dans les calculs monétaires ou dans les calculs à virgule fixe pour lesquels une grande précision est requise. Le signe @ est le caractère de déclaration du type Currency.
Single :
Type de données qui regroupe des variables à virgule flottante en simple précision
sous forme de nombres à virgule flottante codés sur 32 bits (4 octets),dont la valeur est comprise entre -3,402823E38 et -1,401298E-45 pour les valeurs négatives ,et entre 1,401298E-45 et 3,402823E38 pour les valeurs positives.
Dans Visual Basic, le point d'exclamation (!) est le caractère de déclaration du type Single.
Double :
Type de données stockant sur 64 bits les nombres à virgule flottante en double précision compris entre -1,79769313486231E308 et -4,94065645841247E-324 pour les valeurs négatives, et entre 4,94065645841247E-324 et 1,79769313486232E308 pour les valeurs positives.
Dans Visual Basic, le signe dièse (#) est le caractère de déclaration du type Double.
Date :
Type de données utilisé pour stocker les dates et les heures sous la forme d'un nombre réel codé sur 64 bits (8 octets). La partie située à gauche du séparateur décimal représente la date, et la partie droite l'heure.
String :
Type de données composé d'une séquence de caractères contigus interprétés en tant que caractères et non en tant que valeurs numériques.
Une donnée de type String peut inclure lettres, nombres, espaces et signes de ponctuation.
Le type de données String peut stocker des chaînes de longueur fixe dont la longueur est comprise entre 0 et environ 63 Ko de caractères et des chaînes dynamiques dont la longueur est comprise entre 0 et environ 2 milliards de caractères.
Dans Visual Basic, le signe dollar ($) est le caractère de déclaration du type String.
Object :
Type de données représentant toute référence Object. Les variables Object sont stockées sous forme d'adresses codées sur 32 bits (4 octets) faisant référence à des objets.
Variant :
Type de données particulier pouvant contenir des données numériques, des chaînes ou des dates, des types définis par l'utilisateur ainsi que les valeurs spéciales Empty et Null.
Le type de données Variant est doté d'une taille de stockage numérique de 16 octets et peut contenir la même plage de données que le type Decimal, ou d'une taille de stockage de caractère de 22 octets (plus la longueur de la chaîne) ; dans ce dernier cas, il peut stocker tout texte.
IMPORTANT :
Toutes les variables sont converties en type Variant si aucun autre type de données n'est explicitement déclaré.
TRES IMPORTANT :
En cas de déclaration de plusieurs variables avec le meme Dim , il faut indiquer le type de donnee pour chaque variable .
Si pour definir les variables Xld1 , Xld2 et Xld3 vous écrivez par exemple :
Dim Xld1 , Xld2 , Xld3 As String
Dans ce cas Xld1 et Xld2 seront de type Variant . Pour y remédier Il faut écrire :
Dim Xld1 As String , Xld2 As String , Xld3 As String
Option Explicit
Inserez l'instruction Option Explicit en tout début de procédure .
Grâce à cette instruction, vous aurez un message d'erreur pour toute variable non définie, ou mal orthographiée.
Il est conseillé d'avoir une majuscule dans la variable déclarée : Ensuite lors de la saisie de la variable dans la macro , celle-ci reprendra automatiquement la majuscule : cela permet de vérifier les fautes d'orthographe éventuelles .
bonjour michel_m,
j'ai une question à propos de la déclaration de variables : en quoi est ce que cela influe sur la vitesse de calcul ? en admettant par exemple que je déclare en Double une variable qui ne nécessite que du Long ou du Single.
est-ce au niveau de la mémoire tampon/vive nécessaire du fait de la taille en octets propre à chaque type de variable ?
merci d'avance !
cordialement,
ed
j'ai une question à propos de la déclaration de variables : en quoi est ce que cela influe sur la vitesse de calcul ? en admettant par exemple que je déclare en Double une variable qui ne nécessite que du Long ou du Single.
est-ce au niveau de la mémoire tampon/vive nécessaire du fait de la taille en octets propre à chaque type de variable ?
merci d'avance !
cordialement,
ed
michel_m
Messages postés
16602
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 313
Modifié par michel_m le 19/05/2011 à 14:00
Modifié par michel_m le 19/05/2011 à 14:00
bonjour,
le bon type permet de réserver de la RAM au plus juste nécessaire :économie de RAM et gain de rapidité
Au départ du temps de Q ou GWbasic, on ne déclarait pas les variables, les capacités mémoires était + que réduites et beaucoup + lentes avec quelques Kilo-octets et moins d'un kio-hertz, et il lui était reproché ce fait (ainsi que le b.... des goto.)
maintenant, l'option explicit (oblige à déclarer les variables) reste optionnelle compte tenu des progrès technologiques. d'autres langages comme le pHp ne déclarent pas.
L'avantage principal est qu'il permet de traquer les fautes d'orthographe dans une variable ( plantage du prog)et les fausses-vraies variables comme les variables temporaires de test du programme souvent oubliées à la remise de l'appli. de m^me qu'une majuscule permet aussi de vérifier l'orthographe "à la volée"
De m^me, bien que cela soit souvent utilisé comme dans le programme de sylvain, il est déconseillé d'utiliser une lettre unique comme variable (à part i, j, k tolérés pour des compteurs de boucle et encore) car difficilement lisible ("col" pour colonne est + lisible que "c" par ex) et il est pratiquement impossible de modifier la lettre (essaies pour voir avec la fonction remplacer du VBE par ex "i" par "jojo"...). il est ainsi conseillé des variables à 3 lettres minimum
Le but étant d'appliquer la règle d'or d'une appli: "une appli est bonne lorsqu'elle facilement compréhensible, modifiable et prévue pour une évolution"
le bon type permet de réserver de la RAM au plus juste nécessaire :économie de RAM et gain de rapidité
Au départ du temps de Q ou GWbasic, on ne déclarait pas les variables, les capacités mémoires était + que réduites et beaucoup + lentes avec quelques Kilo-octets et moins d'un kio-hertz, et il lui était reproché ce fait (ainsi que le b.... des goto.)
maintenant, l'option explicit (oblige à déclarer les variables) reste optionnelle compte tenu des progrès technologiques. d'autres langages comme le pHp ne déclarent pas.
L'avantage principal est qu'il permet de traquer les fautes d'orthographe dans une variable ( plantage du prog)et les fausses-vraies variables comme les variables temporaires de test du programme souvent oubliées à la remise de l'appli. de m^me qu'une majuscule permet aussi de vérifier l'orthographe "à la volée"
De m^me, bien que cela soit souvent utilisé comme dans le programme de sylvain, il est déconseillé d'utiliser une lettre unique comme variable (à part i, j, k tolérés pour des compteurs de boucle et encore) car difficilement lisible ("col" pour colonne est + lisible que "c" par ex) et il est pratiquement impossible de modifier la lettre (essaies pour voir avec la fonction remplacer du VBE par ex "i" par "jojo"...). il est ainsi conseillé des variables à 3 lettres minimum
Le but étant d'appliquer la règle d'or d'une appli: "une appli est bonne lorsqu'elle facilement compréhensible, modifiable et prévue pour une évolution"