begin process at 2012 02 17 11:05:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Divers

 > 

Débutants

 > 

Optimisation code VBA pour remplissage d'une page


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Optimisation code VBA pour remplissage d'une page

mardi 23 juin 2009 à 04:26:46 | Optimisation code VBA pour remplissage d'une page

violette42

Bonjour,

je suis novice en developpement dans VBA pour Excel et j'ai un probleme de temps de traitement sur le code suivant:

1) Je fais mes calculs a partir des donnees de ma page (code sans grande importance, je pense, car le temps de traitement est OK pour cette partie):

        Dim i, j, k As Integer
        Dim NOMX As Variant
        Dim nomy As Variant
        Dim TABprev(300, 300) As Variant
     
    For i = 3 To 173
        For j = 8 To 64
        NOMX = Cells(i, j).Value
        nomy = 0
        l = Int((j - 8) / 3)
            For v = 65 + l To 83
                If NOMX > 1 And l < 18 Then
                    NOMX = NOMX - 1
                    nomy = nomy + Cells(i, v + 1).Value
                Else
                    nomy = Round(nomy + NOMX * Cells(i, v + 1).Value)
                    NOMX = 0
                    Exit For
                End If
            Next v
        TABprev(i, j + 76) = nomy
      Next j
    Next i

2) Puis, comme je recupere tous mes resultats de calcul dans le tableau TABprev, je voudrais les reinscrire dans ma page dans des cellules precises:

    For i = 3 To 173
      For j = 84 To 140
        Cells(i, j) = TABprev(i, j)
      Next j
    Next i

... Et la, probleme, le temps de traitement explose (plus de 200min pour remplir 10000 cellules, sans le moindre calcul!!!). Mon code doit vraiment etre mauvais et je ne sais pas comment l'ameliorer (je code habituellement pour Access ou je n'ai aucun probleme de ce genre...)

Merci d'avance pour votre aide et desolee de vous deranger pour un probleme surement tres mineur...


Violette

mardi 23 juin 2009 à 11:17:27 | Re : Optimisation code VBA pour remplissage d'une page

Mayzz

Membre Club
Bonjour,

As-tu essayé en remplissant tes cellules directement dans ta première boucle ? Cela peut te faire gagner un peu de temps...

En même temps tu rempli un grand nombre de cellules, il est normal que cela prenne du temps. Tu passe par  une double boucle et un tableau à deux dimensions pour ton remplissage, cela aussi est assez lent, si tu le faisait avec une simple boucle et un tableau à une dimension, tu aurais forcément un traitement pour retrouver les coordonnées de ta cellule, je ne sais pas vraiment su tu gagnerais au change...

@+ Mayzz.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
<

mardi 23 juin 2009 à 11:34:31 | Re : Optimisation code VBA pour remplissage d'une page

pile_poil

