[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
Bonjour,

J'ai réalisé une macros qui permet a partir de données qui sont dans une même colonne (dans la feuille 1), de les restituer dans des colonnes côte à côte (dans la feuille 3). Mais la macros comprend deux boucle for et mon problème est de trouver un moyen d'accélérer le processus car le résultat est bon mais c'est vraiment trop lent..

voici le code de la macros que j'ai réalisé:

Option Explicit
 Sub copiedonnées()

    Dim v As Single
    Dim x As Integer
    Dim y As Integer
    Dim n As Integer
    Dim w As Integer
    
    n = InputBox("nombre de boucles")
    v = 1000 * n
    
    For x = 1 To n
    
        w = 2
        
        For y = 1 To v
            
            If Sheets("feuil1").Range("A" & y) = x Then
                
                Sheets("feuil1").Range("B" & y).Copy
                Sheets("feuil3").Select
                Cells(w, 2 + 3 * (x - 1)).Select
                ActiveSheet.Paste
                Sheets("feuil1").Range("C" & y).Copy
                Sheets("feuil3").Select
                Cells(w, 3 + 3 * (x - 1)).Select
                ActiveSheet.Paste
                w = w + 1
                
            End If
            
        Next y
    
    Next x
    
End Sub


Merci d'avance de votre aide!!

Sylvain

A voir également:

3 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
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?
0
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
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
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 ?
0
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
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:



    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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
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 .
0
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
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"
0
impeccable, merci pour la précision !
0