Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

optimiser macro lente

simple

XLDnaute Nouveau
Bonjour à tous,
suite a un précédent post ou je demandais comment placer un point sur une image, j'ai aujourd'hui terminé une programmation stable mais à mon gout un peu lente.

Explication de la macro.
Sur une première feuille excel j'ai environ 600 lignes à traiter (soit 600 futures points placés)
je fais actuellement une boucle "for" dans laquelle en fonction d'un valeur de cellule je choisi la couleur du point à placer.
Pour se faire je n'ai pas réussi à faire plus simple que cela:

à chaque points (répété 600 fois)
j’exécute ceci
Code:
Sheets(count).Activate
    ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, L, T, w, H).Select
    With Selection
    .Name = "defect_x" & x - 1
    .ShapeRange.Fill.ForeColor.RGB = RGB(rouge(k), vert(k), bleu(k))
    End With
Pour pouvoir adapter la couleur, je lance 3 fonctions rouge(), vert(), bleu() dans lequel je place l'argument qui permettra de choisir la couleur.



exemple de la fonction vert()
Code:
Function vert(ByVal k As String) As Integer
    vert = 242
    If k = "B" Then
    vert = 215
    End If
    If k = "F" Or k = "D" Then
    vert = 0
    End If
End Function

Auriez vous une solution qui me permettrait de ne lancer qu'une seule fonction qui renvoi dans le bon format les 3 valeurs RGB.
J'économiserai déjà 2*600 appels de fonction inutile.



2ieme questions:
Dans cette boucle for j'ai des conditions if. Est il plus rapide de faire cela:

Code:
If GagnerTps_cote = "LH" And GagnerTps_board = "Outboard" Then
        count = 4
    End If
    If GagnerTps_cote = "LH" And GagnerTps_board = "Inboard" Then
        count = 5
    End If
    If GagnerTps_cote = "RH" And GagnerTps_board = "Outboard" Then
        count = 6
    End If
    If GagnerTps_cote = "RH" And GagnerTps_board = "Inboard" Then
        count = 7
    End If

ou cela

Code:
If GagnerTps_cote = "LH"  Then
if GagnerTps_board = "Outboard" then
        count = 4
else
count=5
end if

    If GagnerTps_cote = "RH" then
if GagnerTps_board = "Outboard" Then
        count = 6
else
count=7
    End If
    If GagnerTps_cote = "RH" And GagnerTps_board = "Inboard" Then
        count = 7
    End If

D'avance merci à vous
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : optimiser macro lente

Bonjour
Deja vite fait , ajoute au début de ta SUb :
Application.screenupdating = False ( remettre a True a la fin)
J'ai une macro qui balaye 500 lignes et appelle 2 fonctions entre temps
J'ai Chronometré , ca divise par 3 le tps
 

simple

XLDnaute Nouveau
Re : optimiser macro lente

Merci herve62,
mais c'est dejà fait.

J'utilise aussi un maximum de with selection end with, je mets en variable un maximum de donnés au lieu de chercher des sheets(1).range("").value.
 

MJ13

XLDnaute Barbatruc
Re : optimiser macro lente

Bonjour Simple, Hervé

Sur XLD, avec un fichier sans données confidentielles, avec juste le problème à résoudre, c'est quand même plus simple pour aider.
 

Pierrot93

XLDnaute Barbatruc
Re : optimiser macro lente

Bonjour,

essaye peut être avec ceci :
Code:
With Application
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With
'ton code
With Application
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
    .ScreenUpdating = True
End With

A noter également que les "select" et autres "activate" sont rarement utiles en vba et ralentissent considérablement l'exécution du code.

bonne journée
@+
 

ya_v_ka

XLDnaute Impliqué
Re : optimiser macro lente

Hello

Et comme ça peut-être :

If GagnerTps_cote = "LH" Then
If GagnerTps_board = "Outboard" then
count = 4
else
count=5
end if
Else
If GagnerTps_board = "Outboard" Then
count = 6
else
count=7
End If
End If

S'il n'y a rien d'autre que LH, RH, Outboard et Inboard ça devrait jouer...

Ya'v
 

ya_v_ka

XLDnaute Impliqué
Re : optimiser macro lente

Hello

Une autre approche :

count = 4
If GagnerTps_cote = "RH" then
count = count + 2
end if
If GagnerTps_board = "Outboard" Then
count = count + 1
End If


S'il n'y a rien d'autre que LH, RH, Outboard et Inboard ça devrait jouer...

Ya'v
 

tototiti2008

XLDnaute Barbatruc
Re : optimiser macro lente

Bonjour simple, Bonjour hervé62, bonjour Michel , bonjour Pierrot , Bonjour ya_v_ka

peut-être

Code:
count = 1 - (GagnerTps_cote = "LH") * 2 - (GagnerTps_cote = "RH") * 4 - (GagnerTps_board = "Outboard") - (GagnerTps_board = "Inboard") * 2
 

Discussions similaires

Réponses
0
Affichages
206
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…