Membre Club
ton TABprev étant dimmensioné 300 par 300
tu peux le copier en une seule ligne de code
en faisant comme ceci :
Range(Cells(3, 84), Cells(303, 384) = TABprev()

cette opération prend moins d'une seconde quelque soit la taille

si c'est la solution, penser : REPONSE ACCEPTEE
mardi 23 juin 2009 à 15:27:42 | Re : Optimisation code VBA pour remplissage d'une page

bigfish_le vrai

Membre Club
Salut,

tu en fais, quoi de cette variable tableau TABprev ? est-ce pour transféré des données d'une feuille à une autre ?

si oui ceci devrait faire l'affaire:

ici je suppose que tu travails sur 2 feuilles distincte

1er exemple la plage de destination est srictement placé au meme endroit que la plage source mais dans une autre feuille (evidemment):
Sheets("Feuille Destination").Range(Cells(3,84),Cells(173,140)).Value = Sheets("Feuille Source").Range(Cells(3,84),Cells(173,140)).Value

2ieme exemple la plage de destination est placé differemment:
Dim MaPlageSource As Range, MaplageDestination As Range
With Worksheets("Feuille Source")
    Set MaPlageSource = .Range(.Cells(3, 84), .Cells(173, 140))
End With
With Worksheets("Feuille Destination")
    Set MaplageDestination = .Range(.Cells(1, 1), .Cells(MaPlageSource.Rows.Count, MaPlageSource.Columns.Count))
End With
MaplageDestination.Value = MaPlageSource.Value

2ieme exemple (bis)
Dim MaPlageSource As Range
With Worksheets("Feuille Source")
    Set MaPlageSource = .Range(.Cells(2, 2), .Cells(5, 5))
End With
MaPlageSource.Copy Destination:=Worksheets("Feuille Destination").Range("A1")

Note que ce type de declaration Dim i, j, k As Integer ne fonctionne pas ! En effet ici seul k est declaré en integer les autres sont Variant.
La bonne methode est :

Dim i As Integer, j As Integer, etc

A+

jeudi 25 juin 2009 à 04:38:40 | Re : Optimisation code VBA pour remplissage d'une page

violette42

Bonjour Mayzz,

en fait, j'ai deja essaye de mettre le remplissage des cellules directement dans la boucle de calcul, mais ca ne change pas grand chose au temps de traitement... Je pensais que sortir cette partie permettrait meme de le diminuer, mais visiblement non.

Je vais essayer avec un tableau a un dimension.

Merci pour ton aide, je te tiens au courant.

Violette

jeudi 25 juin 2009 à 04:45:15 | Re : Optimisation code VBA pour remplissage d'une page

violette42

Bonjour Pile_poil,

je crois qu'avec ta methode j'y suis presque, ca tourne effectivement tres vite, mais, j'ai rien qui s'affiche dans les cases specifiees dans Range.

Or, j'ai bien verifie que mon tableau TABprev etait bien rempli. Et si je fais un truc du genre:

Range(Cells(3, 84), Cells(303, 384)) = TABprev(3, 84)

ca marche, en 1 sec, mais j'ai toutes mes cellules remplies avec la valeur de TABprev(3, 84), ce qui est logique, mais pas ce dont j ai besoin... Bref, on n'est pas loin, mais le TABprev() ne semble pas ecrire les valeurs...
Je continue dans cette direction. Si tu as une idee du pourquoi et ce que je peux faire, merci d'avance!



Violette

jeudi 25 juin 2009 à 04:53:32 | Re : Optimisation code VBA pour remplissage d'une page

violette42

Bonjour Bigfish,

cette variable TABprev est un tableau intermediaire dans lequel je place les resultats d'un calcul un peu complique qui prend en entree des valeurs de cette meme page. Ce calcul 'un peu complique' se trouve dans la partie 1) de mon code et le remplissage avec les resultats, dans la meme page, avec les valeurs calculees dans la partie 1), se trouve dans la partie 2). Je ne transfers donc pas des donnees d'une zone a une autre.

Maintenant, peut-etre que la solution de placer mes resultats dans un tableau intermediaire n'est pas la meilleure (j'ai l'habitude de faire comme ca quand je code pour Access, mais c'est peut-etre une mauvaise habitude ) , s'il y a une autre facon d'inscrire directement les resultats dans les cellules cibles, je suis preneuse...

Merci pour le conseil sur les declarations (quand je parlais de mauvaises habitudes...  )


Violette



Cette discussion est classée dans : code, to, for, nomx, nomy


Répondre à ce message

Sujets en rapport avec ce message

Code pour animer un textBox [ par GigaCool ] Bonjour , Quelqu'un pourait il m'aider à m'ensortir car j'y arrive pas! J'ai un textBox à qui je veux attribuer des valeurs différentes à  chaque minu stp format de email vb6 [ par kamalsw ] je veux une methode  pour la sasie de la formt de l'emailje deja fait cette methode mais ca marche pas autre methode svp If Txt6.Text = "" Then        Tableau [ par Glaudiuus ] Bonjour, J'essay de faire un tableau à deux dimensions qui me place 5 fois une série de 4 nombre 1, j'ai fait un petit programme mais bon  il me fait Genrerer un calendrier sportif aléatoirement [ par HiKwesT ] Bonjour,Aprés 3 journées a retourner le probleme dans tout les sens, je m'en remet a vous "VBFrançiens" et a votre logiqueJe souhaite pour ma PTI de f For i = 1 To 18 [ par petiflamand ] Y a t-il une possibiliter de faire ceci, j' ai une erreur car rs!bouton & i ne fonctionne pas. Merci If rs.RecordCount > 0 Then rs.MoveFirst Do Unti VBA Envoi de mail avec Lotus Notes V7 - Problème de password [ par saliardp ] Bonjour,Je développe actuellement un outil Access qui génère des rapports Excel qui doivent être envoyés à plusieurs destinataires. J'essaie d'automat VB.Net. Problème avec le DEBUG [ par JeffC1977 ] Salut à tous...J'ai toujours utilisé le Debug sans problème. Dans mon code que je travaille depuis quelques mois, je n'ai jamis eu de problème...Mais [VBA Excel] [ par Nyck0las ] bonjour,j'ai quelques problèmes pour réaliser une macro avec du calcul matriciel.voici une sub qui calcule le produit A*B et le met dans C :Sub PMAT(A Probleme avec DirectInput [ par spider987 ] Bonjour à toutes et à tous,je code en ce moment un petit jeu pour m'initier a directX en VB6 ( je sais .NET c mieu et tout lol mais j'ai que cette lic


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales